
-
AdAttributionKitの新機能
AdAttributionKitの新機能について学びます。重複した再エンゲージメントのコンバージョンを測定する方法や、アプリにおいて広告アトリビューションのルールをカスタマイズする方法などを説明します。複数の国や地域にわたる広告キャンペーンの成果を評価するために使用できる、新しいポストバックプロパティに関するインサイトを共有します。また、AdAttributionKitの実装をテストするための新しい機能とベストプラクティスも紹介します。このセッションの内容を十分理解できるよう、まず「Meet AdAttributionKit」を視聴することをおすすめします。
関連する章
- 0:00 - イントロダクション
- 3:23 - 重複したコンバージョン期間の測定
- 7:50 - アトリビューションルールのカスタマイズ
- 14:46 - ポストバックによる地理情報の取得
- 18:12 - AdAttributionKitのテスト
リソース
- AdAttributionKit
- Configuring attribution rules for your app
- Creating postbacks in developer settings
- Enabling Developer Mode on a device
- Identifying conversion values with conversion tags
- Supplying an install verification token
- Verifying a postback
関連ビデオ
WWDC25
WWDC24
-
このビデオを検索
皆さん こんにちは App Store Engineeringチームの エンジニアのMikeです 今日は 広告対象のアプリの デベロッパ向けに開発された AdAttributionKitの新機能を いくつか紹介します こんにちは Commerce Engineeringチームの エンジニアのYuchiです ポストバックの利用者向けに アトリビューションの設定と 新規データ受信の 新しい機能を紹介します
Appleはプライバシーを 基本的な人権と考えています そのため ユーザーのプライバシーを保護しながら 広告主が広告キャンペーンの成果を 測定することができるように AdAttributionKitをゼロから見直しました 最初にAdAttributionKitの しくみについて簡単に説明します AdAttributionKitフローは 3つの異なるアクターで構成されています 最初に広告ネットワークが 広告ペイロードを作成し パブリッシャーアプリに提供します
次に パブリッシャーアプリが 広告対象のアプリの 広告を表示します 最後に 広告対象のアプリが アプリ内のユーザーのアクションから エンゲージメントを測定します これらのアクターは AdAttributionKitの エンドツーエンドフローの 別の点で役立ちます
エンドツーエンドフローは アプリの広告ペイロードを作成する 広告ネットワークから始まります 次に 広告ネットワークは広告ペイロードを パブリッシャーアプリに提供します パブリッシャーアプリは ユーザーに広告を表示します
ユーザーは表示やタップなど インタラクションが可能で それがインストールや再エンゲージメント コンバージョンにつながります
インストールコンバージョンは ユーザーが広告に対して インタラクションを行った結果 ユーザーがApp Storeや 代替アプリマーケットプレイスから アプリをインストールした場合に発生します
再エンゲージメント コンバージョンは インストール済みアプリの 広告の操作により ユーザーが広告対象のアプリに 直接誘導された場合に発生します
コンバージョンが発生すると アプリ内での インタラクションやエンゲージメントを 広告主が測定します コンバージョン期間が終了すると コンバージョンやエンゲージメントの 測定値を表すデータが ポストバックの形式で 広告ネットワークに返信されます これでAdAttributionKitの エンドツーエンドフローは終了です 簡単におさらいすると AdAttributionKitは iOS 17.4でリリースされました 当初はインストールコンバージョンが サポートされていましたが iOS 18で再エンゲージメントが サポートされるようになりました AdAttributionKitを始めるにあたって WWDC24セッションの 「Meet AdAttributionKit」を ご覧ください これらの内容を踏まえて エンドツーエンドフローの 様々な部分を強化する新しい機能を 紹介できることをうれしく思います
広告対象のアプリの デベロッパ向けに 測定フローやテストフローで アプリ内で使える いくつかの強力な 新しい機能について紹介します Yuchiはアトリビューションフローや ポストバックの新しいデータに対して行われた 広告ネットワークやポストバックデータの ダウンストリームのコンシューマ向けの 機能強化について紹介します
このビデオは4つのパートに分かれています 最初に アプリ内の重複した 再エンゲージメントコンバージョンを 測定するための コンバージョンタグについて説明します
その後 Yuchiがアトリビューションルールを アプリ用にカスタマイズする方法について またポストバックに追加された 新しい地理データについて説明します
最後に iOSの設定アプリの 新しいテスト機能を使用して 実装されたAdAttributionKitを テストする方法について説明します
では 重複したコンバージョン期間の 測定について見ていきましょう
エンドツーエンドフロー図の 再エンゲージメントフローに注目してください
iOS 18.3までは アプリでアクティブにできる 再エンゲージメントコンバージョンは 常に1つだけでした
iOS 18.4以降 アプリで複数の 再エンゲージメントコンバージョン期間を 同時に アクティブにできるようになりました またコンバージョンのブックマークのような コンバージョンタグを アプリが受け取れるようになりました 更新する再エンゲージメントコンバージョンを コンバージョンタグで指定できます コンバージョンタグをアプリで使用する シナリオを見てみましょう デベロッパは顧客向けの 様々な製品の売上を向上させるために 複数の再エンゲージメントキャンペーンを アプリ内で実施していることがあります
ある顧客がアプリ内の 割引商品の広告を見て それを タップしました 顧客はアプリに ディープリンクされ システムに再エンゲージメント コンバージョンが作成されます 数分後 顧客は商品を購入せずに アプリを閉じました シナリオを続けましょう 数時間後に 同じ顧客が アプリ内の別の2つ目の 割引商品の広告を見て それをタップしました するとシステムに別の再エンゲージメント コンバージョンが作成されます しばらくアプリを眺めた後 顧客は前に戻って 最初の割引商品を購入しました その場合でも コンバージョンタグを使って Discount 1に対応する 最初のコンバージョンのコンバージョン値を 更新することができます この機能はアプリ内で同時に 複数の製品に対して 再エンゲージメントキャンペーンを 実施している場合に便利です 重複したコンバージョン期間を 測定するためにまず行うことは EligibleForAdAttributionKitOverlappingConversions キーを アプリのInfo.plistで YESに設定することです これを行わないと これまでのように重複したときに 前のコンバージョンがロックされます 次に アプリでコンバージョンタグを 取得する方法を紹介します
アプリでオプトインすると 再エンゲージメントが発生したときに AdAttributionKitによりアプリに提供される 再エンゲージメントURLに コンバージョンタグが追加されます 再エンゲージメントURLとは カスタムまたはStoreKitレンダリングの広告が 画面に表示されたときにAPIに渡される ユニバーサルリンクのことです タグは AdAttributionKitの ReengagementOpenパラメータの 値として提供されます この例のURLでは タグは=1です
アプリが再エンゲージメントURLを 受け取ったら このような関数を使用して コンバージョンタグを抽出できます 詳しく見てみましょう 最初に 関数は URLComponentsを使用して 渡されたURLのコンポーネントを取得します 次に クエリ項目のリストを取得します 再エンゲージメントのために アプリが開かれた場合 AdAttributionKitは必ず ReengagementOpenを追加します
次に URLに追加された クエリパラメータのリストを調べます URLにReengagementOpenパラメータが ある場合は そのパラメータの値を すぐに返します クエリパラメータが 見つからない場合は 関数はnilを返します
これでアプリに コンバージョンタグを取得できたので これを使用して 対応するコンバージョンを直接更新できます
コンバージョンの結果生じた 重要なイベントを 後で紐づけられるように コンバージョンタグを 作成元の再エンゲージメントコンバージョンに 関連付けることをおすすめします
またコンバージョンタグは アプリかサーバ側のデータストアに ローカルに 保存する必要があります
特定のコンバージョンを 調べるために測定している アクションを 顧客がアプリで実行したら そのコンバージョンのタグを 取得します
ここで コンバージョンタグを使用して コード内でコンバージョンを 直接更新する方法を紹介します
これは コンバージョンタグの コンバージョン値を取得し 特定のポストバックを更新する関数です PostbackUpdate構造体を 初期化したら 更新するコンバージョンの コンバージョンタグを渡します 次に Postback APIを呼び出し コンバージョン値を更新します
updateConversionValue APIは コンバージョンタグなしでも 呼び出せますが その場合は最新の コンバージョンポストバックが更新されます 以上が コンバージョン期間が重複する場合に コンバージョンタグを使用して ポストバックを更新する方法でした ポストバックのコンバージョン値の測定は AdAttributionKitを使用する場合における パズルの1ピースにすぎません システムの別の重要な側面として ダウンストリームで受け取った ポストバックデータの解釈があります これにより アプリのマーケティングに関する決定について 役立つ情報が得られます Yuchi この分野で紹介できる 最新情報はありますか はい あります 受け取ったポストバックデータの 利用と解釈に役立つ いくつかの新しい機能を 紹介したいと思います ポストバックデータに含まれる 最も重要なシグナルをキャプチャできるように アプリに合わせてアトリビューションルールを カスタマイズできるようになりました これにより アトリビューションフローを調整できます
アトリビューションフローを調整するには 2つの方法があります 1つは設定可能な アトリビューション期間です
広告アトリビューションの エンドツーエンドフロー図に戻りましょう AdAttributionKitは広告のリーセンシーと タイプに応じてアトリビューションを実行します
AdAttributionKitでは クリックスルー広告とビュースルー広告の 2つの広告タイプがサポートされています
一般的に 広告タイプごとに ターゲット期間は異なります クリックスルー広告では10日以内に発生した コンバージョンをターゲットとしています 例えば インプレッション表示時刻から 20日後など ターゲット期間の後に コンバージョンが発生した場合 この広告によるコンバージョンと 見なすべきではありません この広告のターゲット期間のことを アトリビューション期間と呼びます アトリビューション期間とは 広告表示時刻から この広告をアトリビューションとして 考えることができる 最後の時刻までの期間を指します 広告のアトリビューション期間内に コンバージョンが発生した場合は その広告がそのコンバージョンの アトリビューション候補となりますが それ以外の場合 その広告は アトリビューション候補となりません これまで掲載後30日以内の すべてのクリックスルー広告 また掲載後1日以内の ビュースルー広告を アトリビューションとして考えてきましたが この期間を 柔軟に調整できるように 設定可能なアトリビューション期間を 導入しました 広告主は Info.plistファイルで 目的の長さのアトリビューション期間を 指定することができます この例では JSONファイルを使用して 設定を示していますが アプリのInfo.plistファイルを 編集するときにも 同じキーと構造を使用できます アトリビューション期間は 広告ネットワークごとに定義することも ビュースルー広告やクリックスルー広告など 広告インタラクションタイプごとに 定義することもできます これはその一例です ここで 広告主は com.example.adNetworkという 広告ネットワークに対して クリックスルー広告とビュースルー広告に 2日間と1日間の アトリビューション期間を指定しています 広告ネットワークパートナーが 主に一方の広告タイプに焦点を当てている場合 その広告ネットワークの他方の広告タイプを 完全に無視することもできます これを行うには ignoreInteractionTypeキーを指定します このキーは「view」または「click」に 設定できますが 両方を同時設定することはできません 複数の広告ネットワークで作業する場合 それらにアトリビューション期間の長さを 1つずつ指定するのは大変です その場合 デフォルトですべての広告ネットワークに 適用されるglobalキーを追加することで 作業するすべての広告ネットワークについて 期間の長さを指定できます グローバルな期間の長さに加えて 特定の広告ネットワークについても アトリビューション期間の長さを 設定することができます この設定は グローバルな設定よりも優先されます 広告ネットワークやグローバルな設定が 見つからない場合は現在使用中の デフォルトのアトリビューション期間に戻ります この例では ad com.example.adNetworkの クリックスルー広告の アトリビューション期間は5日間で この広告ネットワークの ビュースルー広告は無視されます その他の広告ネットワークについては ビュースルー広告の アトリビューション期間が3日間です アトリビューション期間はインストール広告 のみの概念で再エンゲージメント広告には 適用されません これは再エンゲージメント広告では インタラクションのすぐ後に コンバージョンが発生するためで 両者に間に時差が生じないためです アトリビューションフローを調整する 2番目の方法は 設定可能なクールダウンです 広告アトリビューションの エンドツーエンドフロー図に戻りましょう 広告により発生したコンバージョンの後の ユーザーエンゲージメント測定に 注目してください 広告ネットワークが広告を提供し 広告によるコンバージョンが発生すると 広告主がユーザーエンゲージメントを 測定するための期間が開始されます この期間のことを コンバージョン期間と呼びます 広告主は updateConversionValue APIを 呼び出すことで サブスクリプションや アプリ内課金など ユーザーがアプリ内で行う アクティビティに基づいて コンバージョン値を 測定することができます 実際には これらの広告アトリビューションの多くが 同じデバイス上にある 同じ広告アプリに対して 同時に発生します コンバージョン期間が重なることもあり その場合は 測定が最も適切なコンバージョンに対して 記録されないことがあります
具体的な例を 見ていきましょう ユーザーが広告をクリックし 広告対象のアプリをダウンロードし その少し後に アプリ内課金を行いました その結果 インストール広告に対して 高いユーザー値が測定されました では次の場合を考えましょう アプリをインストールした直後 同じユーザーが再エンゲージメント広告を タップしてアプリを開きました するとインストール広告の アトリビューションにすべきアプリ内課金が 再エンゲージメント広告の アトリビューションになります これは目的の測定結果では ないかもしれません
再エンゲージメント広告のすぐ後に 別の再エンゲージメントコンバージョンが 発生した場合も 同じことが起こる可能性があります 最初の再エンゲージメント広告の アトリビューションとなるべきコンバージョンが 2番目の再エンゲージメント広告の アトリビューションとなります これを防ぐために 各コンバージョンの後に 他のシグナルを ブロックする期間を設定し 固有のコンバージョンを生じさせた 広告の値を測定するためだけに その期間を使用できます これを設定可能な アトリビューションのクールダウンと呼びます 設定可能なアトリビューションのクールダウンは コンバージョンタイプごとに 指定できます クールダウンは コンバージョンごとに開始し クールダウンが 完全に終了する前に発生した その他のすべてのコンバージョンは どのコンバージョンの アトリビューションにもなりません 広告主は Info.plistファイルで 目的のアトリビューションのクールダウンを 指定できます この例では 広告主は インストールと再エンゲージメントに 6時間と1時間のクールダウンを指定しています この設定では 例えば ユーザーがインストール広告をクリックし 時間Tにアプリをインストールしたとします そしてインストールに6時間の クールダウンが設定されているとします 同じユーザーが インストールから4時間後に 再エンゲージメント広告をタップして アプリを開いた場合 この再エンゲージメントコンバージョンは 広告のアトリビューションとなりません インストールから7時間後に 再エンゲージメント広告をタップして アプリを開いた場合 再エンゲージメントに 広告アトリビューションが付与されます 設定可能なアトリビューション期間と アトリビューションのクールダウンのいずれも インプレッションとポストバックの JWS形式を変更しません これらの設定可能な機能の他に 各国における広告キャンペーンの成果を 測定するのに役立つ 新しい地理情報が ポストバックに追加されています
広告アトリビューションの エンドツーエンドフロー図に戻りましょう 今度はポストバックに注目してください
ポストバックは AdAttributionKitの出力で アトリビューションや ユーザーエンゲージメント測定値など コンバージョンに関する情報を 送信します ポストバックは広告ネットワークに提供され 必要に応じて 広告対象のアプリのデベロッパにも提供されます 広告主や広告ネットワークが 広告を効率よく配信するために コンバージョンの地理情報に アクセスしたいと考えていることを 私たちは知っています 現在 一部の実装ではソース識別子を使用して それらの情報を得ています 最新のAdAttributionKitでは ポストバックの新しいフィールドとして 国コードが用意されています それぞれのコンテキストで 国コードが何を表しているか見てみましょう
アプリがApp Storeからインストールされた場合 ポストバックの国コードは ユーザーのアカウント設定で 選択されている所在地に基づいて アプリがダウンロードされた App Storeのストアフロントから導出されます 再エンゲージメントコンバージョンでは アプリが最初にインストールされたときと 同じ所在地がポストバックに使用されます iOS 17.4では 代替アプリマーケットプレイスが インストール検証トークンを提供することで アプリのインストールシグナルを Appleデバイスに送信できるようになりました インストール検証トークンは JWSトークンの1つで ダウンロードのタイムスタンプや ダウンロードされたアプリIDなど アプリのインストールに関する情報が含まれた ペイロードを持っています 新しいiOSバージョンでは このインストール検証トークンのペイロードに 新しい国コード用のフィールドを 追加できるようになりました 署名してAppleに送信すると Appleが値を検証し ポストバックの国コードフィールドに コードを入力します 国コードは インストール検証トークンの オプションのフィールドです インストール検証トークンに 国コードが見つからない場合は ポストバックに 国コードは追加されません
代替アプリマーケットプレイスによる コンバージョンの国コード値は 代替アプリマーケットプレイスが サポートされている地域に 制限されることに 注意してください
これはポストバックへの 国コードの追加方法を示します 国コードは ad-interaction-type 署名付きのJWSトークン またcoarse-conversion-valueと並列な 署名なしのフィールドです AdAttributionKitの 他のすべてのポストバックと同様に 国コードフィールドにも クラウド匿名性アルゴリズムが適用されます クラウド匿名性アルゴリズムは プライバシー保護型広告アトリビューションの 核となるアルゴリズムで これにより 広告主や広告ネットワークに 識別可能な情報を公開する前に 個人の特異性を 大きな集団に溶け込ませることができます
国コードは その同じ国に 同様のコンバージョンが 十分存在する場合にのみ ポストバックに含まれます ポストバックに国コードを 追加するかどうかを決める このクラウド匿名性ティアは 現在 適用されている 4つのクラウド匿名性ティアに加えて 追加されます このため 広告主や広告ネットワークが 現在受け取っているデータを 受け取れなくなることはありません ポストバックデータの 最新情報については以上です 次に MikeがAdAttributionKitの 新しいテスト機能について説明します Yuchi 素晴らしい情報をありがとうございました ここまでAdAttributionKitの すべての新機能について説明しました 次に 実装をテストする 新しい方法を紹介します
エンドツーエンド図に戻って 広告配信とコンバージョンフローに 注目してください
これは実装したアプリのAdAttributionKitを テストする場合に使用される 一般的なフローです
まず 広告対象のアプリの 広告ペイロードを作成して提供します 次に 別のパブリッシャーアプリで 広告を表示してインタラクションを行い インストールコンバージョンまたは 再エンゲージメントコンバージョンを実行して アプリに開発用ポストバックを 作成します
iOS 18.4では iOSの設定アプリから直接 アプリに開発用ポストバックを 作成できるようになりました
デベロッパ設定から作成したポストバックにより 新しい方法のテストが可能になりました XcodeまたはAd Hoc配信などの 他の配信メカニズムからアプリを実行した場合 コンバージョン値の更新を テストできるようになりました また ポストバックに含めるデータを 直接制御できるようになりました これは実装サーバが ポストバックの様々なデータティアを 処理できるかどうか テストする場合に便利です
次に デベロッパ設定を 使用して アプリの ポストバックを作成する 方法を紹介します
まずデバイスでデベロッパモードが 有効になっていることを確認します 次に 設定アプリ内の デベロッパ設定に移動します
デベロッパ設定で までスクロールすると の上に ページが 追加されています
ページを タップすると アプリのポストバックを設定するための オプションが表示され 対象となるポストバックを送信するか 開発用ポストバックをデバイスから消去できます 開発用ポストバックを設定するには アプリのバンドル識別子を入力し ボタンをタップします
アプリのポストバックを作成する前に アプリをデバイスにインストールしてください
最初にポストバックの 宛先を指定します これはお使いのサーバのURLです テスト時には本番用のポストバックを 受信するURLとは異なる 開発用URLを 使用することおすすめします ポストバックコピーURLを アプリから自動的に取得することもできます これにより サーバが公開するURLと システムが生成するよく知られたURLが 一致することを確認できます
次に ポストバックのプロパティを 入力します 目的のコンバージョンタイプを表すよう ポストバックを 設定することができます
iOSでは 新しいプロパティとして 国コードを設定できるようになりました これはポストバックの国コードを テストするのに役立ちます
プロパティを設定したら それぞれのポストバックの データの粒度を調整できます この粒度は サーバに送信される情報の量を制御します 実装したサーバが 様々なポストバックデータティアを 正しく処理することを 確認できます
ポストバックの設定が 完了したら ポタンをタップして アプリにポストバックを作成します
これでアプリに 開発用ポストバックが作成されたので コンバージョン値を 更新することができます
テスト時にupdateConversionValue(_:) API を呼び出して 開発用ポストバックを更新します ポストバックの コンバージョン期間が終了したら 開発用ポストバックが自動的に 送信されるまで待つか ボタンを タップします
エンドツーエンドフローで作成した ポストバックに対し デベロッパ設定で作成したものには 重要な違いがあります ポストバックのJSON Web Signatureに 見られる変更点を紹介します
これはポストバックで受け取る ヘッダのスニペットです
デベロッパ設定から作成したポストバックは 新しいkid値で示された 新しいキーを使用して 署名されています ポストバックを検証して新しい公開鍵を取得し 署名を検証する方法については Appleのドキュメントをご確認ください 視線を移して ポストバックのペイロードにも いくつかの 重要な違いがあります 広告ネットワークIDは常に development.adattributionkitになります この点からも デベロッパ設定で作成したポストバックと 本番用のポストバックを 見分けることができます
ポストバックの広告アイテムIDは ゼロになることもあります 例えば テスト中にアプリをXcodeから 実行する場合などです
AdAttributionKitに追加された テスト機能の説明は 以上になります AdAttributionKitを実装する 開発やテストで ワークフローを合理化する上で 役立つことでしょう AdAttributionKitの新機能について 多くの点を説明しました アプリ内の重複するコンバージョン期間を 測定する方法から 国コードやポストバックを 受け取る方法まで これらのアップデートは 各種広告アトリビューションに影響を与えます
次のステップとしてアトリビューションルールを アプリに設定する準備ができたら 必ず最初に新しい設定キーを アプリのInfo.plistに 追加してください 本番環境にリリースする前に 開発ライフサイクルの早い段階で 新しいテスト機能を使用して AdAttributionKitをテストしましょう SKAdNetworkを使用しているなら 今こそ AdAttributionKitに移行して 開発を始める絶好の機会です プライバシーを最優先した 広告フレームワークの使用体験について フィードバックをお寄せくださった デベロッパの皆さんに感謝いたします 皆さんからのフィードバックは開発や ユーザーのプライバシーを保護しながら 最高の広告体験を アプリに提供する上で役立っています ご視聴ありがとうございました
-
-
5:42 - Function that retrieves a conversion tag from a URL
func retrieveConversionTag(fromURL url: URL) -> String? { guard let components = URLComponents(url: url, resolvingAgainstBaseURL: true) else { print("Could not get components for URL.") return nil } guard let queryItems = components.queryItems else { print("URL does not contain query items.") return nil } for item in queryItems { guard item.name == Postback.reengagementOpenURLParameter else { continue } return item.value } return nil }
-
6:55 - Function that updates conversion value using a conversion tag
func updateConversionValue(_ conversionValue: Int, conversionTag: String) async { do { let update = PostbackUpdate(fineConversionValue: conversionValue, lockPostback: false, conversionTag: conversionTag) try await Postback.updateConversionValue(update) } catch { print("An error occurred while updating the conversion value: \(error)") } }
-
9:32 - Example Info.plist for configuring attribution window
{ "AdAttributionKitConfigurations": { "AttributionWindows": { "com.example.adNetwork": { "install": { "click": 2, "view": 1 } } } }
-
9:58 - Example Info.plist for configuring attribution window
{ "AdAttributionKitConfigurations": { "AttributionWindows": { "com.example.adNetwork": { "install": { "click": 2, "view": 1 } } } }
-
10:14 - Example Info.plist for configuring attribution window
{ "AdAttributionKitConfigurations": { "AttributionWindows": { "com.example.adNetwork": { "install": { "click": 2, "ignoreInteractionType": "view" } } } }
-
10:30 - Example Info.plist for configuring attribution window
{ "AdAttributionKitConfigurations": { "AttributionWindows": { "global": { "install": { "view": 3 } } "com.example.adNetwork": { "install": { "click": 5, "ignoreInteractionType": "view" } } } }
-
11:05 - Example Info.plist for configuring attribution window
{ "AdAttributionKitConfigurations": { "AttributionWindows": { "global": { "install": { "view": 3 } } "com.example.adNetwork": { "install": { "click": 5, "ignoreInteractionType": "view" } } } }
-
13:52 - Example Info.plist for configuring attribution cooldown
{ "AdAttributionKitConfigurations": { "AttributionCooldown": { "install-cooldown-hours": 6, "reengagement-cooldown-hours": 1 { } }
-
16:02 - Example install verification token payload
{ "iss": 13421973, "iat": 1745255692, "iid": "34890933", "vid": "46392455", "aud": "AppleDownloadVerification-v1", "bid": "com.example.marketplace", "dtype": "download", "nonce": "9BC2C5CC-A1F8-4F93-9D6A-4D524685B67E" }
-
16:26 - Example install verification token payload
{ "iss": 13421973, "iat": 1745255692, "iid": "34890933", "vid": "46392455", "aud": "AppleDownloadVerification-v1", "bid": "com.example.marketplace", "dtype": "download", "nonce": "9BC2C5CC-A1F8-4F93-9D6A-4D524685B67E", "ccode": "MT" }
-
17:05 - Example postback with country code
{ "ad-interaction-type": "click", "jws-string": "eyJraWQiOiJhcHBsZS1jYXMtaWRlbnRpZmllci8wIiwiYWxnIjoiRVMyNTYifQ.eyJhZHZlcnRpc2VkLWl0ZW0taWRlbnRpZmllciI6Njg0OTM5LCJjb252ZXJzaW9uLXR5cGUiOiJyZS1lbmdhZ2VtZW50IiwibWFya2V0cGxhY2UtaWRlbnRpZmllciI6ImNvbS5hcHBsZS5BcHBTdG9yZSIsImFkLW5ldHdvcmstaWRlbnRpZmllciI6InRlc3QuYWRhdHRyaWJ1dGlvbmtpdCIsImltcHJlc3Npb24tdHlwZSI6ImFwcC1pbXByZXNzaW9uIiwicG9zdGJhY2stc2VxdWVuY2UtaW5kZXgiOjAsInNvdXJjZS1pZGVudGlmaWVyIjoiODM0NCIsImRpZC13aW4iOnRydWUsInBvc3RiYWNrLWlkZW50aWZpZXIiOiIzZjUwZmU1Ny0yOWFlLTQ4NjEtOGMwYi1hYzZhZGRkZmY3MmMiLCJwdWJsaXNoZXItaXRlbS1pZGVudGlmaWVyIjo1ODM4NDkyfQ.AemK1x2ahIPKOnFEEscG4wvipRtR1G6DzpNF4M4joPb8POIH4FJjm4VvcNgLXc9rWBrEDQPvDblduoc7MFcK5w", "coarse-conversion-value": "medium", "country-code": "MT" }
-