Ir a la consola

Información sobre la entrega de mensajes

FCM ofrece herramientas para ayudarte a obtener información sobre la entrega de mensajes. Además de los informes sobre la entrega y el análisis de embudo de Notifications incorporados en Firebase console, FCM permite la exportación integral de datos a Google BigQuery.

Ten en cuenta que debido a la agrupación en lotes de los datos de estadísticas, el informe de muchas de las estadísticas que se muestran en esta página está sujeto a retrasos de hasta 24 horas.

Informes sobre la entrega de mensajes

Puedes evaluar si los mensajes que envías llegan a los usuarios. En la pestaña Informes de Firebase console, se muestran los siguientes datos de los mensajes que se envían a los SDK de FCM de iOS o Android, incluidos los que se envían mediante el Compositor de Notifications y las API de FCM:

  • Enviados: El mensaje de datos o de notificación se puso en cola para la entrega o se transmitió correctamente a un servicio de terceros, como los APNS, a fin de que se entregue. Consulta la duración de un mensaje para obtener más información.
  • Recibidos (solo disponible en los dispositivos Android): La app recibió el mensaje de datos o de notificación. Los datos estarán disponibles si el dispositivo Android receptor tiene instalada la versión 18.0.1 o posterior del SDK de FCM.
  • Impresiones (disponible solo para los mensajes de notificación en dispositivos Android): La notificación apareció en la pantalla del dispositivo mientras la app estaba en segundo plano.
  • Abiertos: El usuario abrió el mensaje de notificación. Solo se informa para las notificaciones que se recibieron cuando la app estaba en segundo plano.

Los datos están disponibles en todos los mensajes con carga útil de notificaciones y en todos los mensajes de datos etiquetados. Para obtener más información sobre las etiquetas, consulta Agrega etiquetas de estadísticas a los mensajes.

Cuando miras informes de mensajes, puedes definir un período para los datos que se muestran y tienes la opción de exportarlos en formato CSV. También puedes filtrar según estos criterios:

  • Plataforma (iOS o Android)
  • App
  • Etiquetas de estadísticas personalizadas

Agrega etiquetas de estadísticas a los mensajes

Etiquetar los mensajes es muy útil para los análisis personalizados, ya que te permite filtrar las estadísticas de entrega según etiquetas o conjuntos de ellas. Puedes agregar una etiqueta a cualquier mensaje enviado mediante la API de HTTP v1. Para ello, configura el campo fcmOptions.analyticsLabel del objeto message o los campos AndroidFcmOptions o ApnsFcmOptions específicos de la plataforma.

Las etiquetas de estadísticas son strings de texto que tienen el formato ^[a-zA-Z0-9-_.~%]{1,50}$. Pueden tener letras mayúsculas y minúsculas, números y los siguientes símbolos:

  • -
  • ~
  • %

La longitud máxima es de 50 caracteres Puedes especificar hasta 100 etiquetas únicas por día. No se informarán los mensajes con etiquetas que se agreguen después de llegar a esta cantidad.

En la pestaña Informes de mensajería de Firebase console, puedes buscar una lista de las etiquetas existentes y aplicarlas de manera individual o en conjunto a fin de filtrar las estadísticas que se muestran.

Análisis de embudo de Notifications

Un análisis de embudo de Notifications integrado permite ver cómo responden los usuarios a notificaciones específicas que se envían desde Firebase console. En esta vista, se incluyen los datos de los dispositivos iOS y Android de destino de las siguientes categorías:

  • Notificaciones enviadas: El mensaje se puso en cola para la entrega o se transmitió correctamente a un servicio de terceros, como los APNS, a fin de que se entregue. Ten en cuenta que la inclusión de tokens o registros inactivos puede inflar estas estadísticas.
  • Notificaciones abiertas: la cantidad de notificaciones que se abrieron. Solo se informa para las notificaciones que se recibieron cuando la app estaba en segundo plano.
  • La cantidad de usuarios únicos que activaron un evento de conversión (si se definió alguno).

Para ver el análisis de embudo de Notifications, sigue estos pasos:

  1. En el Compositor de Notifications, selecciona la pestaña Notifications.
  2. En la lista de mensajes, haz clic en un mensaje finalizado o en curso. Se mostrará una vista expandida que incluye un análisis de embudo.

Los informes de Analytics se actualizan periódicamente. Sin embargo, puede haber un retraso entre el momento en el que el usuario abre la notificación y en el que los datos del evento están disponibles en la consola. Además de estos informes en la pestaña Notifications, también puedes crear embudos personalizados en Analytics para ver el porcentaje de respuesta de una secuencia de pasos en tu app.

Exportación de datos a BigQuery

Puedes exportar tus datos de mensajes a BigQuery para analizarlos en detalle. Esta herramienta te permite analizar los datos con BigQuery SQL, exportarlos a otro proveedor de servicios en la nube o usarlos en tus modelos de AA personalizados. La exportación a BigQuery incluye todos los mensajes, independientemente de la plataforma, el tipo de mensaje, o si el mensaje se envía mediante la API o el Compositor de Notifications.

Consulta Vincula Firebase a BigQuery para obtener más información.

  1. Para comenzar, usa una de estas opciones:

    • Abre el Compositor de Notifications y selecciona Vincular BigQuery al final de la página.

    • En la página Integraciones de Firebase console, haz clic en Vincular en la tarjeta BigQuery.

      En esta página, verás las opciones de exportación de FCM para todas las apps del proyecto que tengan FCM habilitado.

  2. Sigue las instrucciones que aparecen en la pantalla para habilitar BigQuery.

Esto es lo que ocurre cuando vinculas el proyecto a BigQuery:

Para inhabilitar la exportación a BigQuery, desvincula el proyecto en Firebase console.

¿Qué datos se exportan a BigQuery?

Ten en cuenta que la inclusión de tokens o registros inactivos puede inflar algunas de estas estadísticas.

Este es el esquema de la tabla exportada:

_PARTITIONTIME MARCA DE TIEMPO Esta pseudocolumna contiene una marca de tiempo del inicio del día (en UTC) en el que se cargaron los datos. Para la partición AAAAMMDD, contiene el valor TIMESTAMP('AAAA-MM-DD').
event_timestamp MARCA DE TIEMPO La marca de tiempo del evento que registró el servidor.
project_number NÚMERO ENTERO El número de proyecto permite identificar qué proyecto envió el mensaje.
message_id STRING El ID del mensaje permite identificar un único mensaje.
instance_id STRING El ID de la instancia de la app a la que se envía el mensaje (si está disponible).
message_type STRING El tipo de mensaje. Puede ser un mensaje de notificación o uno de datos. Se usa el tema para identificar el mensaje original de un tema o una campaña enviados. Los mensajes posteriores son de notificación o de datos.
sdk_platform STRING La plataforma de la app receptora.
app_name STRING El nombre del paquete de las apps para Android o el ID de paquete de las apps para iOS.
collapse_key STRING La clave de contracción permite identificar un grupo de mensajes que puede contraerse. Si un dispositivo no está conectado, solamente el último mensaje que tenga una clave de contracción se pondrá en cola para entregarlo en el futuro.
priority NÚMERO ENTERO La prioridad del mensaje. Los valores válidos son “normal” y “alta”. En iOS, estos corresponden a las prioridades de APN 5 y 10.
ttl NÚMERO ENTERO Este parámetro especifica el tiempo (en segundos) que el mensaje se debe conservar en el almacenamiento de FCM si el dispositivo se encuentra sin conexión.
tema STRING El nombre del tema al que se envió un mensaje (si corresponde).
bulk_id NÚMERO ENTERO El ID masivo permite identificar un grupo de mensajes relacionados, como un envío particular a un tema.
device_recently_active BOOLEANO Este parámetro es verdadero si el dispositivo se conectó recientemente.
evento STRING El tipo de evento. Los valores posibles son los siguientes:
  • MESSAGE_ACCEPTED: el servidor de FCM recibió el mensaje y la solicitud es válida.
  • MESSAGE_DELIVERED: el mensaje se envió al dispositivo.
  • MESSAGE_DELIVERED_ON_RECONNECT: el mensaje se envió al dispositivo cuando este volvió a conectarse.
  • MISSING_REGISTRATIONS: se rechazó la solicitud debido a que faltaba un registro.
  • MESSAGE_EXPIRED: el mensaje caducó antes de que se conectara el dispositivo y no se pudo entregar.
  • MESSAGE_DELAYED_DOZE: la entrega del mensaje se retrasó porque el dispositivo se encuentra en modo de descanso.
  • UNAUTHORIZED_REGISTRATION: se rechazó el mensaje porque el remitente no tiene permiso para hacer envíos al registro.
  • MESSAGE_COLLAPSED: antes de poder entregar el mensaje, se lo reemplazó por uno más nuevo con la misma clave de contracción.
  • MESSAGE_RECEIVED_INTERNAL_ERROR: hubo un problema no especificado cuando se procesó la solicitud del mensaje.
  • MESSAGE_DELAYED_THROTTLED: se retrasó la entrega del mensaje al dispositivo debido a la regulación de la clave de contracción.
  • MISMATCH_SENDER_ID: se rechazó la solicitud para enviar un mensaje porque no coincidían el ID del remitente y el ID declarado en el punto de destino.
  • QUOTA_EXCEEDED: se rechazó la solicitud para enviar un mensaje porque la cuota era insuficiente.
  • INVALID_REGISTRATION: se rechazó la solicitud para enviar un mensaje porque el registro no era válido.
  • INVALID_PACKAGE_NAME: se rechazó la solicitud para enviar un mensaje porque el nombre del paquete no era válido.
  • INVALID_APNS_CREDENTIAL: se rechazó la solicitud para enviar un mensaje porque el certificado APNS no era válido.
  • INVALID_PARAMETERS: se rechazó la solicitud para enviar un mensaje porque los parámetros no eran válidos.
  • PAYLOAD_TOO_LARGE: se rechazó la solicitud para enviar un mensaje porque la carga útil excedía el límite.
  • DEVICE_NOT_FOUND: se rechazó la solicitud para enviar un mensaje porque no se encontró el dispositivo en nuestra base de datos.
  • AUTHENTICATION_ERROR: se rechazó la solicitud para enviar un mensaje porque hubo un problema de autenticación (compruebe la clave de API que se usó para enviar el mensaje).
  • INVALID_TTL: se rechazó la solicitud para enviar un mensaje porque el TTL no era válido.

¿Qué puedes hacer con los datos exportados?

Contar los mensajes que envió la app

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;

Contar las instancias de app únicas a las que se orientaron los mensajes

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

Contar los mensajes de notificación enviados

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

Contar los mensajes de datos enviados

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

Contar los mensajes enviados a un tema o una campaña desde la consola 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 != '';

Calcular la duración de la distribución de un tema o una campaña específicos

El tiempo de inicio de la distribución corresponde al momento en que se recibe la solicitud original, y el tiempo de finalización es el momento en que se crea el último mensaje individual dirigido a una sola instancia.

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;

Contar el porcentaje de mensajes entregados

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;

Hacer un seguimiento de todos los eventos de un ID de mensaje y un ID de instancia específicos

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;

Calcular la latencia de un ID de mensaje y un ID de instancia específicos

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;