Notificações 15 de outubro de 2025 13:30 Atualizado Essa tabela contém registros dos status/eventos associados às mensagens Latência nominal: 5 minutos Latência máxima: 15 minutos Objeto: clients_trustedzone.deltashare_core.notifications Retenção: 3 dias (D-0, D-1, D-2) Carga histórica inicial (em objeto separado): 360 dias A carga histórica deve ser combinada com a Blip para disponibilização, o objeto fica disponível por 7 dias para ingestão. [Exclusivo Canal WhatsApp] Regras status associados a envios de templates da Meta Novos status de mensagens podem ser atualizados nas tabelas com informação em até 30 dias. Ex:: se o usuário recebe um disparo hoje, mas só lê daqui a 28 dias, no mês que vem o status da mensagem é atualizado. O status de consumo/leitura só será disponibilizado quando o usuário possuir essa configuração ativada em seu WhatsApp Notifications Dentro da tabela notifications, é possível visualizar as informações de disparo de todas as notificações ativas e o status destes disparos estarão registrados na coluna "Event". O status pode ser: accepted -> mensagem foi aceita received -> mensagem recebida pelo usuário consumed -> mensagem foi lida pelo usuário failed -> ocorreu falha no disparo Para obter um maior número de informações do disparo, como nome do template enviado, responsável pelo disparo etc, é necessário fazer o relacionamento da tabela notifications com a tabela de mensagens. Quais chaves são necessárias para relacionar uma tabela com a outra? Dentro da coluna "Metadata", existem alguns objetos que são únicos e podem ser utilizados para relacionar com a tabela de mensagens. Abaixo um exemplo do Json existente nesta coluna: { "$elapsedTimeToStorage": "00:00:00.0082890", "#wa.timestamp": "1727274704", "#message.from": "botid@msging.net", "#wa.conversation.id": "00a9b99abad234c7b29c13626", "#wa.conversation.origin.type": "marketing", "#message.uniqueId": "46e1887a-e3d6-4696-bc4c-000000000", "traceparent": "00-a3f5436db296fbd9478f768208ea7ae3-530703ddd0000000-01", "$internalId": "58ea1971-40c4-4832-9cf2-d925ce336081", "$originatorSessionRemoteNode": "postmaster@broadcast.msging.net/!msging-server-ss000-ll2ss6kkk" } Será necessário salvar o objeto "#message.uniqueId", pois essa será a nossa principal chave para o relacionamento com a tabela de mensagens. Outra coluna importante, e que pode ser visualizada na tabela de mensagens é a coluna Id, ela refere-se ao Id do disparo. Nesse caso, se o disparo foi realizado em massa, todas as mensagens da coluna "messages" terão este mesmo Id. Caso tenha sido um disparo individualizado, o Id estará referenciado somente neste registro na coluna messages. Exemplo de query para listar as informações necessárias para realizar relionamento com a tabela messages: select OwnerIdentity, regexp_replace(split(From, '[/]')[1], '%40', '@') as From_, --Extrair somente id do usuário no formato telefone@wa.msging.net json_tuple(Metadata, '#message.uniqueId') (message_uniqueID), --UniqueId Event, Id, StorageDate, StorageDateBR, StorageDateDayBR from database.notification Messages Na tabela messages realizaremos o relacionamento da coluna "message_uniqueID" gerada na consulta anterior, e vamos relacioná-lo com o "InternalId" da tabela de mensagens. Exemplo de query: select * from database.message t1 inner join database.notification t2 on t1.InternalId = t2.messageID and t1.id = t2.id Após realizar o relacionamento você poderá obter algumas informações do disparo diretamente na coluna "Content", e outras informações diretamente na coluna "Metadata". Disparo Blip Desk Se o disparo da notificação foi realizado dentro do Desk você poderá obter informações como responsável pelo disparo (#activecampaign.attendanceRedirect) e se ele foi realizado de fato pela Blip Desk (#activecampaign.stateId, inicia-se sempre com desk:), assim como o nome da campanha (#activecampaign.name), através da coluna "Metadata". Abaixo exemplo do Json obtido de um disparo realizado pelo Blip Desk: { "$elapsedTimeToStorage": "00:00:00.0227413", "#activecampaign.stateId": "desk:66ab9488-ee9f-4c68-808007-cd4d7166a2cb", "#activecampaign.flowId": "0000000-6c69-4498-9f75-3c3d6852e556", "#activecampaign.masterState": "botid@msging.net", "#activecampaign.name": "Desk-Active-Campaing-d203351d-dbdc-45b8-a902-000000", "#activecampaign.contactNotMerged": "True", "#activecampaign.isToUseLiteApi": "False", "#activecampaign.attendanceRedirect": "atendente01%40teste.com.br@blip.ai", "traceparent": "00-6b767540d737e57b366b88cca0376820-000000000-01", "$internalId": "2c19855b-587c-48d1-80c1-00000000", "$originatorSessionRemoteNode": "postmaster@storage-activecampaign.msging.net/!msging-server-w6jss-00000", "#uniqueId": "2c19855b-587c-48d1-80c1-00000000", "#date_processed": "1727274700000", "date_created": "00000000000" } Já as informações referentes ao template utilizado, poderão ser obtidas diretamente da coluna "Content". Abaixo exemplo do código de disparo de um template de teste, cujo nome é "saudacao_inicial": { "type": "template", "template": { "language": { "policy": "deterministic", "code": "pt_BR" }, "name": "saudacao_inicial", "components": [ { "type": "body", "parameters": [ { "text": "Usuario", "type": "text" }, { "text": "Localidade", "type": "text" } ] } ] }, "templateContent": { "name": "saudacao_inicial", "language": "pt_BR", "components": [ { "type": "BODY", "text": "Olá! Aqui é {{1}}, da XXXXX {{2}}.", "example": { "bodyText": [ [ "nome", "localidade" ] ] } } ] } } Disparo em massa Para o disparo em massa o relacionamento das tabelas será realizado pelas mesmas colunas, a diferença, é que neste caso, o "Id" existente na notifications se repetirá para todos os destinatários daquele disparo, porém, como o relacionamento será feito, além da coluna "Id", também pelo "InternalId" da tabela messages, o relacionamento de será realizado de maneira individualizada sem maiores problemas. É importante que você saiba desse relacionamento, caso queira fazer algum filtro mais simples, como, obter o template name do Id = 'X', dessa maneira qualquer um dos disparos retornará o mesmo resultado. Tabela exemplo Abaixo query de exemplo para obter as in select t1.OwnerIdentity, t1.StorageDate, t1.toIdentity, decode(unbase64(t1.Content), 'UTF-16LE'):template.name as templateName, json_tuple(t1.Metadata, '#activecampaign.name') campaignName, case when t1.Metadata rlike 'desk:' then 'Sim' Else 'Nao' end as DisparoDesk, case when t1.Metadata rlike 'desk:' then t1.Metadata:['#activecampaign.attendanceRedirect'] Else 'EnvioMassa' end as SentBy, t2.Event as Status from database.message t1 inner join database.notification t2 on t1.InternalId = t2.Metadata:['#message.uniqueId'] and t1.id = t2.id where t1.ppDomain = 'broadcast.msging.net' Abaixo tabela gerada após relacionamento entre as tabelas: Tabela gerada relacionando informações Messages e Notification Volume de templates disparados Este documento descreve a consulta SQL utilizada para obter o volume de templates disparados por um chatbot no ambiente Databricks/Azure. A consulta analisa mensagens enviadas e correlaciona com eventos de notificação. Objetivo Obter a quantidade de disparos de templates a partir dos dados armazenados na tabela clients_trustedzone.deltashare_core.messages, agrupando-os pelo nome do template. Estrutura da Consulta A consulta executa as seguintes etapas: Extração dos Dados: Filtra mensagens enviadas pelo bot especificado (botid@msging.net). Decodifica o conteúdo da mensagem para obter o nome do template. Extraí informações da metadata, como nome da campanha e identificação de disparos via Desk. Define se a mensagem foi enviada via atendimento humano (#activecampaign.attendanceRedirect) ou envio em massa. Junção com Notificações: As mensagens são unidas com os eventos de notificação através dos campos InternalId e id. Agregação: Conta o total de disparos para cada templateName. Consulta SQL SELECT templateName, count(*) as QuantidadeDisparada FROM ( SELECT t1.OwnerIdentity, t1.StorageDate, t1.toIdentity, DECODE(UNBASE64(t1.Content), 'UTF-16LE')::template.name AS templateName, JSON_TUPLE(t1.Metadata, '#activecampaign.name') AS campaignName, CASE WHEN t1.Metadata RLIKE 'desk:' THEN 'Sim' ELSE 'Não' END AS DisparoDesk, CASE WHEN t1.Metadata RLIKE 'desk:' THEN t1.Metadata['#activecampaign.attendanceRedirect'] ELSE 'EnvioMassa' END AS SentBy, t2.Event AS Status FROM clients_trustedzone.deltashare_core.messages t1 INNER JOIN clients_trustedzone.deltashare_core.notifications t2 ON t1.InternalId = t2.Metadata['#message.uniqueId'] AND t1.id = t2.id WHERE t1.ppDomain = 'broadcast.msging.net' AND t1.OwnerIdentity = 'botid@msging.net' -- Seu bot ) GROUP BY templateName; Campos Utilizados Campo e Descrição templateName: Nome do template extraído do conteúdo da mensagem QuantidadeDisparada: Total de disparos do template OwnerIdentity: Identificação do bot responsável pelo disparo StorageDate: Data de armazenamento da mensagem toIdentity: Destinatário da mensagem campaignName: Nome da campanha associada ao disparo DisparoDesk: Indica se o disparo ocorreu via atendimento humano SentBy: Origem do disparo (atendimento humano ou envio em massa) Status: Status da notificação associada Considerações A consulta filtra mensagens enviadas apenas pelo bot especificado (botid@msging.net). Apenas mensagens enviadas via broadcast.msging.net são consideradas. A decodificação do conteúdo está em UTF-16LE para extrair corretamente o nome do template. O campo SentBy diferencia disparos manuais (via Desk) de disparos em massa. Status dos templates disparados Este documento detalha a consulta SQL utilizada para obter o status dos templates disparados por um chatbot no ambiente Databricks/Azure. A consulta analisa mensagens enviadas e correlaciona com eventos de notificação, permitindo visualizar a distribuição dos status por template. Objetivo Identificar a quantidade de mensagens enviadas para um template específico, categorizadas pelo status da notificação. Estrutura da Consulta A consulta executa as seguintes etapas: Extração dos Dados:Filtra mensagens enviadas pelo bot especificado (botid@msging.net). Decodifica o conteúdo da mensagem para obter o nome do template. Extraí informações da metadata, como nome da campanha e identificação de disparos via Desk. Define se a mensagem foi enviada via atendimento humano (#activecampaign.attendanceRedirect) ou envio em massa. Junção com Notificações: As mensagens são unidas com os eventos de notificação através dos campos InternalId e id. Filtragem por Template: Apenas mensagens relacionadas ao template templateName são consideradas. Agregação: Conta o total de disparos para cada combinação de templateName e Event. Consulta SQL SELECT templateName, Event, count(*) as Quantidade FROM ( SELECT t1.OwnerIdentity, t1.StorageDate, t1.toIdentity, t2.Event, DECODE(UNBASE64(t1.Content), 'UTF-16LE')::template.name AS templateName, JSON_TUPLE(t1.Metadata, '#activecampaign.name') AS campaignName, CASE WHEN t1.Metadata RLIKE 'desk:' THEN 'Sim' ELSE 'Não' END AS DisparoDesk, CASE WHEN t1.Metadata RLIKE 'desk:' THEN t1.Metadata['#activecampaign.attendanceRedirect'] ELSE 'EnvioMassa' END AS SentBy, t2.Event AS Status FROM clients_trustedzone.deltashare_core.messages t1 INNER JOIN clients_trustedzone.deltashare_core.notifications t2 ON t1.InternalId = t2.Metadata['#message.uniqueId'] AND t1.id = t2.id WHERE t1.ppDomain = 'broadcast.msging.net' AND t1.OwnerIdentity = 'botid@msging.net' -- Seu bot ) WHERE templateName = 'templateName' -- Nome do template GROUP BY templateName, Event; Campos Utilizados CampoDescrição templateName Nome do template extraído do conteúdo da mensagem Event Status da notificação associada ao disparo Quantidade Total de eventos para cada status OwnerIdentity Identificação do bot responsável pelo disparo StorageDate Data de armazenamento da mensagem toIdentity Destinatário da mensagem campaignName Nome da campanha associada ao disparo DisparoDesk Indica se o disparo ocorreu via atendimento humano SentBy Origem do disparo (atendimento humano ou envio em massa) Considerações A consulta filtra mensagens enviadas apenas pelo bot especificado (botid@msging.net). Apenas mensagens enviadas via broadcast.msging.net são consideradas. A decodificação do conteúdo está em UTF-16LE para extrair corretamente o nome do template. O campo SentBy diferencia disparos manuais (via Desk) de disparos em massa. A consulta considera apenas o template templateName. Para analisar outros templates, basta modificar esse filtro. Templates enviados em duplicidade Realizar um levantamento detalhado do volume total de templates enviados por um bot específico, quantificando tanto o volume de notificações ativas quanto a quantidade de usuários únicos que os receberam em um mesmo período. Essa mensuração deverá englobar: O total de mensagens de template, dado um status, pelo bot em questão; A volumetria agregada de usuários que receberam essas notificações; A contagem de usuários distintos atingidos por cada template; A possibilidade de segmentação por dia ou outro intervalo temporal definido, possibilitando uma visão do alcance e da penetração das notificações ativas. Objetivo Quantificar o volume de templates entregues aos usuários por meio de notificações ativas enviadas por um bot específico. WITH messages_filtered AS ( SELECT * FROM clients_trustedzone.deltashare_core.messages WHERE 1=1 AND StorageDateDayBR = "" -- filtre o período AND OwnerIdentity = "" -- filtre seu bot ), notifications_filtered AS ( SELECT * FROM clients_trustedzone.deltashare_core.notifications WHERE 1=1 AND StorageDateDayBR = "" -- filtre o período AND OwnerIdentity = "" -- filtre seu bot ), joined_data AS ( SELECT t1.OwnerIdentity, t1.StorageDateDayBR, t1.StorageDateBR, t1.toIdentity, decode(unbase64(t1.Content), 'UTF-16LE'):template . name AS templateName, t2.Event AS Status, ROW_NUMBER() OVER ( PARTITION BY CONCAT( CAST(t1.Content AS STRING), CAST(t1.Id AS STRING), CAST(t1.InternalId AS STRING), CAST(t1.Metadata AS STRING) ) ORDER BY t1.StorageDateBR DESC ) AS rn --chave artificial para deduplicacao de dados FROM messages_filtered t1 INNER JOIN notifications_filtered t2 ON t1.InternalId = t2.Metadata:[ '#message.uniqueId' ] AND t1.id = t2.id WHERE t1.ppDomain = 'broadcast.msging.net' AND Event = "received" -- filte pelo evento relavante para análise ) SELECT OwnerIdentity, StorageDateDayBR, StorageDateBR, toIdentity, templateName FROM joined_data WHERE 1 = 1 and rn = 1 Comentários messages_filtered e notifications_filtered isolam primeiro as tabelas de mensagens e notificações no schema clients_trustedzone.deltashare_core, restringindo por StorageDateDayBR e OwnerIdentity. Isso minimiza o volume de dados que será unido e processado nas etapas seguintes. A junção (INNER JOIN) relaciona cada mensagem à sua notificação via InternalId e id e filtra ainda por ppDomain = 'broadcast.msging.net', garantindo que sejam consideradas apenas mensagens do domínio. A função de janela ROW_NUMBER() OVER (PARTITION BY … ORDER BY StorageDateBR DESC) cria uma “chave artificial” concatenando todo o conteúdo da mensagem com seus identificadores. Só o registro mais recente (rn = 1) é mantido, evitando duplicatas. Objetivo Contabilizar quantos templates cada usuário recebeu em um mesmo dia por meio de notificações ativas enviadas por um bot específico. WITH messages_filtered AS ( SELECT * FROM clients_trustedzone.deltashare_core.messages WHERE 1=1 AND StorageDateDayBR = "" -- filtre o período AND OwnerIdentity = "" -- filtre seu bot ), notifications_filtered AS ( SELECT * FROM clients_trustedzone.deltashare_core.notifications WHERE 1=1 AND StorageDateDayBR = "" -- filtre o período AND OwnerIdentity = "" -- filtre seu bot ), joined_data AS ( SELECT t1.OwnerIdentity, t1.StorageDateDayBR, t1.StorageDateBR, t1.toIdentity, decode(unbase64(t1.Content), 'UTF-16LE'):template . name AS templateName, t2.Event AS Status, ROW_NUMBER() OVER ( PARTITION BY CONCAT( CAST(t1.Content AS STRING), CAST(t1.Id AS STRING), CAST(t1.InternalId AS STRING), CAST(t1.Metadata AS STRING) ) ORDER BY t1.StorageDateBR DESC ) AS rn --chave artificial para deduplicacao de dados FROM messages_filtered t1 INNER JOIN notifications_filtered t2 ON t1.InternalId = t2.Metadata:[ '#message.uniqueId' ] AND t1.id = t2.id WHERE t1.ppDomain = 'broadcast.msging.net' AND Event = "received" -- filte pelo evento relavante para análise ) SELECT DISTINCT OwnerIdentity, StorageDateDayBR, toIdentity, templateName, COUNT(*) OVER (PARTITION BY OwnerIdentity, toIdentity, StorageDateDayBR, templateName) AS totalTemplate FROM joined_data WHERE 1 = 1 and rn = 1 ORDER BY totalTemplate DESC, toIdentity; Comentários Mantém a mesma estratégia de ROW_NUMBER() OVER (PARTITION … ORDER BY StorageDateBR DESC) para assegurar que apenas o registro mais recente de cada mensagem única seja considerado. COUNT(*) OVER (PARTITION BY OwnerIdentity, toIdentity, StorageDateDayBR, templateName) garantir a contabilização da volumetria de templates repetidos enviados a um mesmo usuário em um mesmo período. Objetivo Contabilizar, para um template, o total de notificações enviadas e usuários únicos que as receberam em um dia por um bot específico. WITH messages_filtered AS ( SELECT * FROM clients_trustedzone.deltashare_core.messages WHERE 1=1 AND StorageDateDayBR = "" -- filtre o período AND OwnerIdentity = "" -- filtre seu bot ), notifications_filtered AS ( SELECT * FROM clients_trustedzone.deltashare_core.notifications WHERE 1=1 AND StorageDateDayBR -- filtre o período AND OwnerIdentity -- filtre seu bot ), joined_data AS ( SELECT t1.OwnerIdentity, t1.StorageDateDayBR, t1.StorageDateBR, t1.toIdentity, decode(unbase64(t1.Content), 'UTF-16LE'):template . name AS templateName, t2.Event AS Status, ROW_NUMBER() OVER ( PARTITION BY CONCAT( CAST(t1.Content AS STRING), CAST(t1.Id AS STRING), CAST(t1.InternalId AS STRING), CAST(t1.Metadata AS STRING) ) ORDER BY t1.StorageDateBR DESC ) AS rn --chave artificial para deduplicacao de dados FROM messages_filtered t1 INNER JOIN notifications_filtered t2 ON t1.InternalId = t2.Metadata:[ '#message.uniqueId' ] AND t1.id = t2.id WHERE t1.ppDomain = 'broadcast.msging.net' AND Event = "received" -- filte pelo evento relavante para análise ) SELECT OwnerIdentity, StorageDateDayBR, templateName, COUNT(toIdentity) AS qtyUsersReceived, COUNT(DISTINCT toIdentity) AS qtyUniqueUsersReceived, qtyUsersReceived - qtyUniqueUsersReceived as Diff FROM joined_data WHERE 1 = 1 and rn = 1 group by 1,2,3 Análises no roadmap da documentação: Status dos templates disparados Falhas e motivos Tempos até o recebimento e leitura/consumo Correlação com a messages para resposta do usuário Correlação com a eventtracks para visão de jornada Para mais informações, acesse a discussão sobre o assunto em nossa comunidade ou os vídeos no nosso canal. 😃 Artigos relacionados Como analisar as skills do meu chatbot com a jornada dos contatos [Data Flow] [Cliente] Guia e Documentação V1 Como criar gráficos em um relatório customizado Mensagens Como utilizar variáveis nas respostas prontas do Blip Desk