归因脚本

通过轻量客户端脚本追踪你的收入来源。

归因脚本用于收集访客上下文信息(UTM 参数、来源页、设备信息),并存储在 Cookie 中。当客户结账时,你将这些数据作为结账 metadata 传递,Money Fast 就能将每笔订单归因到对应的流量来源。

第一步:安装脚本

在你网站的 <head> 中添加以下脚本标签:

<script defer data-website-id="YOUR_SITE_ID" src="https://moneyfa.st/js/script.min.js"></script>

YOUR_SITE_ID 替换为你的实际 Site ID,可以在 Money Fast 仪表盘的网站 设置 页面找到。

脚本非常轻量(gzip 后约 1KB),异步加载,会设置一个名为 _moneyfast 的 Cookie 来存储归因数据。Cookie 有效期 30 天,当访客携带新的 UTM 参数访问时会自动刷新。

调试模式

想查看脚本收集了什么数据,可以启用调试模式:

<script defer data-website-id="YOUR_SITE_ID" data-debug="true" src="https://moneyfa.st/js/script.min.js"></script>

打开浏览器开发者控制台,可以看到 [MoneyFast] 开头的日志信息。

第二步:在结账时传递 Metadata

创建结账会话时,读取 Cookie 并将其值作为 metadata 传递。以下以 Stripe 为例,其他支付平台类似。

Stripe — Node.js / Next.js 示例

import Stripe from 'stripe';

const stripe = new Stripe(process.env.STRIPE_SECRET_KEY);

// 从请求头解析 _moneyfast cookie
function getMoneyFastMeta(cookieHeader) {
  const match = cookieHeader?.match(/(^| )_moneyfast=([^;]+)/);
  if (!match) return {};
  try {
    return JSON.parse(decodeURIComponent(match[2]));
  } catch {
    return {};
  }
}

// 创建 Checkout Session
export async function createCheckout(req) {
  const meta = getMoneyFastMeta(req.headers.get('cookie'));
  // 添加 exit_page,移除内部字段
  meta.moneyfast_exit_page = new URL(req.url).pathname;
  delete meta.moneyfast_ts;

  const session = await stripe.checkout.sessions.create({
    mode: 'subscription', // 或 'payment'
    line_items: [{ price: 'price_xxx', quantity: 1 }],
    success_url: 'https://example.com/success',
    cancel_url: 'https://example.com/cancel',
    // 传递 metadata 到 checkout session
    metadata: meta,
    // 订阅类产品还需要传到 subscription_data
    subscription_data: {
      metadata: meta,
    },
  });

  return session.url;
}

客户端(浏览器)示例

如果你从前端创建结账会话,可以使用全局的 MoneyFast.meta() 方法:

const response = await fetch('/api/create-checkout', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    priceId: 'price_xxx',
    // 传递 MoneyFast 归因 metadata
    metadata: window.MoneyFast?.meta() || {},
  }),
});

然后在服务端,将 metadata 合并到结账会话中:

const session = await stripe.checkout.sessions.create({
  // ...其他选项
  metadata: req.body.metadata,
  subscription_data: {
    metadata: req.body.metadata,
  },
});

Metadata 字段说明

所有字段使用 moneyfast_ 前缀。Money Fast 会自动从支付事件的 metadata 中读取这些数据。

字段说明来源
moneyfast_ref流量来源utm_sourcerefvia 查询参数
moneyfast_campaign营销活动utm_campaign 查询参数
moneyfast_medium流量媒介utm_medium 查询参数
moneyfast_term搜索关键词utm_term 查询参数
moneyfast_content广告内容utm_content 查询参数
moneyfast_landing_page着陆页自动检测
moneyfast_exit_page结账页面MoneyFast.meta() 设置
moneyfast_referrer来源 URL自动检测
moneyfast_device设备类型desktopmobiletablet
moneyfast_browser浏览器自动检测
moneyfast_os操作系统自动检测
moneyfast_lang浏览器语言自动检测
moneyfast_tz时区自动检测

JavaScript API

脚本暴露了一个全局的 MoneyFast 对象:

// 获取 Cookie 中的原始归因数据
MoneyFast.get()

// 获取用于结账的 metadata(添加 exit_page,移除内部字段)
MoneyFast.meta()

// 手动重新收集归因数据
MoneyFast.collect()

// 清除归因 Cookie
MoneyFast.clear()

注意事项

  • 订阅 metadata(Stripe):Stripe 不会自动将结账会话的 metadata 传递到订阅对象。你必须显式设置 subscription_data.metadata,否则续费事件将缺失归因数据。
  • Cookie 作用域_moneyfast Cookie 设置在你的域名下,使用 SameSite=Lax。它在你网站的所有页面上有效,但不会跨域追踪。
  • 无 PII:脚本不收集任何个人身份信息,只捕获 UTM 参数、页面 URL 和设备/浏览器信息。

AI Agent 集成 Prompt

复制以下 prompt,粘贴给你的 AI 编码助手(Cursor、Claude Code、Windsurf 等),即可正确集成 Money Fast 归因追踪。

将 Money Fast (moneyfa.st) 收入归因追踪集成到本项目中。请严格按照以下指令操作。

## 1. 安装追踪脚本

**方式 A:npm 包(推荐 Next.js / React 项目)**

```bash
npm i analytics-script
```

```tsx
// app/layout.tsx(或 _app.tsx 等)
import { MoneyFast } from 'analytics-script';

// 在 <head> 中添加 <MoneyFast websiteId="YOUR_SITE_ID" />
```

**方式 B:Script 标签(任意网站)**

在网站的 `<head>` 中添加脚本标签(根 layout、_app、index.html 等):

```html
<script defer data-website-id="YOUR_SITE_ID" src="https://moneyfa.st/js/script.min.js"></script>
```

`YOUR_SITE_ID` 替换为 Money Fast 仪表盘设置页面中的 Site ID。

## 2. 将归因数据传递到 Stripe Checkout metadata

找到创建 Stripe Checkout Session 的代码,添加 MoneyFast 归因 metadata。

### 如何读取 Cookie

**如果使用 npm 包**,可以直接用辅助函数:

```js
import { getMoneyFastMeta } from 'analytics-script';
const meta = getMoneyFastMeta(); // 客户端调用,返回可直接传给 Stripe 的 metadata
```

**如果使用 script 标签**,脚本会设置一个 `_moneyfast` Cookie,读取方式:

```js
JSON.parse(decodeURIComponent(cookieValue))
```

### ⚠️ 关键:不要添加 `moneyfast_` 前缀

Cookie 中的 key 已经包含 `moneyfast_` 前缀。Cookie 内容如下:

```json
{ "moneyfast_ref": "google", "moneyfast_device": "desktop", "moneyfast_browser": "Chrome", "moneyfast_os": "Windows", "moneyfast_landing_page": "/", "moneyfast_ts": 1710000000 }
```

直接使用这些 key。如果你再加一层 `moneyfast_` 前缀,key 会变成 `moneyfast_moneyfast_device`,所有归因数据将会丢失。

```js
// ❌ 错误
meta[`moneyfast_${key}`] = value;

// ✅ 正确
meta[key] = value;
```

### 需要过滤的内容

- 排除 `moneyfast_ts`(内部时间戳,metadata 不需要)
- 添加 `moneyfast_exit_page` = 结账时的当前页面路径(从客户端通过 `window.location.pathname` 获取)
- 只包含 Cookie 中的 string 类型值

### metadata 传递位置

根据结账模式,将 metadata 传递到以下所有位置:

- `metadata` — 必须(checkout session 本身)
- `subscription_data.metadata` — 如果 mode 为 `subscription`(Stripe 不会自动将 session metadata 传播到订阅对象)
- `payment_intent_data.metadata` — 如果 mode 为 `payment` 且启用了 `invoice_creation`

## 3. 自定义事件(可选)

脚本还支持追踪前端自定义事件:

```js
MoneyFast.track('signup_click')
MoneyFast.track('pricing_view')
```

事件名称:仅支持字母、数字、下划线、连字符和点号(最长 100 字符)。需要在 script 标签上设置 `data-website-id`

## 4. 验证

实现完成后验证:
1. 访问网站,打开 DevTools 控制台,运行 `MoneyFast.get()` — 应返回包含归因数据的对象
2. 创建一个测试 checkout,在 Stripe Dashboard → Checkout Session → Metadata 中检查 — key 应该是 `moneyfast_device``moneyfast_browser` 等(单层前缀,不是 `moneyfast_moneyfast_*`