2歩戻ったら2.5歩進みたい

関東で働くweb developerのブログ

Firebase Cloud Messagingで開封周りの分析に必要なデータを整理する

3行で

  • FCMでプッシュ通知の開封率を計算するにはAnalyticsの自動収集イベントが使える
  • 特定のユーザーに対して配信された通知の一覧を取得するにはinstance_idをキーとすれば良さそう
  • instance_idは端末に対してユニークではないので注意されたし

やりたいこと

Firebase Cloud Messagingで作ったプッシュ通知からBigQueryに出力されるデータで「誰にどの通知を送ったのか、どれが開封されたのか」を取って行動分析したい。

もう少し具体的に言うと、以下のようなことをしたい。

  • 一斉に送ったプッシュ通知の開封率を計算する
  • 特定のユーザーに送った通知の一覧を取得する

データの取り方を考える

まず開封率の事を考える。開封率は開封された通知の数 / 送った通知の総数で求められるのでそれぞれをどうやったら取れるか考える。

送信済みのプッシュ通知の情報

まず、FirebaseとBigQueryを連携するとFCMの送信データが自動でBigQueryに連携されるので、送信された全通知のデータはここから取れる。

firebase.google.com

開封した記録

次に「どのユーザーがどの通知を開封したか」というデータを取得する。

iOS, AndroidともにFirebase Analyticsが入ってれば自動でイベントが収集されるんだけど、この中にnotification-openというイベントがある。

これはプッシュ通知の開封を記録したイベントで、パラメータにanalytics_labelとユーザーIDが自動で渡される。

support.google.com

analytics_labelは通知の送信時に送信者側で任意の文字列を設定できるので、「20210924_キャッシュバックキャンペーン通知」みたいなのを設定しておけば開かれた通知の種類が判別できる。

analytics_labelをキーにすれば開封された通知の数 / 送った通知の総数が計算できるので、開封率の計算に必要なデータはこの時点で揃った。

特定のユーザーに対して配信された通知の一覧を取得する

開封率に関しては計算できたんだけど、「特定のユーザーに対して配信された通知の一覧」はもうちょっと手がかかる。

BigQueryに連携された送信済みデータにはユーザーIDが紐付いていないので特定のユーザーに対して送った通知の絞り込みが出来ない。

送信された通知とユーザーIDの紐付け

先程言ったように、開封された通知に関してはユーザーIDが渡されるので紐付けが出来る。ただし、「送信されたけど開封されなかった」通知の一覧が分からないのが問題。

FCMから連携されてBigQueryに格納されたレコードには送信したプッシュ通知のレコードが並んでいるものの、それぞれの通知に対してユーザーIDや通知トークンが入ってるわけではない(もちろんAPIにユーザーIDを送信する口もない)。

ここで役に立つのがinstance_idである。

instance_id

ドキュメントには以下のようにある。

instance_id: メッセージの送信先のアプリのインスタンス ID(利用可能な場合)

読んだ当初、端末に対して一意なIDかと思ったのだけれどドキュメントを漁るとどうやらそうではない。(↓はAndroidのドキュメント)

firebase.google.com

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