---
title: "Adapty Mail 中的邮件目标"
description: "Adapty Mail 活动将用户发送到的页面：三种目标类型、用于个性化 URL 的占位符，以及填充其余内容的钩子。"
---

> **AI agents**: to search Adapty docs faster and with fewer tokens, install the Adapty skill. Claude Code (self-updating via plugin): `claude plugin marketplace add adaptyteam/adapty-skills && claude plugin install adapty-skills@adapty` — other tools: `npx skills add adaptyteam/adapty-skills --all`

每个活动都需要一个发送收件人的目标页面。这个地方就是**邮件目标**——一个你只需配置一次、即可在多个活动中复用的名称、URL 和类型的组合。

活动中的每封邮件只指向一个目标地址，所有可点击元素——CTA 按钮、Logo 和首图——都链接到同一个地址。它们在[数据图表](mail-analytics)中分开记录，但共享同一个链接。

## 目标类型 \{#destination-types\}

营销活动的用途决定了目标类型。创建后无法更改目标类型。

| 类型 | 兼容的活动 | 将收件人引导至何处 | URL 的来源 |
| --- | --- | --- | --- |
| **Web Paywall** | 所有营销活动，以及[双重确认订阅](mail-double-opt-in) | 浏览器中的结账页面，购买方式为网页支付，而非 App Store 或 Google Play 的交易。 | 由 Adapty Mail 生成，或粘贴自您自行托管的付费墙。[设置结账](mail-checkout)涵盖这两种情况。 |
| **Deep Link** | 应用激活 | 您的应用内您所选的页面。若未安装应用，则跳转至应用商店页面。 | 粘贴自您的链接提供商——OneLink、Branch 或 Firebase。 |
| **Cancellation Page** | 取消页面活动 | 您自己的账户页面，或您的计费提供商的门户，订阅用户可在此查看、更改或取消订阅。 | 粘贴自您自己的网站或计费提供商。 |

:::note
只要使用 HTTPS，任何目标 URL 都是有效的。因此，**取消页面**可以是一个用于打开您应用的通用链接，而不仅仅是一个网页。这一点很重要，因为 App Store 和 Google Play 的订阅是在应用商店内取消的，而不是在您托管的页面上取消的。
:::

### 交易型营销活动的目标页 \{#destinations-for-transactional-campaigns\}

Adapty Mail 包含三种交易型营销活动：

- **Double opt-in** — 当新用户画像从您的[入口点](mail-entry-points)进入时触发。其按钮会打开 Adapty Mail 的确认页面。收件人确认后，将跳转至您的网页付费墙——这也是该营销活动需要配置付费墙的原因。
- **App activation** — 在用户完成购买后触发，引导买家进入您的应用。
- **Cancellation page** — 在用户完成购买后触发，为买家提供订阅管理入口。

创建推广活动时，**Email Destination** 下拉列表为空，说明你尚未创建该类型的目标地址。点击其中的 **Create** 链接可打开相应的创建表单。

## 创建目标地址 \{#create-a-destination\}

1. 进入 **Email Destinations**，选择您的营销活动所需的类型。
2. 点击 **Create**。
3. 填写目标地址的 **Name**——在将其关联到营销活动时，您将通过该名称进行选择。
4. 填写 **URL**，必须使用 HTTPS。
5. 为每位收件人的不同值添加[占位符](#placeholders)。
6. 如果 URL 中使用了 `{response.<key>}` 占位符，请在 **Advanced** 下添加 [**Hook URL**](#hooks)。
7. 点击 **Save**。

将目标地址添加到营销活动后，其设置将变为只读状态——即使是草稿状态的营销活动也一样。如需将营销活动发送到其他目标地址，请创建第二个目标地址。

## 占位符 \{#placeholders\}

占位符可为每位用户个性化定制目标 URL。没有占位符，您的页面就无法识别是谁访问了该页面。Adapty Mail 会将占位符替换为每位收件人的唯一值。

| 占位符 | 解析内容 |
| --- | --- |
| `{email}` | 收件人的电子邮件地址。 |
| `{adapty.external_profile_id}` | 其用户画像 ID，适用于来自 [Adapty 集成](mail-collect-emails) 的数据。 |
| `{funnelfox.external_profile_id}` | 其用户画像 ID，适用于来自 [FunnelFox](mail-funnelfox) 的数据。 |
| `{custom.external_profile_id}` | 您发送的用户 ID，适用于来自 [Adapty Mail API](mail-send-data-via-api) 的数据。 |
| `{scheduled_email_id}` | 携带该链接的邮件 ID。 |
| `{custom_attribute.<key>}` | 收件人用户画像上的任意自定义属性。键名由您自定义，例如 `{custom_attribute.plan}`。 |
| `{response.<key>}` | 您自己的端点在点击时返回的值。详见 [Hooks](#hooks)。 |

- 收件人没有对应值的占位符会被解析为空字符串，因此不会将字面文本传递到你的页面。
- 自定义属性和 hook 值会进行百分号编码，所以包含 `&` 的值不会截断 URL。
- Adapty Mail 无法识别的占位符会阻止保存，错误信息会同时指出被拒绝的内容和可接受的内容。诸如 `{emial}` 这样的拼写错误会在这里被捕获，而不是等到收件人打开浏览器时才发现。

## Hooks \{#hooks\}

`{response.<key>}` 占位符用于预留来自你自己端点的值。常见用途包括一次性登录令牌或会话签名。在 **Advanced** 下创建一个新的 **Hook URL** 来配置此占位符——否则，URL 将无法保存。

工作原理：

1. 收件人点击邮件中的链接。
2. Adapty Mail 向您的 **Hook URL** 发送 GET 请求，并为该收件人填充相应的占位符。请求等待五秒，仅尝试一次。
3. 您的端点验证签名并返回一个扁平的 JSON 对象。
4. Adapty Mail 用返回结果中同名键的值填充每个 `{response.<key>}`。未返回的键保留其占位符。
5. 无论钩子是否已响应，收件人都会进入您的页面。

### 请求说明 \{#the-request\}

Hook URL 会将您的其余占位符转发到您的端点。使用这些占位符来识别用户身份。通过以下两个请求头进行身份验证：

| 请求头 | 值 |
| --- | --- |
| `X-Adapty-Mail-Timestamp` | 请求发出时的 Unix 时间戳（秒）。 |
| `X-Adapty-Mail-Signature` | 以 **Settings** > **Project** 中的 **Secret key** 为密钥，对 `<timestamp>.<url>` 进行 Hex HMAC-SHA256 签名。 |

在响应请求前，务必验证这两个请求头。未经签名验证的端点可能会将敏感信息泄露给未授权用户。同时，请拒绝时间戳过旧的请求，以防止重放攻击：

```
expected = hmac_sha256(
    key=project_secret_key,
    message=f"{timestamp}.{full_request_url}",
).hexdigest()
```

### 响应结果 \{#the-response\}

一个扁平的 JSON 对象。每个键对应同名的 `{response.<key>}` 占位符：

```json
{ "checkout_token": "ct_9f2a…", "plan": "annual" }
```

字符串、数字和布尔值均会转换为字符串。嵌套对象和数组会被丢弃，因为 URL 中无法存放它们。

## 点击后会发生什么 \{#what-happens-after-the-click\}

Adapty Mail 会填充参数值，调用钩子（如有），记录本次点击，并将收件人跳转到你的页面。

你需要识别访客身份，完成收款，并将购买信息回报给 Adapty。付费墙设置请参阅[设置结账页面](mail-checkout#what-your-page-has-to-do)，购买归因请参阅[营销活动分析](mail-analytics)。