Firebase Cloud Messagingで開封周りの分析に必要なデータを整理する
3行で
- FCMでプッシュ通知の開封率を計算するにはAnalyticsの自動収集イベントが使える
- 特定のユーザーに対して配信された通知の一覧を取得するにはinstance_idをキーとすれば良さそう
- instance_idは端末に対してユニークではないので注意されたし
やりたいこと
Firebase Cloud Messagingで作ったプッシュ通知からBigQueryに出力されるデータで「誰にどの通知を送ったのか、どれが開封されたのか」を取って行動分析したい。
もう少し具体的に言うと、以下のようなことをしたい。
- 一斉に送ったプッシュ通知の開封率を計算する
- 特定のユーザーに送った通知の一覧を取得する
データの取り方を考える
まず開封率の事を考える。開封率は開封された通知の数 / 送った通知の総数
で求められるのでそれぞれをどうやったら取れるか考える。
送信済みのプッシュ通知の情報
まず、FirebaseとBigQueryを連携するとFCMの送信データが自動でBigQueryに連携されるので、送信された全通知のデータはここから取れる。
開封した記録
次に「どのユーザーがどの通知を開封したか」というデータを取得する。
iOS, AndroidともにFirebase Analyticsが入ってれば自動でイベントが収集されるんだけど、この中にnotification-open
というイベントがある。
これはプッシュ通知の開封を記録したイベントで、パラメータにanalytics_label
とユーザーIDが自動で渡される。
analytics_label
は通知の送信時に送信者側で任意の文字列を設定できるので、「20210924_キャッシュバックキャンペーン通知」みたいなのを設定しておけば開かれた通知の種類が判別できる。
analytics_label
をキーにすれば開封された通知の数 / 送った通知の総数
が計算できるので、開封率の計算に必要なデータはこの時点で揃った。
特定のユーザーに対して配信された通知の一覧を取得する
開封率に関しては計算できたんだけど、「特定のユーザーに対して配信された通知の一覧」はもうちょっと手がかかる。
BigQueryに連携された送信済みデータにはユーザーIDが紐付いていないので特定のユーザーに対して送った通知の絞り込みが出来ない。
送信された通知とユーザーIDの紐付け
先程言ったように、開封された通知に関してはユーザーIDが渡されるので紐付けが出来る。ただし、「送信されたけど開封されなかった」通知の一覧が分からないのが問題。
FCMから連携されてBigQueryに格納されたレコードには送信したプッシュ通知のレコードが並んでいるものの、それぞれの通知に対してユーザーIDや通知トークンが入ってるわけではない(もちろんAPIにユーザーIDを送信する口もない)。
ここで役に立つのがinstance_id
である。
instance_id
ドキュメントには以下のようにある。
読んだ当初、端末に対して一意なIDかと思ったのだけれどドキュメントを漁るとどうやらそうではない。(↓はAndroidのドキュメント)
Firebase Instance ID provides a unique identifier for each app instance and a mechanism to authenticate and authorize actions (example: sending FCM messages).
Firebase Instance IDはアプリのインスタンスに対してユニーク、とある。また、
Instance ID is stable except when:
- App deletes Instance ID
- App is restored on a new device
- User uninstalls/reinstall the app
- User clears app data
とあるので要するに
×:同じ端末に対して払い出されるIDは毎回同じ ○:5回アプリをインストールし直したりすと異なる5つのIDが払い出される
ということである。
また、instance_idは"${instance_id}:${token_body}"
という風にFCMのトークンの前半の文字列として使用されている。
つまり、ユーザーIDとinstance_id
が何かしらのDB上で紐付いていれば、BigQueryのデータと組み合わせることでユーザーIDからinstance_id
をキーにして特定のユーザーに対して送信された通知の一覧が取得できる。めでたしめでたし。
おわりに
FCMのドキュメントが微妙に散らばっていてこの辺の仕様を理解するのにやや時間を要してしまった。間違ってる記述があったら優しく教えて下さい...🙏
参考
BigQueryに連携されるFCMのデータ定義: firebase.google.com