コンソールへ移動

メッセージ配信について

English Context Link

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

アナリティクス データをバッチ処理するため、このページの多くの統計情報はレポートに反映されるまで最大 24 時間かかる場合があります。

メッセージ配信レポート

送信したメッセージがユーザーに届いているかどうかを評価できます。Firebase コンソールの [レポート] タブでは、Android や iOS の FCM SDK に送信されたメッセージ(Notifications Composer および FCM API を介して送信されたメッセージを含む)に関して、以下のデータを表示できます。

  • 送信 - データ メッセージまたは通知メッセージが配信のためにキューに入れられているか、APN などのサードパーティのサービスに正常に渡されているかどうかを確認できます。詳細については、メッセージの有効期間をご覧ください。
  • 受信済み(Android デバイスでのみ利用可能) - データ メッセージまたは通知メッセージがアプリで受信されたかどうかを確認できます。このデータは、受信側の Android デバイスに FCM SDK 18.0.1 以降がインストールされている場合に提供されます。
  • インプレッション(Android デバイスの通知メッセージでのみ利用可能) - アプリがバックグラウンドで動作中に、デバイスに表示通知が表示されたかどうかを確認できます。
  • オープン - ユーザーが通知メッセージを開いたかどうかを確認できます。ここに含まれるのは、アプリがバックグラウンドで動作中に受信した通知のみです。

このデータは、通知ペイロードが設定されているすべてのメッセージと、ラベルが付いているすべてのデータ メッセージに関して提供されます。ラベルの詳細については、メッセージにアナリティクス ラベルを追加するをご覧ください。

メッセージ レポートを表示しているときに、表示されるデータの日付範囲を設定できます。また、CSV にエクスポートするためのオプションも用意されています。次に示す基準でフィルタすることもできます。

  • プラットフォーム(iOS または Android)
  • アプリ
  • カスタム アナリティクス ラベル

メッセージにアナリティクス ラベルを追加する

メッセージにラベルを付けると、配信統計情報をラベルやラベルセットでフィルタリングできるので、カスタム分析に非常に役立ちます。HTTP v1 API を使用して送信されるすべてのメッセージにラベルを追加するには、メッセージ オブジェクト内の fcmOptions.analyticsLabel フィールド、またはプラットフォーム固有の AndroidFcmOptions フィールドまたは ApnsFcmOptions フィールドを設定します。

アナリティクス ラベルは、^[a-zA-Z0-9-_.~%]{1,50}$ という形式の文字列です。ラベルには、大文字と小文字、数字、次の記号を含めることができます。

  • -
  • ~
  • %

最大長は 50 文字です。1 日あたり最大 100 個のユニークラベルを指定できます。この制限を超えるラベルが追加されたメッセージはレポートされません。

Firebase コンソールのメッセージの [レポート] タブで、既存のすべてのラベルの一覧を検索し、それらを単独でまたは組み合わせて適用して、表示される統計をフィルタすることができます。

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

組み込みの通知の目標到達プロセスの分析では、Firebase コンソールから送信された特定の通知にユーザーがどのように応答したかを確認できます。このビューでは、ターゲットとする iOS デバイスや Android デバイスについて、次のカテゴリのデータを確認できます。

  • 送信された通知 - 配信のためにキューに入れられたメッセージや、APN などのサードパーティのサービスに正常に渡されたメッセージ。古いトークンや無効な登録をターゲットにすると、統計値が膨れ上がることがあります。
  • 開かれた通知 - 開かれた通知の数。ここに含まれるのは、アプリがバックグラウンドで動作中に受信した通知のみです。
  • コンバージョン イベント(定義されている場合)をトリガーしたユニーク ユーザーの数。

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

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

アナリティクスのレポートは定期的に更新されますが、ユーザーが通知を開いてから、そのイベントデータがコンソールに表示されるまでに時間がかかることがあります。[Notifications] タブにあるこれらのレポートに加えて、カスタムの目標到達プロセスをアナリティクスで作成して、アプリ内の一連のステップの完了率を可視化することもできます。

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

メッセージ データを BigQuery にエクスポートしてさらに分析できます。BigQuery では、BigQuery SQL を使用してデータを分析したり、別のクラウド プロバイダにデータをエクスポートしたり、データをカスタム ML モデルで使用したりできます。BigQuery へのエクスポートには、プラットフォームやメッセージの種類、メッセージの送信手段(API、Notifications Composer)に関係なく、すべてのメッセージが含まれます。

詳しくは、BigQuery を Firebase にリンクするをご覧ください。

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

    • Notifications Composer を開き、ページ下部の [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;