概要:广告平台与AppsFlyer完成SKAdNetwork(SKAN)对接后,便可获得SKAN归因结果并进行相应的投放优化。
AppsFlyer可为广告平台提供以下优势:
如需了解AppsFlyer为广告主提供的SKAN解决方案,请参见以下文档:
-
广告转化归因:
- 广告平台与AppsFlyer对接后,可确保广告主在该平台上的投放所带来的所有应用激活、应用内事件以及收入都得到准确归因
- 如果没有对接,则这些激活、应用内事件和收入都会被归为自然量,而不会归因到平台
-
投放优化:
- 回传中的转化值是编译后的值。
- AppsFlyer支持广告平台对每条回传里的转化值进行解析,并根据解析后的值对相关应用的营销投放进行优化。
-
无需针对每个广告主分别完成对接——SKAN回传只发送给广告平台,广告主侧如果想获取对应数据,可采用以下任一方式:
- 分别与每个合作的广告平台进行对接。但不管是广告主还是广告平台,都无法使用这种方式实现大量级的对接。
- 与AppsFlyer对接。只需一个对接就能全面铺开,对广告主和广告平台来说都是极为高效的对接方式。
-
让您的渠道在AppsFlyer平台中脱颖而出:
- AppsFlyer会对支持SKAN对接的广告平台进行认证并予以特别标识。
- 便于使用SKAN的广告主准确定位到支持SKAN归因的广告平台。
SKAN数据流
完整的SKAN回传链路包含以下几个环节:
- iOS设备先将SKAN回传发送到获得归因的广告平台。
-
广告平台可选择下列两种方式的的任意一种:
- 补充数据维度并转发:广告平台会在其中添加广告系列ID/来源标识符(Source Identifier)、广告系列名称、iOS设备所在IP地址等信息,以细化回传数据。
- 重定向: 广告平台可以让iOS直接将回传发送到AppsFlyer。使用这种方式时,广告平台可通过其与AppsFlyer之间的专用API来补充广告系列数据的维度。
- AppsFlyer会对回传进行验证和解析,然后将解析并扩充后的回传数据发回给广告平台(同时同步给广告主)。
主要对接流程
AppsFlyer与广告平台的SKAN对接主要分为以下几个步骤(下文会有详细说明):
- 广告平台将SKAN数据发送给AppsFlyer
- AppsFlyer对SKAN数据进行解析和扩充,然后发回给广告平台
向AppsFlyer发送数据
广告平台接收到来自设备的SKAN回传后,会通过以下任一方式将其发送给AppsFlyer:
- 补充数据维度并转发(POST)
- 重定向(HTTP307重定向方式)
AppsFlyer接收到SKAN回传后会进行如下处理:
- 对回传进行验证:确保回传的唯一性。
- 对转化值进行解析:生成激活/应用内事件记录。
- 将解析后的回传发送到广告平台。
- 通过数据面板和报告将归因数据提供给广告主和广告平台。
补充数据维度并转发
广告平台可使用此方法将其从设备侧接收到的各次回传分别转发到AppsFlyer。
广告平台
- 接收来自iOS设备的回传。
- 【必选】在回传数据中补充以下维度:
- 相关广告系列在广告平台中的ID和名称。
- 从设备收到的IP地址,主要用于地理位置解析。
- iOS设备发送回传的时间戳。
- 【可选】在回传数据中补充以下维度:
- 广告组ID和名称
- 广告ID和名称
- 广告平台名称
- 国家代码
- 流量侧应用ID(Source App ID)
- 广告素材
- 流量入口(Channel)
- 完成上述数据扩充后,再将回传发送到AppsFlyer
- 注意:向AppsFlyer转发回传之前,广告平台必须先通过回传内容验证Apple的归因签名(Attribution Signature),避免对数据造成意外损坏。
扩充后的SKAN数据回传规范
端点 |
|
HTTP方法 | POST |
可用格式 | application/json |
响应码 |
200 OK:接收到的回传格式正确。 400:请求无效——JSON文件格式错误、文件为空、缺失必要字段。 |
扩充后的JSON格式SKAN回传参数
参数 |
格式 |
说明 |
来源 |
---|---|---|---|
version | 字符串 |
SKAdNetwork版本 示例: |
SKAN回传 |
ad-network-id | 字符串 |
广告平台ID 示例: |
SKAN回传 |
ad-network-name | 字符串 |
|
广告平台 |
ad-network-country-code | 字符串 |
|
广告平台 |
campaign-id | 整数 |
|
SKAN回传 |
transaction-id | 字符串 |
SKAdNetwork回传交易ID(transaction ID) |
SKAN回传 |
app-id | 整数 |
|
SKAN回传 |
attribution-signature | 字符串 | 归因签名 | SKAN回传 |
redownload | 布尔 | redownload = true时,表示该用户再次从App Store下载相关应用 | SKAN回传 |
source-app-id | 整数 |
|
SKAN回传 |
conversion-value | 整数 |
AppsFlyer SDK 根据广告主的配置设置的转化值 注意:
|
SKAN回传 |
ad-network-campaign-id | 字符串 |
为了确保广告主、广告平台和AppsFlyer之间的数据解读方式一致,请务必提供广告系列ID |
广告平台 |
ad-network-campaign-name | 字符串 | 广告平台中的广告系列名称,与该广告平台为相应广告系列赋予的ID相关联。该名称会呈现在面板和报告中。 | 广告平台 |
ad-network-adset-id | 字符串 |
广告组ID |
广告平台 |
ad-network-adset-name | 字符串 |
广告组名称 |
广告平台 |
ad-network-ad-name | 字符串 |
广告名称 |
广告平台 |
ad-network-ad-id | 字符串 |
广告ID |
广告平台 |
ip | 字符串 |
|
广告平台 |
timestamp | 字符串 |
|
广告平台 |
fidelity-type | 整数 |
|
SKAN postback (V2.2+) |
did-win | 布尔 |
|
SKAN postback (V3.0+) |
ad-network-source-app-id | 字符串 |
该字段以publisher ID填充,即发布相关广告的应用所关联的ID。一般指您为该流量侧应用指定的ID,而非Apple生成的ID。 |
广告平台 |
postback-sequence-index |
整数 |
|
SKAN 4.0回传(iOS 16.2) |
coarse-conversion-value |
字符串 |
|
SKAN 4.0回传(iOS 16.2) |
source-identifier |
字符串 |
|
SKAN 4.0回传(iOS 16.2) |
source-domain |
字符串 |
|
SKAN 4.0回传(iOS 16.2) |
creative |
字符串 |
|
广告平台 |
channel |
字符串 |
|
广告平台 |
Curl示例—扩充后的SKAN 3回传数据
curl --location --request POST 'https://skadpostbacks.appsflyer.com/api/postbacks?app_id=id888707074' \
--header 'Content-type: application/json' \
--data-raw '{
"version":"3.0",
"app-id": 888707086,
"ip": "192.0.2.0",
"ad-network-campaign-name": "skadnetwork_abc_campaign",
"source-app-id": 888707074,
"ad-network-id": "abcabcabc.skadnetwork",
"transaction-id": "68eb3d91-15f5-44ee-9267-25c7655c20b6",
"redownload": false,
"attribution-signature": "MDYCGQCsQ4y8d4BlYU9b8Qb9BPWPi+ixk/OiRysCGQDZZ8fpJnuqs9my8iSQVbJO/oU1AXUROYU=",
"timestamp": "1596525944",
"ad-network-campaign-id": "222222",
"conversion-value": 63,
"campaign-id": 99
}'
Curl示例—扩充后带精细转化值的SKAN 4回传数据
curl --location --request POST 'https://skadpostbacks.appsflyer.com/api/postbacks?app_id=id888707074' \
--header 'Content-type: application/json' \
--data-raw '{
"version": "4.0"
"ad-network-id": "example123.skadnetwork",
"ad-network-campaign-name": "skadnetwork_abc_campaign",
"ad-network-campaign-id": "222222",
"source-identifer": "5239",
"app-id": 525463029,
"transaction-id": "6aafb7a5-0170-41b5-bbe4-fe71dedf1e30",
"redownload": false,
"source-app-id": 1234567891,
"fidelity-type": 1,
"did-win": true,
"conversion-value": 63
"postback-sequence-index": 0
"attribution-signature": "MEUCIGRmSMrqedNu6uaHyhVcifs118R5z/AB6cvRaKrRRHWRAiEAv96ne3dKQ5kJpbsfk4eYiePmrZUU6sQmo+7zfP/1Bxo="
}'
Curl示例—扩充后带粗略转化值的SKAN 4回传数据
curl --location --request POST 'https://skadpostbacks.appsflyer.com/api/postbacks?app_id=id888707074' \
--header 'Content-type: application/json' \
--data-raw '{
"version": "4.0"
"ad-network-id": "example123.skadnetwork",
"ad-network-campaign-name": "skadnetwork_abc_campaign",
"ad-network-campaign-id": "222222",
"source-identifer": "39",
"app-id": 525463029,
"transaction-id": "6aafb7a5-0170-41b5-bbe4-fe71dedf1e31",
"redownload": false,
"source-app-id": 1234567891,
"fidelity-type": 1,
"did-win": true,
"coarse-conversion-value": "high"
"postback-sequence-index": 0
"attribution-signature": "MEUCIQD4rX6eh38qEhuUKHdap345UbmlzA7KEZ1bhWZuYM8MJwIgMnyiiZe6heabDkGwOaKBYrUXQhKtF3P/ERHqkR/XpuA="
}'
重定向
在此方法中,广告平台使用HTTP重定向指令(307)来响应iOS设备发出的SKAN信息,请求设备将SKAN回传直接发送到AppsFlyer。
重定向方法具有以下优势:
-
增强广告主的信任感:由于MMP代替广告主开展移动衡量工作,因此当广告平台向AppsFlyer开放一手回传信息时,广告主无需担心回传数据在传输过程中出现篡改问题。
- 省去广告平台的数据处理工作:广告平台使用重定向指令对设备进行响应时,无需对回传数据进行处理。但“补充数据维度并转发”的方式则需要广告平台获取数据并在其中添加额外的参数,最后再转发给AppsFlyer。
启用方式
- 配置您的服务器以使用HTTP 307对SKAdNetwork回调进行响应,将回调信息重定向到 https://skadredirect.appsflyer.com/api/redirects
- 您可以在SKAN回传中添加下表所列的广告系列信息查询参数。请务必在回传中发送广告系列信息,因为我们需要通过这些信息补充SKAN回传中的成本等投放数据,这样广告主才能有效地优化其投放。
重定向的SKAdNetwork请求示例
https://skadredirect.appsflyer.com/api/redirects&ad-network-campaign-id=243232&ad-network-campaign-name=yarg_campaign_name
&ad-network-adset-name=dsdsa&creative=examplecreative&channel=channelexample
建议添加的广告系列相关参数(非必须)
查询参数 |
说明 |
---|---|
ad-network-name |
|
ad-network-campaign-id | 广告系列活动ID |
ad-network-campaign-name | 广告系列名称 |
ad-network-adset-id | 广告组ID |
ad-network-adset-name | 广告组名称 |
ad-network-ad-id | Ad ID(广告ID) |
ad-network-ad-name | Ad name(广告名称) |
ad-network-country-code |
|
ad-network-source-app-id | 该字段以publisher ID填充,即发布相关广告的应用所关联的ID。一般指您为该流量侧应用指定的ID,而非Apple生成的ID。 |
ip |
|
timestamp |
|
creative |
|
channel |
|
接收AppsFlyer发送的数据
开始接收回传之前,需先考虑以下事项:
- 广告平台必须设定回传端点和模板(请通过渠道支持微件联系您的PDM,以确保该设置妥善完成)。
- AppsFlyer发送SKAN回传时使用的机制与iOS向广告平台发送SKAN回传的机制相同。
原理
-
对于广告平台侧发送到AppsFlyer的每条回传,AppsFlyer都会发送:
- 一条激活回传。AF会使用“redownload”参数来标识重新下载行为。
- 零次到数次的应用内事件回传。具体次数取决于转化值的解析结果,详见模拟回传。
- 使用回传数据时需注意:同一个激活或事件可能会同时被多个AppsFlyer归因模式归因。这时您可以使用attribution_source参数来区分回传的类型。
广告平台可用的回传宏
回传宏(名称) |
说明 |
格式和示例 | 仅适用于应用内事件 |
---|---|---|---|
site_id |
发布广告的应用(即Source App ID,流量侧应用ID) |
字符串:876534 |
|
install_time |
由AppsFlyer根据updateConversion窗口估算。以10位UNIX时间戳或人类可读的时间戳表达。 |
|
|
skadnetwork_ad_network_time |
广告平台从iOS设备接收到回传的时间。由广告平台上报。以10位UNIX时间戳或人类可读的时间戳表达。 |
|
|
|
AppsFlyer从广告平台接收到回传的时间。以10位UNIX时间戳或人类可读的时间戳表达。 |
|
|
event_name |
事件名称
|
字符串:af_skadnetwork_revenue, abc123
|
是 |
revenue |
以指定货币代码为单位的收入金额 |
数字:5、20、0.4 |
是 |
currency |
货币代码为广告主在AF后台针对相关应用设置的指定货币。 |
字符串:EUR、USD、ZAR |
是 |
attribution_source |
归因数据的来源: SKAdNetwork:SKAdNetwork |
字符串:SKAdNetwork |
|
app_id |
App ID(广告主应用) |
字符串:ID123456790 |
|
country |
由广告平台判定的激活所在国家 |
字符串:US、UK、ZA |
|
campaign |
广告系列名称使用从广告平台回传的d-network-campaign- name 填充 |
字符串:UA_US_23 + |
|
campaign_id |
使用广告平台回传中发送的广告系列 ID 填充广告系列 ID。请注意:在SKAN 4中,该值总是为null。 |
字符串:3456745 |
|
redownload |
可能出现的值为:true、false redownload = true时,代表该用户再次从App Store下载相关应用 |
布尔值:true / false |
|
skadnetwork_ambiguous_event |
广告主在面板中更改SKAN设置后的最初72小时内接收到的事件。由于SKAN使用的计时器过多,因此AppsFlyer无法准确地映射该事件。 |
布尔值:true / false |
|
skadnetwork_campaign_id |
原始SKAN回传中提供的SKAN广告系列ID |
56, 23 |
|
af_skadnetwork_nonce |
具有唯一性的随机标识符,便于渠道识别重复的回传 |
|
|
event_id |
广告平台为对应事件赋予的名称/ID。 |
|
是 |
transaction_id |
SKAN回传交易ID 注意: 广告主必须手动开通AppsFlyer与广告平台之间的transaction_id共享。您可以让广告主在AppsFlyer后台的对接板块中完成相关操作。 |
|
|
ad_network_adset_id | 由广告平台添加到iOS回传中 | 字符串 | |
ad_network_adset_name | 由广告平台添加到iOS回传中 | 字符串 | |
ad_network_ad_name | 由广告平台添加到iOS回传中 | 字符串 | |
ad_network_ad_id | 由广告平台添加到iOS回传中 | 字符串 | |
SKAN_min_event_counter | 参见脚注(1) |
整数 |
是 |
SKAN_max_event_counter | 参见脚注(1) |
整数 |
是 |
SKAN_min_time_post-install | 参见脚注(2) |
整数 |
是 |
SKAN_max_time_post-install | 参见脚注(2) |
整数 |
是 |
SKAN_min_event_revenue | 参见脚注(3) | 实数 | 是 |
SKAN_max_event_revenue | 参见脚注(3) |
实数 |
是 |
fidelity-type |
用于区分广告呈现方式,这会影响到归因结果。通过0和1来表达,具体如下:
|
整数 | |
skad_af_attribution_flag |
用于标识该用户是否由AppsFlyer通过单一可信数据源机制归因。 |
布尔 | |
skad_postback_sequence_index |
|
整数 | |
skad_coarse_conversion_value |
|
字符串 | |
skad_source_identifier |
|
字符串 | |
skad_source_domain |
|
字符串 | |
ad_network_creative |
|
字符串 | |
ad_network_channel |
|
字符串 | |
脚注:
|
SKAN回传示例
AppsFlyer发送的SKAN激活回传示例
http://YourCompanyDomain.com/event?site_id=(publisher-id)&install_time=(timestamp)
&skan_ad_network_time=(timestamp)
&skan_af_received_time=(timestamp)
&attribution_source=skadnetwork
&app_id=(id123456789)&country=(ZA)&campaign=(campaign-name)
&campaign_id=(campaign-id)&SKAN_ambiguous_event=(boolean)
&redownload=(boolean)
&af_SKAN_nonce=(uuid)
AppsFlyer发送的SKAN应用内事件回传示例
http://YourCompanyDomain.com/event?site_id=(publisher-id)&install_time=(timestamp)
&skan_ad_network_time=(timestamp)
&skan_af_received_time=(timestamp)&revenue=(value)
¤cy=(code)&event_name=(event-name)&attribution_source=skadnetwork
&app_id=(id123456789)&country=(ZA)&campaign=(campaign-name)
&campaign_id=(campaign-id)&SKAN_ambiguous_event=(boolean)
&redownload=(boolean)
&af_SKAN_nonce=(uuid)
对接测试
您可以使用以下任一方式测试您的平台与AppsFlyer的SKAN对接:
- 真实的SKAN回传:基于广告平台收到的实际SKAN流量进行测试
- 模拟回传:基于AppsFlyer的测试应用
如需从iOS设备侧接收到真实的SKAN回传,广告平台必须完成以下工作:
- 在Apple的开发者网站中注册为广告平台
- 使用SKAN签名对广告进行标记。
- 流量侧应用(Publisher App):将广告平台ID添加到info.plist文件中,并在广告展示时调用loadProduct。
- 广告主应用(Advertiser app):需使用最新的AppsFlyer iOS SDK。V6.0.3之前的版本不支持SKAdNetwork归因。
接收模拟回传:
真实环境测试
在该方法中,广告平台需针对实际使用中的应用向AppsFlyer发送其真实的SKAN回传。
测试对接
操作方 | 需完成的操作 |
---|---|
广告平台 | 与您的AppsFlyer PDM联系(或使用渠道支持微件),告知您的SKAN平台ID(由Apple提供)。 |
广告平台和AppsFlyer | 确认要参与回传对接测试的客户(需接入最新的AppsFlyer SDK)。 |
广告平台 | 使用本文所述的任一方法将相关应用的SKAN回传发送给AppsFlyer。 |
AppsFlyer | 根据广告客户设置的转化价值映射关系,将解码后的应用内事件信息发送到广告平台。 |
测试成功标准:
操作方 | 需完成的操作 |
---|---|
广告平台 | 测试结束后,广告平台需向AppsFlyer提供以下信息:广告平台在指定时间段内为测试客户发送的SKAN回传数量。 |
AppsFlyer | 对比收到的回传数量与广告平台发送的数量。 |
AppsFlyer |
按以下分类将发送到相关广告平台的回传数量信息分享给该平台:
|
模拟回传
- 广告平台可使用此方法将AppsFlyer预先备制的回传数据发送到AppsFlyer测试应用,具体说明请见下表。然后AppsFlyer会把解析完毕的转化信息再回传给广告平台。
- 各测试应用的转化值映射构架都有所不同,具体请见下表。
App ID | SKAN衡量模式 | 操作说明 |
---|---|---|
id888707085 |
收入模式,且转化值每增加1,代表收入增加$1 预期结果: |
|
id888707086 | 转化模式,且记录以下事件:
|
|
id888707087 | 使用af_SKAN_revenue事件记录到的互动 |
|
对接流程
操作方 | 需完成的操作 |
---|---|
广告平台 | 在回传管理平台中配置您的SKAN平台ID(由Apple提供)以及SKAN回传模板。如有疑问,请通过渠道支持微件联系我们。 |
广告平台 |
|
AppsFlyer | 对模拟回传中的转化值进行解析,并再次回发给广告平台 |
测试成功标准:
操作方 | 需完成的操作 |
---|---|
AppsFlyer | 处理广告平台发来的模拟回传并将解析后信息发送到广告平台。 |
广告平台 |
|
说明
有关必要字段、数据维度补充、认证等的说明。
常见问题解答
关于回传的常见问题答疑 |
---|
是否必须添加维度补充字段? 就目前而言,即使回传中缺失一个或多个必要的维度补充参数,我们也会对其进行处理。但基于以下原因,仍建议广告平台在回传中添加这些参数:
|
是否只能发送广告系列ID或广告系列名称,不能两者同时发送? 参见上一条答案。您可以使用同一个值来填充ID和名称字段。 |
使用补充数据维度并转发的方式时,是否可以添加不在AppsFlyer规范中的键值对? 可以。只要归因签名(Attribution Signature)有效,我们就会处理回传并忽略额外的信息。 |
SKAN回传模板是否不同于现行回传模板? 是的,两者的流程和结构不同。 |
对于同一个激活是否会同时收到SKAN回传和概率模型/确定性归因回传(即出现激活的重复上报)? 是的。无论归因方法如何,对于每一个归因到某广告平台的激活,我们都会上报一条激活记录,并向该广告平台发送一条回传。 您可以使用attribution_source来筛选出SKAN回传。 |
广告平台是否需要处理来自AppsFlyer的回传? 不必处理回传,但建议使用回传中上报的用户质量信息对广告投放进行相应的优化。 |
除了发送带有SKAN信息以及补充数据的回传,是否还需要调用AppsFlyer归因链接? 不需要。广告平台只需向我们发送SKAN有效信息和补充数据即可。 |
如何在AppsFlyer面板中获得SKAN对接渠道的认证?
|
1-100的SKAN广告系列ID限制对我有何影响? 1-100的广告系列ID限制会影响您在Apple中对广告系列进行标识和编号的方式。在该限制下,您针对一个应用最多只能同时投放100个独立的广告系列。AppsFlyer支持您使用实际的广告系列名称和ID来对回传数据进行补充。也就是说,您可以将SKAN广告系列ID关联到回传送达时您实际使用的广告系列ID。只要您对于某个应用同时投放的广告系列不超过100个,则完成上述映射配置后,您对广告系列的标识及编号方式就不受1-100的ID限制影响。 |