Adjust友達紹介プログラムのTips

この記事は、[and factory.inc Advent Calendar 2023](https://qiita.com/advent-calendar/2023/andfactory) **2日目** の記事です。
昨日は、@ticktakclockさんの「[【Jetpack Compose】特定の文字だけ色を変える](https://qiita.com/ticktakclock/items/d9cd0f508f082792fdbf)」でした。

# はじめに

弊社のあるアプリで、友達紹介キャンペーンをすることになりました。
紹介した人とされた人にインセンティブがもらえるというやつですね。
当初は紹介コードの発行や入力など要件を満たすものを自前で作ろうとしていましたが、Adjustに[友達紹介プログラム](https://help.adjust.com/ja/article/user-referrals)なるものがあることを発見し、こちらを使うことにしました。

今回はそのTipsを紹介しようと思います。
プラットフォームはAndroid/iOSのアプリです。

# 前提

[友達紹介プログラムの設定](https://help.adjust.com/ja/article/set-up-user-referrals)ページによると、2種類のコールバックが存在しどちらかを使って実現するようです。

- アトリビューションコールバック（推奨）
- サーバーコールバック

コールバックをアプリ内で処理するかサーバーで処理するかの違いで、アプリ内でコールバックを処理するほうが遅延なくインセンティブが付与ができることと、推奨されているという点から**アトリビューションコールバック**を使うことに決めました。
（先にオチを書いておくと、最終的にはサーバーコールバックを使うことになります。）

実装詳細については、開発ガイドに則って進めていくだけなので割愛します。

# デバッグ

デバッグは工夫が必要です。
正しくコールバックが呼ばれるようにするには、以下の2つの条件が必要になります。

- Adjustに、紹介された側の端末のインストールが計測されていないこと
- 紹介された側の端末に、紹介IDを含むリンクがアトリビュートされていること

また、紹介する側とされる側の2台のデバッグ用端末が必要になります。
さらに、デバッグ用のアプリは事前にダウンロードできるようにしておきます。
※今回はFirebase App Distribution（FAD）で配布しました。

詳しく見ていきましょう。

## 端末のインストールが計測されていないこと

一度でもアプリを起動するとAdjustにインストールが計測されてしまいますので、デバッグのたびに以下の方法で新規インストール扱いにする必要があります。

1. **Adjust Insights**というアプリをインストールして起動し、広告IDを確認する。
  a. Android: https://play.google.com/store/apps/details?id=com.adjust.insights
  b. iOS: https://apps.apple.com/jp/app/adjust-insights/id1125517808
2. 広告IDを、Adjust管理画面のテストコンソールに入力し「デバイスデータを表示」をクリックする。
3. 詳細情報が表示される場合はインストール計測済みなので「デバイス削除」をクリックする。

テストコンソールは、「AppView（アプリ管理）」→「｛アプリ名｝」→「テストコンソール」の順で遷移できると思います。（2023年11月時点）

## 紹介IDを含むリンクをアトリビュートする

Adjust管理画面から発行したトラッカーURLに、必要なパラメータ（今回はlabel）をつけます。
このURLを、紹介される側が踏むとストア（PlayStore/AppStore）にリダイレクトされます。
しかし、ストアで配布しているアプリはアトリビューションコールバックを処理する部分は記述されていないので、このままダウンロードしてしまうとインセンティブを受け取ることができません。
そこで、ストアにリダイレクトされたことを確認したらダウンロードせずにFADを開き、そこで配布しているアプリをダウンロードします。
アプリを起動するとAdjustに情報が送信され、Adjust管理画面からもインストールされていることを確認できます。
※リンクを踏んだタイミング・インストールしたタイミングそれぞれでAdjust管理画面を確認しましたが、そのタイミングでは管理画面から端末の情報を取得することはできませんでした。

Adjust管理画面でリンクトークンやリンク名に、設定した値が確認できればアトリビュートされていると判断して良いと思います。
![アトリビューション情報](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315465/673dacd9-fdee-1288-b00e-5dd0ce613ffe.png)

# つまづきポイント

デバッグを進めていくと、Androidでは無事にインセンティブの付与が確認されました。
しかし、iOSではATT許諾可否に応じて、挙動が異なっていました。
ATT許諾なしの場合はそもそもアトリビューションコールバックが来ないのかlabelが空なのか分かりませんがハンドリングできず、ATT許諾ありの場合でもコールバックが来るまでにかなりのタイムラグがありました。

調べてみると、開発ガイドに以下のように書かれていました。

:::note
iOSのアトリビューションコールバックのみ：​ Adjustサポートに連絡し、各アプリのアトリビューションコールバックの全データを有効にします。
:::

これだ・・・！ということでサポートに連絡をしたところ、ざっくり以下のような回答が。
「アトリビューションコールバックの全データを有効にした場合、ATT非許諾ユーザーのデータをアプリに送ることになるので、プライバシーの観点でアプリがストアでリジェクトされる可能性が考えられます。」
labelの情報だけがほしい場合でも、全データを有効にする必要があるらしく同様の懸念が残るということでした。
対応策としてサーバーコールバックを使うことで、サーバーに情報が送られることになるので回避できるようになるということでした。

少し古いデータですがATTの許諾率は２０%前後という情報もあり、全員にインセンティブが付与できないこの状態ではリリースできないと判断し、最終的にはサーバーコールバックを使うように修正しました。
アトリビューションコールバックが推奨されていた理由に『即時のインセンティブ付与』が挙げられていましたが、ATT許諾のタイミング次第ではインセンティブ付与に遅延があるようなので、結局サーバーコールバックのデメリットと一緒かなと。

前述のデバッグ方法でAndroid/iOSともにインセンティブの付与も確認できました！

# 最後に

Adjustサポートの方も実装ガイドと違うことを案内しなければならず恐縮されていましたが、対応は非常に早く、的確にアドバイスをいただけてとても助かりました。
とはいえ、実際問題として友達紹介プログラムでアトリビューションコールバックが使われるケースが全く思いつかないのですが、なにか良い活用方法をご存知の方はコメントででも教えていただきたいです。

こちらの記事が友達紹介プログラムを使って実装しようと考えている方の助けになれば嬉しいです。

明日の[Advent Calendar](https://qiita.com/advent-calendar/2023/andfactory)の記事もお楽しみに！:santa: