Buka konsol

Memahami pengiriman pesan

FCM menyediakan berbagai fitur untuk membantu Anda mendapatkan insight tentang pengiriman pesan. Selain laporan pengiriman dan analisis funnel notifikasi yang merupakan fitur built-in di Firebase console, FCM menyediakan fitur ekspor data yang komprehensif ke Google BigQuery.

Perhatikan bahwa pelaporan banyak statistik di halaman ini dapat ditunda hingga 24 jam untuk pengelompokan data analisis.

Laporan pengiriman pesan

Anda dapat mengevaluasi apakah pesan yang Anda kirim sampai ke pengguna atau tidak. Di tab Laporan di Firebase console, Anda dapat melihat data berikut untuk pesan yang dikirim ke Android atau iOS FCM SDK, termasuk yang dikirim melalui Notifications composer dan FCM API:

  • Mengirim - Pesan data atau pesan notifikasi telah masuk antrean pengiriman atau telah berhasil diteruskan ke layanan pihak ketiga seperti APN untuk dikirimkan. Baca artikel tentang masa aktif pesan untuk mengetahui informasi lebih lanjut.
  • Diterima (khusus di perangkat Android) — Pesan data atau pesan notifikasi telah diterima oleh aplikasi. Data ini tersedia jika perangkat Android yang menerimanya telah menginstal FCM SDK 18.0.1 atau lebih tinggi.
  • Tayangan (khusus untuk pesan notifikasi di perangkat Android) — Notifikasi tampilan yang memberitahukan bahwa pesan telah ditampilkan di perangkat saat aplikasi berada di background.
  • Membuka - Pengguna telah membuka pesan notifikasi. Dilaporkan hanya untuk notifikasi yang diterima ketika aplikasi berada di background.

Data ini tersedia untuk semua pesan dengan payload notifikasi dan semua pesan data berlabel. Untuk mempelajari label lebih lanjut, baca artikel mengenai Menambahkan label analisis ke pesan.

Saat melihat laporan pesan, Anda dapat menetapkan rentang tanggal untuk data yang ditampilkan, dengan opsi untuk mengekspor file ke CSV. Anda juga dapat melakukan pemfilteran berdasarkan kriteria berikut:

  • Platform (iOS atau Android)
  • Aplikasi
  • Label analisis kustom

Menambahkan label analisis ke pesan

Memberi label pada pesan sangat berguna untuk analisis kustom, sehingga Anda dapat memfilter statistik pengiriman dengan label atau sekumpulan label. Anda dapat menambahkan label ke pesan mana pun yang dikirim melalui HTTP v1 API, dengan menyetel kolom fcmOptions.analyticsLabel di objek pesan, atau di kolom AndroidFcmOptions atau ApnsFcmOptions dari platform tertentu.

Label analisis adalah string teks dalam format ^[a-zA-Z0-9-_.~%]{1,50}$. Label dapat meliputi huruf besar dan kecil, angka, serta simbol berikut:

  • -
  • ~
  • %

Panjang maksimal adalah 50 karakter. Anda dapat menentukan hingga 100 label unik per hari. Pesan dengan label yang ditambahkan di luar batas tersebut tidak akan dilaporkan.

Di tab Laporan dari Firebase console messaging, Anda dapat menelusuri daftar semua label yang ada dan menerapkannya sendiri-sendiri atau bersama-sama untuk memfilter statistik yang ditampilkan.

Analisis funnel notifikasi

Analisis funnel Notifcations merupakan fitur built-in dan menunjukkan cara pengguna merespons notifikasi tertentu yang dikirim dari Firebase console. Tampilan ini meliputi data untuk perangkat iOS dan Android yang ditargetkan dalam kategori ini:

  • Notifikasi terkirim — Pesan telah masuk anteran pengiriman atau telah berhasil diteruskan ke layanan pihak ketiga seperti APN untuk dikirimkan. Perhatikan bahwa penargetan token basi atau pendaftaran tidak aktif dapat meningkatkan statistik ini.
  • Notifikasi dibuka — Jumlah notifikasi yang telah dibuka. Dilaporkan hanya untuk notifikasi yang diterima ketika aplikasi berada di latar belakang.
  • Jumlah pengguna unik yang telah memicu peristiwa konversi, jika ditentukan.

Untuk melihat Analisis funnel Notifications:

  1. Di Notifications Composer, pilih tab Notifikasi.
  2. Klik pada pesan yang telah selesai atau sedang diproses dalam daftar pesan. Tampilan yang diperluas yang menyertakan Analisis funnel akan ditampilkan.

Laporan Analytics diperbarui secara berkala, tetapi kemungkinan ada penundaan antara saat pengguna membuka notifikasi dan saat data peristiwa tersedia di konsol. Selain berbagai laporan pada tab Notifications, Anda juga dapat membuat funnel kustom di Analytics untuk memvisualisasikan rasio penyelesaian rangkaian langkah dalam aplikasi Anda.

Ekspor data BigQuery

Anda dapat mengekspor data pesan ke BigQuery untuk dianalisis lebih lanjut. Dengan BigQuery, Anda dapat menganalisis data menggunakan BigQuery SQL, mengekspornya ke penyedia cloud lain, atau menggunakan data tersebut untuk model ML kustom Anda. Ekspor ke BigQuery meliputi semua pesan, terlepas dari platform, jenis pesan, atau apakah pesan dikirim melalui API atau Notifications composer.

Baca halaman Menautkan Firebase ke BigQuery untuk mendapatkan informasi lebih lanjut.

  1. Untuk memulai, gunakan salah satu opsi berikut:

    • Buka Notifications composer, lalu klik Tautkan BigQuery di bagian bawah halaman.

    • Dari halaman Integrasi di Firebase console, klik Tautkan di kartu BigQuery.

      Halaman ini menampilkan opsi ekspor FCM untuk semua aplikasi yang dilengkapi FCM dalam project.

  2. Ikuti petunjuk di layar untuk mengaktifkan BigQuery.

Saat Anda menautkan project ke BiqQuery:

Untuk menonaktifkan BigQuery Export, batalkan tautan project Anda di Firebase console.

Data apa yang diekspor ke BigQuery?

Perhatikan bahwa penargetan token usang atau pendaftaran tidak aktif dapat meningkatkan statistik ini.

Skema dari tabel yang diekspor adalah:

_PARTITIONTIME TIMESTAMP Kolom pseudo ini memuat stempel waktu untuk awal hari (dalam UTC) yaitu saat data dimuat. Untuk partisi YYYYMMDD, kolom pseudo ini berisi nilai TIMESTAMP('YYYY-MM-DD').
event_timestamp TIMESTAMP Stempel waktu peristiwa seperti yang dicatat oleh server
project_number INTEGER Nomor project mengidentifikasi project yang mengirim pesan
message_id STRING ID pesan mengidentifikasi satu pesan unik
instance_id STRING ID instance aplikasi penerima pesan (jila tersedia)
message_type STRING Jenis pesannya. Dapat berupa Pesan notifikasi atau Pesan data. Topik digunakan untuk mengidentifikasi topik atau kampanye yang dikirim pada pesan asli; pesan berikutnya berupa pesan notifikasi atau data.
sdk_platform STRING Platform aplikasi penerima
app_name STRING Nama paket untuk aplikasi Android atau ID paket untuk aplikasi iOS
collapse_key STRING Kunci penciutan mengidentifikasi sekelompok pesan yang dapat diciutkan. Ketika perangkat tidak tersambung, hanya pesan terakhir dengan kunci penciutan tertentu yang dimasukkan antrean untuk akhirnya dikirim
priority INTEGER Prioritas pesan. Nilai yang valid adalah "normal" dan "tinggi". Pada iOS, nilai ini sama dengan prioritas APN 5 dan 10.
ttl INTEGER Parameter ini menetapkan berapa lama (dalam detik) pesan harus disimpan dalam penyimpanan FCM jika perangkat sedang offline
topic STRING Nama topik penerima pesan (jika ada)
bulk_id INTEGER ID massal mengidentifikasi sekelompok pesan terkait, seperti pengiriman tertentu ke suatu topik
device_recently_active BOOLEAN Parameter ini BENAR jika perangkat telah tersambung baru-baru ini
event STRING Jenis peristiwa. Kemungkinan nilainya adalah:
  • MESSAGE_ACCEPTED: pesan diterima oleh server FCM dan permintaan valid;
  • MESSAGE_DELIVERED: pesan telah dikirim ke perangkat;
  • MESSAGE_DELIVERED_ON_RECONNECT: pesan dikirim ke perangkat saat perangkat tersambung kembali;
  • MISSING_REGISTRATIONS: permintaan ditolak karena pendaftaran tidak ada;
  • MESSAGE_EXPIRED: masa berlaku pesan habis sebelum perangkat tersambung, dan pesan bisa jadi telah dikirimkan;
  • MESSAGE_DELAYED_DOZE: pengiriman pesan ke perangkat ditunda karena perangkat berada dalam mode istirahat;
  • UNAUTHORIZED_REGISTRATION: pesan ditolak karena pengirim tidak memiliki otorisasi untuk mengirim pesan ke pendaftaran;
  • MESSAGE_COLLAPSED: pesan digantikan dengan pesan yang lebih baru dengan kunci penciutan yang sama sebelum dapat dikirimkan;
  • MESSAGE_RECEIVED_INTERNAL_ERROR: terjadi error yang belum ditetapkan saat memproses permintaan pesan;
  • MESSAGE_DELAYED_THROTTLED: pengiriman pesan ke perangkat ditunda karena adanya throttling tombol penciutannya;
  • MISMATCH_SENDER_ID: permintaan untuk mengirim pesan ditolak karena ada ketidakcocokan antara ID pengirim yang mengirim pesan, dan ID pengirim yang dinyatakan untuk endpoint;
  • QUOTA_EXCEEDED: permintaan untuk mengirim pesan ditolak karena kuota tidak mencukupi;
  • INVALID_REGISTRATION: permintaan untuk mengirim pesan ditolak karena pendaftaran tidak valid;
  • INVALID_PACKAGE_NAME: permintaan untuk mengirim pesan ditolak karena nama paket tidak valid;
  • INVALID_APNS_CREDENTIAL: permintaan untuk mengirim pesan ditolak karena sertifikat APN tidak valid;
  • INVALID_PARAMETERS: permintaan untuk mengirim pesan ditolak karena parameter tidak valid;
  • PAYLOAD_TOO_LARGE: permintaan untuk mengirim pesan ditolak karena payload melampaui batas;
  • DEVICE_NOT_FOUND: permintaan untuk mengirim pesan ditolak karena perangkat tidak ditemukan di database kami;
  • AUTHENTICATION_ERROR: permintaan untuk mengirim pesan ditolak karena terjadi error autentikasi (periksa Kunci API yang digunakan untuk mengirim pesan);
  • INVALID_TTL: permintaan untuk mengirim pesan ditolak karena TTL tidak valid.

Apa yang dapat dilakukan dengan data yang diekspor?

Menghitung pesan yang dikirim oleh aplikasi

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;

Menghitung instance aplikasi unik yang ditargetkan oleh pesan

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

Menghitung pesan notifikasi yang terkirim

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';

Menghitung pesan data yang terkirim

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';

Menghitung pesan yang dikirim ke suatu topik atau kampanye dari konsol Notifications

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 != '';

Menghitung durasi fanout untuk topik atau kampanye tertentu

Waktu mulai fanout adalah ketika permintaan asli diterima, dan waktu berakhirnya adalah ketika pesan individual terakhir yang menargetkan satu instance dibuat.

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;

Menghitung persentase pesan yang terkirim

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;

Melacak semua peristiwa untuk ID pesan dan ID instance tertentu

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;

Menghitung latensi untuk ID pesan dan ID instance tertentu

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;