メッセージ配信について

FCM は、メッセージ配信を分析するのに役立つツールを提供しています。Firebase コンソールに組み込まれた配信レポートと通知の目標到達プロセスの分析に加えて、FCM は Google BigQuery への包括的なデータ エクスポート機能も提供しています。

メッセージ配信レポート

送信したメッセージがユーザーに届いているかどうかを評価できます。Firebase コンソールの [Reports] タブでは、FCM SDK に送信されるメッセージ(Notifications Composer や FCM API を通じて送信されるメッセージなど)に関する以下のデータを確認できます。

  • 送信 - データ メッセージまたは通知メッセージが配信のためにキューに入れられているか、APN などのサードパーティのサービスに正常に渡されているかどうかを確認できます。詳細については、メッセージの有効期間をご覧ください。
  • インプレッション(Android デバイスの通知メッセージでのみ利用可能) - デバイスに表示通知が表示されているかどうかを確認できます。
  • オープン - ユーザーが通知メッセージを開いたかどうかを確認できます。

表示されるデータの日付範囲を設定できます。また、CSV にエクスポートするためのオプションも用意されています。

通知の目標到達プロセスの分析

組み込みの通知の目標到達プロセスの分析では、Firebase コンソールから送信された特定の通知にユーザーがどのように応答したかを、以下のデータとともに確認できます。

  • 送信された通知 - メッセージが配信のためにキューに入れられたか、APN などのサードパーティのサービスに正常に渡された。
  • 開かれた通知 - 開かれた通知の数。
  • コンバージョン イベント(定義されている場合)をトリガーしたユニーク ユーザーの数。

通知の目標到達プロセス分析を確認するには:

  1. Notifications Composer で [Notifications] タブを選択します。
  2. メッセージ リストで配信済みまたは配信予定のメッセージをクリックします。目標到達プロセス分析を含む画面が展開表示されます。

アナリティクスのレポートは定期的に更新されますが、ユーザーが通知を開いてから、そのイベントデータがコンソールに表示されるまでに時間がかかることがあります。

[Notifications] タブにあるこれらのレポートに加えて、カスタムの目標到達プロセスをアナリティクスで作成して、アプリ内の一連のステップの完了率を可視化することもできます。

BigQuery へのデータのエクスポート

メッセージ データを BigQuery にエクスポートしてさらに分析できます。BigQuery では、BigQuery SQL を使用してデータを分析したり、別のクラウド プロバイダにデータをエクスポートしたり、データをカスタム ML モデルで使用したりできます。詳しくは、BigQuery を Firebase にリンクするご覧ください。

  1. 開始するには、以下のいずれかのオプションを使用します。

    • Notifications Composer を開き、ページ下部の [Link BigQuery] をクリックします。

    • Firebase コンソールの統合ページで、[BigQuery] カードの [リンク] をクリックします。

      このページには、プロジェクト内のすべての FCM 対応アプリの FCM エクスポート オプションが表示されます。

  2. 画面上の指示に沿って BigQuery を有効にします。

プロジェクトを BiqQuery にリンクすると、次のようになります。

  • Firebase は BigQuery に既存データのコピーをエクスポートします。

  • Firebase は、Firebase プロジェクトから BigQuery へのデータの定期的な同期を設定します。

  • デフォルトでは、プロジェクト内のすべてのアプリは BigQuery にリンクされ、プロジェクトにその後に追加されるアプリもすべて BigQuery に自動的にリンクされます。また、データを送信するアプリを管理できます。

BigQuery Export を無効にするには、Firebase コンソールでプロジェクトのリンクを解除します。

BigQuery にエクスポートされるデータの概要

エクスポートされるテーブルのスキーマは次のとおりです。

_PARTITIONTIME TIMESTAMP この疑似列には、データが読み込まれた日の開始時点のタイムスタンプ(UTC)が含まれます。YYYYMMDD パーティションの場合、この疑似列には TIMESTAMP 値('YYYY-MM-DD')が入ります。
event_timestamp TIMESTAMP サーバーにより記録されたイベントのタイムスタンプ。
project_number INTEGER プロジェクト番号は、メッセージを送信したプロジェクトを示します。
message_id STRING メッセージ ID は、単一の一意のメッセージを示します。
instance_id STRING メッセージの送信先のアプリのインスタンス ID(利用可能な場合)。
message_type STRING メッセージのタイプ。通知メッセージまたはデータ メッセージのいずれかです。トピックまたはキャンペーンの送信における元のメッセージを識別するには、トピックが使用されます。後続のメッセージは、通知メッセージまたはデータ メッセージのいずれかです。
sdk_platform STRING 受信側のアプリのプラットフォーム。
app_name STRING Android アプリのパッケージ名または iOS アプリのバンドル ID。
collapse_key STRING 折りたたみキーは、折りたたむことができるメッセージのグループを示します。端末が接続されていない場合、指定された折りたたみキーを持つ最後のメッセージのみが後の配信のためにキューに入れられます。
priority INTEGER メッセージの優先度。有効な値は「normal」と「high」です。iOS では、これらは APNs 優先度の 5 と 10 に相当します。
ttl INTEGER このパラメータは、端末がオフラインの場合にメッセージを FCM のストレージに保持する期間(秒単位)を指定します。
topic STRING メッセージが送信されたトピックの名前(該当する場合)。
bulk_id INTEGER バルク ID は、トピックへの特定の送信など、関連するメッセージのグループを識別します。
device_recently_active BOOLEAN このパラメータは、端末が最近接続された場合に true となります。
event STRING イベントのタイプ。値は次のとおりです。
  • MESSAGE_ACCEPTED: メッセージは FCM サーバーによって受信され、リクエストは有効です。
  • MESSAGE_DELIVERED: メッセージが端末に送信されました。
  • MESSAGE_DELIVERED_ON_RECONNECT: 端末が再接続されたときにメッセージが端末に送信されました。
  • MISSING_REGISTRATIONS: 登録がないため、リクエストが拒否されました。
  • MESSAGE_EXPIRED: 端末が接続されて配信可能になる前にメッセージが期限切れになりました。
  • MESSAGE_DELAYED_DOZE: 端末が Doze モードになっているため、端末へのメッセージ配信は延期されました。
  • UNAUTHORIZED_REGISTRATION: 送信者に登録に送信する権限がないため、メッセージは拒否されました。
  • MESSAGE_COLLAPSED: メッセージは配信される前に同じ折りたたみキーを持つ新しいメッセージに置き換えられました。
  • MESSAGE_RECEIVED_INTERNAL_ERROR: メッセージ リクエストの処理中に特定できないエラーが発生しました。
  • MESSAGE_DELAYED_THROTTLED: 折りたたみキーのスロットル処理のために、デバイスへのメッセージ配信が延期されました。
  • MISMATCH_SENDER_ID: メッセージを送信する送信者 ID と、エンドポイントに対して宣言された ID の不一致により、メッセージの送信リクエストが拒否されました。
  • QUOTA_EXCEEDED: 割り当てが不足しているため、メッセージの送信リクエストが拒否されました。
  • INVALID_REGISTRATION: 登録が無効なため、メッセージの送信リクエストが拒否されました。
  • INVALID_PACKAGE_NAME: パッケージ名が無効なため、メッセージの送信リクエストが拒否されました。
  • INVALID_APNS_CREDENTIAL: APNS 証明書が無効なため、メッセージの送信リクエストが拒否されました。
  • INVALID_PARAMETERS: パラメータが無効なため、メッセージの送信リクエストが拒否されました。
  • PAYLOAD_TOO_LARGE: 制限を超えるペイロードにより、メッセージの送信リクエストが拒否されました。
  • DEVICE_NOT_FOUND: データベースに端末が見つからないため、メッセージの送信リクエストが拒否されました。
  • AUTHENTICATION_ERROR: 認証エラーのため、メッセージの送信リクエストが拒否されました(メッセージの送信に使用された API キーを確認してください)。
  • INVALID_TTL: TTL が無効なため、メッセージの送信リクエストが拒否されました。

エクスポートされたデータで可能な操作

送信されたメッセージ数をアプリごとにカウントする

SELECT app_name, COUNT(1)
FROM [<project name>:firebase_messaging.data]
WHERE
  _PARTITIONTIME = TIMESTAMP('<date as YYYY-MM-DD>')
  AND event = 'MESSAGE_ACCEPTED'
  AND message_id != ''
GROUP BY 1;

メッセージの対象となった一意のアプリのインスタンス数をカウントする

SELECT COUNT(DISTINCT instance_id)
FROM [<project name>:firebase_messaging.data]
WHERE
  _PARTITIONTIME = TIMESTAMP('<date as YYYY-MM-DD>')
  AND event = 'MESSAGE_ACCEPTED';

送信された通知メッセージ数をカウントする

SELECT COUNT(1)
FROM [<project name>:firebase_messaging.data]
WHERE
  _PARTITIONTIME = TIMESTAMP('<date as YYYY-MM-DD>')
  AND event = 'MESSAGE_ACCEPTED'
  AND message_type = 'DISPLAY_NOTIFICATION';

送信されたデータ メッセージ数をカウントする

SELECT COUNT(1)
FROM [<project name>:firebase_messaging.data]
WHERE
  _PARTITIONTIME = TIMESTAMP('<date as YYYY-MM-DD>')
  AND event = 'MESSAGE_ACCEPTED'
  AND message_type = 'DATA_MESSAGE';

通知コンソールからトピックまたはキャンペーンに送信されたメッセージ数をカウントする

SELECT COUNT(1)
FROM [<project name>:firebase_messaging.data]
WHERE
  _PARTITIONTIME = TIMESTAMP('<date as YYYY-MM-DD>')
  AND event = 'MESSAGE_ACCEPTED'
  AND bulk_id = <your bulk id> AND message_id != '';

特定のトピックまたはキャンペーンのファンアウト期間を計算する

ファンアウトの開始時間は、元のリクエストが受信された時間であり、終了時間は、単一インスタンスを対象とする最後の個別メッセージが作成された時間です。

SELECT
  TIMESTAMP_DIFF(
    end_timestamp, start_timestamp, MILLISECOND
  ) AS fanout_duration_ms,
  end_timestamp,
  start_timestamp
FROM (
    SELECT MAX(event_timestamp) AS end_timestamp
    FROM [<project name>:firebase_messaging.data]
    WHERE
      _PARTITIONTIME = TIMESTAMP('<date as YYYY-MM-DD>')
      AND event = 'MESSAGE_ACCEPTED'
      AND bulk_id = <your bulk id>
  ) sent
  CROSS JOIN (
    SELECT event_timestamp AS start_timestamp
    FROM [<project name>:firebase_messaging.data]
    WHERE
      _PARTITIONTIME = TIMESTAMP('<date as YYYY-MM-DD>')
      AND event = 'MESSAGE_ACCEPTED'
      AND bulk_id = <your bulk id>
      AND message_type = 'TOPIC'
  ) initial_message;

配信されたメッセージの割合をカウントする

SELECT
  messages_sent,
  messages_delivered,
  messages_delivered / messages_sent * 100 AS percent_delivered
FROM (
    SELECT COUNT(DISTINCT CONCAT(message_id, instance_id)) AS messages_sent
    FROM [<project name>:firebase_messaging.data]
    WHERE
      _PARTITIONTIME = TIMESTAMP('<date as YYYY-MM-DD>')
      AND event = 'MESSAGE_ACCEPTED'
  ) sent
  CROSS JOIN (
    SELECT COUNT(DISTINCT CONCAT(message_id, instance_id)) AS messages_delivered
    FROM [<project name>:firebase_messaging.data]
    WHERE
      _PARTITIONTIME = TIMESTAMP('<date as YYYY-MM-DD>')
      AND (event = 'MESSAGE_DELIVERED' OR event = 'MESSAGE_DELIVERED_ON_RECONNECT')
      AND message_id
      IN (
        SELECT message_id FROM [<project name>:firebase_messaging.data]
        WHERE
          _PARTITIONTIME = TIMESTAMP('<date as YYYY-MM-DD>')
          AND event = 'MESSAGE_ACCEPTED'
        GROUP BY 1
      )
  ) delivered;

指定されたメッセージ ID とインスタンス ID のすべてのイベントを追跡する

SELECT *
FROM [<project name>:firebase_messaging.data]
WHERE
    _PARTITIONTIME = TIMESTAMP('<date as YYYY-MM-DD>')
    AND message_id = '<your message id>'
    AND instance_id = '<your instance id>'
ORDER BY event_timestamp;

指定されたメッセージ ID とインスタンス ID のレイテンシを計算する

SELECT
  TIMESTAMP_DIFF(
    MAX(delivered_time), MIN(accepted_time), MILLISECOND
  ) AS latency_ms
FROM (
    SELECT event_timestamp AS accepted_time
    FROM [<project name>:firebase_messaging.data]
    WHERE
      _PARTITIONTIME = TIMESTAMP('<date as YYYY-MM-DD>')
      AND message_id = '<your message id>'
      AND instance_id = '<your instance id>'
      AND event = 'MESSAGE_ACCEPTED'
  ) sent
  CROSS JOIN (
    SELECT event_timestamp AS delivered_time
    FROM [<project name>:firebase_messaging.data]
    WHERE
      _PARTITIONTIME = TIMESTAMP('<date as YYYY-MM-DD>') AND
      message_id = '<your message id>' AND instance_id = '<your instance id>'
      AND (event = 'MESSAGE_DELIVERED' OR event = 'MESSAGE_DELIVERED_ON_RECONNECT')
  ) delivered;

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。