FCM bietet drei Sätze von Tools, die Ihnen helfen, einen Einblick in die Nachrichtenzustellung zu erhalten:
- Firebase Berichte zur Nachrichtenzustellung in der Konsole
- Aggregierte Übermittlungsmesswerte des Android SDK aus der Firebase Cloud Messaging Data API
- Umfassender Datenexport nach Google BigQuery
Alle auf dieser Seite beschriebenen Berichtstools benötigen Google Analytics, damit sie funktionieren. Wenn Google Analytics für Ihr Projekt nicht aktiviert ist, können Sie es in den Firebase-Projekteinstellungen auf dem Tab Integrationen einrichten.
Beachten Sie, dass die Berichte zu vielen der Statistiken auf dieser Seite aufgrund der Batchverarbeitung von Analysedaten bis zu 24 Stunden verzögert sein können.
Berichte zur Nachrichtenübermittlung
Auf dem Tab Berichte in der Firebase-Konsole können Sie die folgenden Daten für Nachrichten abrufen, die an FCM-SDKs der Android- oder Apple-Plattform gesendet wurden, einschließlich derjenigen, die über den Benachrichtigungs-Composer und die FCM APIs gesendet wurden:
- Sendet: Die Datennachricht oder Benachrichtigung wurde zur Zustellung in die Warteschlange gestellt oder erfolgreich an einen Drittanbieterdienst wie APNs zur Zustellung weitergeleitet. Weitere Informationen finden Sie unter Lebensdauer einer Nachricht.
- Empfangen (nur auf Android-Geräten verfügbar): Die Datennachricht oder Benachrichtigung wurde von der App empfangen. Diese Daten sind verfügbar, wenn auf dem empfangenden Android-Gerät das FCM SDK 18.0.1 oder höher installiert ist.
- Impressionen (nur für Benachrichtigungsnachrichten auf Android-Geräten verfügbar): Die Benachrichtigung wurde auf dem Gerät angezeigt, während die App im Hintergrund ausgeführt wurde.
- Öffnet – Der Nutzer hat die Benachrichtigung geöffnet. Nur für Benachrichtigungen erfasst, die empfangen werden, während die App im Hintergrund läuft.
Diese Daten sind für alle Nachrichten mit einer Benachrichtigungsnutzlast und für alle Datennachrichten mit Label verfügbar. Weitere Informationen zu Labels finden Sie unter Analytics-Labels zu Nachrichten hinzufügen.
Wenn Sie sich Bericht zu Nachrichten ansehen, können Sie einen Zeitraum für die angezeigten Daten festlegen und sie in eine CSV-Datei exportieren. Sie können auch nach folgenden Kriterien filtern:
- Plattform (iOS oder Android)
- App
- Benutzerdefinierte Analyselabels
Nachrichten Analyselabels hinzufügen
Das Beschriften von E-Mails ist sehr nützlich für benutzerdefinierte Analysen, da Sie Zustellungsstatistiken nach Labels oder Labelsets filtern können. Sie können jeder Nachricht, die über die HTTP v1 API gesendet wird, ein Label hinzufügen. Dazu müssen Sie das Feld fcmOptions.analyticsLabel
im message-Objekt oder in den plattformspezifischen Feldern AndroidFcmOptions
oder ApnsFcmOptions
festlegen.
Analytics-Labels sind Textstrings im Format ^[a-zA-Z0-9-_.~%]{1,50}$
.
Labels können Klein- und Großbuchstaben, Zahlen und die folgenden Symbole enthalten:
-
~
%
Darf maximal 50 Zeichen lang sein. Sie können bis zu 100 einzelne Labels pro Tag angeben. Nachrichten mit Labels, die über dieses Limit hinausgehen, werden nicht erfasst.
Auf dem Tab Firebase Berichte können Sie in einer Liste aller vorhandenen Labels suchen und sie einzeln oder in Kombination anwenden, um die angezeigten Statistiken zu filtern.
Aggregierte Übermittlungsdaten über die FCM Data API
Mit der Firebase Cloud Messaging Data API können Sie Informationen abrufen, mit denen Sie die Ergebnisse von Nachrichtenanfragen nachvollziehen können, die auf Android-Apps ausgerichtet sind. Die API stellt aggregierte Daten für alle Android-Geräte in einem Projekt bereit, auf denen die Datenerhebung aktiviert ist. Dazu gehören Details zum Prozentsatz der ohne Verzögerung zugestellten Nachrichten sowie dazu, wie viele Nachrichten innerhalb der Android-Transportschicht verzögert oder verworfen wurden. Die Auswertung dieser Daten kann allgemeine Trends bei der Nachrichtenübermittlung aufzeigen und Ihnen helfen, effektive Möglichkeiten zur Verbesserung der Leistung Ihrer Sendeanfragen zu finden. Informationen dazu, welche Zeiträume in den Berichten verfügbar sind, finden Sie unter Zusammengefasste Datenzeitachsen.
Die API stellt alle für eine bestimmte Anwendung verfügbaren Daten bereit. Weitere Informationen finden Sie in der API-Referenzdokumentation.
Wie werden die Daten aufgeschlüsselt?
Die Übermittlungsdaten sind nach Anwendung, Datum und Analyselabel aufgeschlüsselt.
Ein API-Aufruf gibt Daten für jede Kombination aus Datum, Anwendung und Analyselabel zurück. Ein einzelnes androidDeliveryData
-JSON-Objekt könnte beispielsweise so aussehen:
{
"appId": "1:23456789:android:a93a5mb1234efe56",
"date": {
"year": 2021,
"month": 1,
"day": 1
},
"analyticsLabel": "foo",
"data": {
"countMessagesAccepted": "314159",
"messageOutcomePercents": {
"delivered": 71,
"pending": 15
},
"deliveryPerformancePercents": {
"deliveredNoDelay": 45,
"delayedDeviceOffline": 11
}
}
Messwerte auswerten
In den Zustellungsdaten sehen Sie den Prozentsatz der Nachrichten, die zu den einzelnen Messwerten passen. Es ist möglich, dass eine einzelne Nachricht mehreren Messwerten zugeordnet werden kann. Aufgrund von Einschränkungen bei der Datenerhebung und der Detailgenauigkeit, mit der die Messwerte aggregiert wurden, sind einige Nachrichtenergebnisse in den Messwerten gar nicht enthalten. Die Summe der Prozentsätze unten ergibt daher nicht 100 %.
Akzeptierte Nachrichten zählen
Im Dataset wird nur die Anzahl der Nachrichten berücksichtigt, die von FCM für die Übermittlung an Android-Geräte akzeptiert wurden. Dieser Wert wird als Nenner für alle Prozentsätze verwendet. Diese Anzahl umfasst keine Nachrichten, die auf Nutzer ausgerichtet sind, die die Erhebung von Nutzungs- und Diagnosedaten auf ihren Geräten deaktiviert haben.
Prozentuale Nachrichtenergebnisse
Die Felder im MessageOutcomePercents
-Objekt enthalten Informationen zu den Ergebnissen von Nachrichtenanfragen. Die Kategorien schließen sich gegenseitig aus. Sie können damit Fragen wie „Werden meine Nachrichten zugestellt?“ und „Warum werden Nachrichten nicht zugestellt?“ beantworten.
Beispielsweise könnte ein hoher Wert für das Feld droppedTooManyPendingMessages
darauf hinweisen, dass Anwendungsinstanzen Volumen nicht minimierbarer Nachrichten empfangen, die das Limit von FCM von 100 ausstehenden Nachrichten überschreiten.
Achten Sie darauf, dass Ihre App Aufrufe von onDeletedMessages
verarbeitet, und senden Sie gegebenenfalls minimierte Nachrichten. Hohe Prozentsätze für droppedDeviceInactive
können ebenfalls ein Signal sein, Registrierungstokens auf Ihrem Server zu aktualisieren, veraltete Tokens zu entfernen und die Themenabos aufzuheben. Best Practices in diesem Bereich finden Sie unter FCM-Registrierungstokens verwalten.
Prozentsatz der Auslieferungsleistung
Die Felder im Objekt DeliveryPerformancePercents
enthalten Informationen zu Nachrichten, die erfolgreich zugestellt wurden. Es kann Fragen wie „Haben meine Nachrichten verspätet empfangen?“ und „Warum sind Nachrichten verzögert?“ beantwortet. Ein hoher Wert für delayedMessageThrottled
würde beispielsweise deutlich darauf hinweisen, dass Sie die maximalen Limits pro Gerät überschreiten und die Rate, mit der Sie Nachrichten senden, anpassen sollten.
Prozentsätze der Statistiken zu Nachrichten
Dieses Objekt enthält zusätzliche Informationen zu allen gesendeten Nachrichten. Das Feld priorityLowered
gibt den Prozentsatz der akzeptierten Nachrichten an, deren Priorität von HIGH
auf NORMAL
gesenkt wurde. Wenn dieser Wert hoch ist, versuchen Sie, weniger Nachrichten mit hoher Priorität zu senden, oder achten Sie darauf, dass Sie immer eine Benachrichtigung anzeigen, wenn eine Nachricht mit hoher Priorität gesendet wird. Weitere Informationen zur Nachrichtenpriorität
Wie unterscheiden sich diese Daten von Daten, die nach BigQuery exportiert wurden?
Der BigQuery-Export stellt einzelne Nachrichtenlogs zur Annahme von Nachrichten durch das FCM-Back-End und zur Nachrichtenzustellung im SDK auf dem Gerät bereit (Schritte 2 und 4 der FCM-Architektur). Anhand dieser Daten können Sie prüfen, ob einzelne Nachrichten angenommen und zugestellt wurden. Weitere Informationen zum BigQuery-Datenexport finden Sie im nächsten Abschnitt.
Die Firebase Cloud Messaging Data API bietet dagegen aggregierte Details dazu, was genau in der Android-Transportschicht passiert (Schritt 3 der FCM-Architektur). Diese Daten geben insbesondere Aufschluss über die Zustellung von Nachrichten von FCM-Backends an das Android SDK. Sie ist besonders nützlich, um Trends zu sehen, warum Nachrichten bei diesem Transport verzögert oder verworfen wurden.
In einigen Fällen stimmen die beiden Datensätze möglicherweise nicht genau überein. Das kann folgende Gründe haben:
- Die aggregierten Messwerte basieren nur auf einem Teil aller Nachrichten.
- Die aggregierten Messwerte sind gerundete Werte
- Messwerte unter einem Datenschutzgrenzwert werden nicht angezeigt
- Ein Teil der Nachrichtenergebnisse fehlt aufgrund von Optimierungen bei der Verwaltung des hohen Traffic-Volumens.
Einschränkungen der API
Zeitachsen für aggregierte Daten
Die API gibt Verlaufsdaten für sieben Tage zurück. Die Daten, die von dieser API zurückgegeben werden, können jedoch um bis zu fünf Tage verzögert sein. So sind beispielsweise am 20. Januar bis zum 15. Januar die Daten für den Zeitraum vom 9. Januar bis zum 15. Januar verfügbar, jedoch nicht für den 16. Januar oder später. Außerdem werden die Daten nach dem Best-Effort-Prinzip bereitgestellt. Bei einem Datenausfall wird FCM versuchen, das Problem zu beheben, und die Daten nicht nachholen, nachdem das Problem behoben wurde. Bei größeren Ausfällen sind die Daten möglicherweise eine Woche oder länger nicht verfügbar.
Datenabdeckung
Die von der Firebase Cloud Messaging Data API bereitgestellten Messwerte sollen einen Überblick über allgemeine Trends bei der Nachrichtenübermittlung geben. Sie decken jedoch nicht alle Nachrichtenszenarien zu 100 % ab. Die folgenden Szenarien sind bekannte Ergebnisse, die nicht in den Messwerten berücksichtigt werden.
Abgelaufene Nachrichten
Wenn die Gültigkeitsdauer (TTL) nach dem Ende des angegebenen Logdatums abläuft, wird die Nachricht an diesem Datum nicht als droppedTtlExpired
gezählt.
Nachrichten an inaktive Geräte
Nachrichten, die an inaktive Geräte gesendet werden, werden je nach Datenpfad möglicherweise nicht im Datenpool aufgeführt. Dies kann zu einer falschen Zählung in den Feldern droppedDeviceInactive
und pending
führen.
Nachrichten an Geräte mit bestimmten Nutzereinstellungen
Die Nachrichten von Nutzern, die die Erhebung von Nutzungs- und Diagnosedaten auf ihren Geräten deaktiviert haben, werden gemäß ihren Einstellungen nicht gezählt.
Rundung und Minima
Bei der datengetriebenen Anzeigenbereitstellung werden Zählungen, bei denen die Volumen nicht groß genug sind, bewusst gerundet und ausgeschlossen.
BigQuery-Datenexport
Sie können Ihre Nachrichtendaten zur weiteren Analyse in BigQuery exportieren. In BigQuery können Sie die Daten mit BigQuery SQL analysieren, sie zu einem anderen Cloud-Anbieter exportieren oder für Ihre benutzerdefinierten ML-Modelle verwenden. Ein Export nach BigQuery enthält alle verfügbaren Daten für Nachrichten, unabhängig vom Nachrichtentyp oder davon, ob die Nachricht über die API oder den Benachrichtigungs-Editor gesendet wird.
Bei Nachrichten, die an Geräte mit den folgenden Mindestversionen des FCM SDK gesendet werden, haben Sie die zusätzliche Möglichkeit, den Export von Daten zur Nachrichtenübermittlung für Ihre App zu aktivieren:
- Android 20.1.0 oder höher
- iOS 8.6.0 oder höher
- Firebase Web SDK 9.0.0 oder höher
Weitere Informationen zum Aktivieren des Datenexports für Android und iOS finden Sie weiter unten.
Verknüpfen Sie zuerst Ihr Projekt mit BigQuery:
Wählen Sie eine der folgenden Optionen aus:
Öffnen Sie den Benachrichtigungs-Editor und klicken Sie unten auf der Seite auf Auf BigQuery zugreifen.
Klicken Sie in der Firebase Console auf der Seite Integrationen auf der Karte BigQuery auf Verknüpfen.
Auf dieser Seite werden die FCM-Exportoptionen für alle FCM-fähigen Apps im Projekt angezeigt.
Folgen Sie der Anleitung auf dem Bildschirm, um BigQuery zu aktivieren.
Weitere Informationen finden Sie unter Firebase mit BigQuery verknüpfen.
Wenn Sie den BigQuery-Export für Cloud Messaging aktivieren, gilt Folgendes:
Firebase exportiert Ihre Daten nach BigQuery. Die Erstübertragung der Daten für den Export kann bis zu 48 Stunden dauern.
Nachdem das Dataset erstellt wurde, kann der Speicherort nicht mehr geändert werden. Sie können das Dataset aber an einen anderen Speicherort kopieren oder es manuell verschieben, d. h. an einem anderen Speicherort neu erstellen. Weitere Informationen finden Sie unter Speicherort des Datasets ändern.
Firebase richtet regelmäßige Synchronisierungen Ihrer Daten aus Ihrem Firebase-Projekt mit BigQuery ein. Diese täglichen Exportvorgänge beginnen um 4:00 Uhr Pacific Time und sind in der Regel innerhalb von 24 Stunden abgeschlossen.
Standardmäßig werden alle Apps in Ihrem Projekt mit BigQuery verknüpft. Alle Apps, die Sie dem Projekt später hinzufügen, werden ebenfalls automatisch mit BigQuery verknüpft. Sie können festlegen, welche Apps Daten senden.
Zum Deaktivieren des BigQuery-Exports müssen Sie in der Firebase-Konsole die Verknüpfung des Projekts aufheben.
Export von Daten zur Nachrichtenübermittlung aktivieren
Auf Android-Geräten mit dem FCM SDK 20.1.0 oder höher kann der Datenexport der App zur Nachrichtenzustellung aktiviert werden. Der Datenexport ist standardmäßig auf App-Ebene deaktiviert. Wenn Sie es programmatisch auf App-Instanzebene aktivieren, können Sie Endnutzer um die Berechtigung bitten, ihre Daten zur Nachrichtenzustellung zu analysieren (empfohlen). Wenn beide festgelegt sind, wird der Wert auf App-Ebene durch den Wert auf App-Instanzebene überschrieben.
Bevor Sie diese Optionen aktivieren, müssen Sie zuerst den Link FCM-BiqQuery für Ihr Projekt erstellen, wie unter BigQuery-Datenexport beschrieben.
Export von Übermittlungsdaten für App-Instanzen aktivieren
In den meisten Fällen empfehlen wir, den Export von Daten zur Nachrichtenübermittlung nur auf App-Instanzebene zu aktivieren und auf App-Ebene deaktiviert zu lassen.
FirebaseMessaging.getInstance().setDeliveryMetricsExportToBigQuery(true)
Export von Übermittlungsdaten für eine App aktivieren
Wenn Sie den Export auf App-Ebene aktivieren möchten, rufen Sie die Methode setDeliveryMetricsExportToBigQuery
nicht auf und fügen Sie dem Anwendungsobjekt in Ihrem App-Manifest die folgende Property hinzu:
<application>
<meta-data android:name="delivery_metrics_exported_to_big_query_enabled"
android:value="true" />
</application>
Welche Daten werden nach BigQuery exportiert?
Beachten Sie, dass einige dieser Statistiken durch das Targeting auf veraltete Tokens oder inaktive Registrierungen möglicherweise aufgebläht werden.
Das Schema der exportierten Tabelle ist:
_PARTITIONTIME | TIMESTAMP | Diese Pseudospalte enthält einen Zeitstempel für den Beginn des Tages (in UTC), an dem die Daten geladen wurden. Für die Partition YYYYMMDD enthält diese Pseudospalte den Wert TIMESTAMP('YYYY-MM-DD'). |
event_timestamp | TIMESTAMP | Vom Server aufgezeichneter Zeitstempel des Ereignisses |
Projektnummer | INTEGER | Die Projektnummer identifiziert das Projekt, von dem die Nachricht gesendet wurde. |
message_id | STRING | Die Nachrichten-ID identifiziert eine Nachricht. Die Nachrichten-ID wird aus der App-ID und dem Zeitstempel generiert und ist in einigen Fällen möglicherweise nicht global eindeutig. |
instance_id | STRING | Die eindeutige ID der App, an die die Nachricht gesendet wird (falls verfügbar). Dies kann eine Instanz-ID oder eine Firebase-Installations-ID sein. |
message_type | STRING | Der Nachrichtentyp. Kann eine Benachrichtigungs- oder Datennachricht sein. „Topic“ wird verwendet, um die ursprüngliche Nachricht für ein Thema oder eine gesendeten Kampagne zu identifizieren. Die nachfolgenden Nachrichten sind entweder Benachrichtigungen oder Datennachrichten. |
sdk_platform | STRING | Die Plattform der Empfänger-App |
app_name | STRING | Paketname für Android-Apps oder Bundle-ID für iOS-Apps |
collapse_key | STRING | Der Minimierungsschlüssel identifiziert eine Gruppe von Nachrichten, die minimiert werden kann. Wenn ein Gerät nicht verbunden ist, wird nur die letzte Nachricht mit einem bestimmten Minimierungsschlüssel für die spätere Zustellung in die Warteschlange gestellt. |
Priorität | INTEGER | Die Priorität der Nachricht. Gültige Werte sind "normal" und "high". Unter iOS entsprechen diese den APN-Prioritäten 5 und 10. |
ttl | INTEGER | Dieser Parameter gibt an, wie lange (in Sekunden) die Nachricht im FCM-Speicher aufbewahrt werden soll, wenn das Gerät offline ist. |
Thema | STRING | Name des Themas, an das eine Nachricht gesendet wurde (falls zutreffend) |
bulk_id | INTEGER | Die Bulk-ID identifiziert eine Gruppe ähnlicher Nachrichten, z. B. eine bestimmte E-Mail an ein Thema. |
event | STRING | Der Typ des Ereignisses.
Mögliche Werte:
|
analytics_label | STRING | Mit der HTTP v1 API kann das Analyselabel beim Senden der Nachricht festgelegt werden, um die Nachricht zu Analysezwecken zu markieren. |
Was kann ich mit den exportierten Daten tun?
In den folgenden Abschnitten finden Sie Beispiele für Abfragen, die Sie in BigQuery für Ihre exportierten FCM-Daten ausführen können.
Gesendete Nachrichten nach App zählen
SELECT app_name, COUNT(1)
FROM `project ID.firebase_messaging.data`
WHERE
_PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
AND event = 'MESSAGE_ACCEPTED'
AND message_id != ''
GROUP BY 1;
Einzelne App-Instanzen zählen, auf die Nachrichten ausgerichtet sind
SELECT COUNT(DISTINCT instance_id)
FROM `project ID.firebase_messaging.data`
WHERE
_PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
AND event = 'MESSAGE_ACCEPTED';
Anzahl der gesendeten Benachrichtigungen
SELECT COUNT(1)
FROM `project ID.firebase_messaging.data`
WHERE
_PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
AND event = 'MESSAGE_ACCEPTED'
AND message_type = 'DISPLAY_NOTIFICATION';
Gesendeten Datennachrichten zählen
SELECT COUNT(1)
FROM `project ID.firebase_messaging.data`
WHERE
_PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
AND event = 'MESSAGE_ACCEPTED'
AND message_type = 'DATA_MESSAGE';
Gesendete Nachrichten an ein Thema oder eine Kampagne zählen
SELECT COUNT(1)
FROM `project ID.firebase_messaging.data`
WHERE
_PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
AND event = 'MESSAGE_ACCEPTED'
AND bulk_id = your bulk id AND message_id != '';
Wenn Sie Ereignisse für eine an ein bestimmtes Thema gesendete Nachricht erfassen möchten, ändern Sie diese Abfrage, indem Sie AND message_id != ''
durch AND message_id = <your message id>;
ersetzen.
Fan-out-Dauer für ein bestimmtes Thema oder eine bestimmte Kampagne berechnen
Der Beginn des Fanouts ist der Zeitpunkt, zu dem die ursprüngliche Anfrage empfangen wird, und die Endzeit ist der Zeitpunkt, zu dem die letzte einzelne Nachricht erstellt wird, die auf eine einzelne Instanz ausgerichtet ist.
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 ID.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 ID.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;
Prozentsatz der zugestellten Nachrichten
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 ID.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 ID.firebase_messaging.data` WHERE _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD') AND (event = 'MESSAGE_DELIVERED' AND message_id IN ( SELECT message_id FROM `project ID.firebase_messaging.data` WHERE _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD') AND event = 'MESSAGE_ACCEPTED' GROUP BY 1 ) ) delivered;
Alle Ereignisse für eine bestimmte Nachrichten-ID und Instanz-ID erfassen
SELECT *
FROM `project ID.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;
Latenz für eine bestimmte Nachrichten-ID und Instanz-ID berechnen
SELECT TIMESTAMP_DIFF( MAX(delivered_time), MIN(accepted_time), MILLISECOND ) AS latency_ms FROM ( SELECT event_timestamp AS accepted_time FROM `project ID.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 ID.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' ) delivered;