Este post mostra, de forma direta e prática, como usar os eventos do AI Web Push no Google Tag Manager (GTM), como ativar o debug e como criar métricas e conversões com base nesses eventos. Não precisa de SDK extra: tudo chega ao GTM via dataLayer.push.
Atualizado para a versão 1.9.3 do plugin. A versão 1.9.3 traz dois eventos novos, ai_web_push_permission_timeout e ai_web_push_subscription_skipped, e duas origens novas no push_source. O que mudou com o Chrome 155 está no post O aviso de notificação do Chrome mudou no Android.
Visão geral
Os eventos de push são enviados ao GTM via dataLayer com prefixo ai_web_push_... e provider ai_web_push.
O campo push_source indica a origem:
- custom_modal: fluxo via modal personalizado.
- native_prompt: fluxo direto no prompt do navegador.
- site_controls indica que o visitante liberou a notificação depois, pelos controles do site no navegador. Aparece nos eventos de inscrição, a partir da versão 1.9.3.
- permission_preexisting indica que o visitante já tinha dado a permissão no navegador, mas ainda não estava cadastrado no AI Web Push, e o plugin cadastra na visita seguinte. Aparece nos eventos de inscrição, a partir da versão 1.9.3.
A partir da versão 1.7.5, o plugin detecta automaticamente se o navegador suporta notificações push. Caso não suporte (WebViews do Instagram, Facebook, TikTok, iOS Safari fora de PWA, contextos sem HTTPS), o evento ai_web_push_browser_not_supported é disparado e o fluxo encerra sem erros.
Debug opcional: localStorage['ai-web-push-debug'] = 'true' para ver todos os eventos no console.
Eventos disponíveis
| Evento | Quando dispara | Campos no dataLayer |
|---|---|---|
ai_web_push_browser_not_supported | Navegador não suporta a API de notificações (WebViews, iOS Safari, contextos inseguros) | push_provider: ai_web_push, push_source: native_prompt |
ai_web_push_modal_shown | Modal personalizado foi exibido | push_provider: ai_web_push, push_source: custom_modal |
ai_web_push_modal_accepted | Usuário clicou “Aceitar” no modal personalizado | push_provider: ai_web_push, push_source: custom_modal |
ai_web_push_modal_dismissed | Usuário clicou “Cancelar” no modal personalizado. Também sai depois de ai_web_push_permission_denied. A partir da versão 1.9.3, não sai mais quando o pedido do navegador expira ou é fechado sem resposta. | push_provider: ai_web_push, push_source: custom_modal |
ai_web_push_prompt_shown | Notification.requestPermission() foi chamado | push_provider: ai_web_push, push_source: custom_modal ou native_prompt |
ai_web_push_permission_granted | Usuário aceitou no prompt nativo | push_provider: ai_web_push, push_source: custom_modal ou native_prompt |
ai_web_push_permission_denied | Usuário negou o prompt nativo. Na versão 1.9.3 do plugin ou mais nova, o pedido que expira ou é fechado sem resposta não entra aqui, e vai para o ai_web_push_permission_timeout. | push_provider: ai_web_push, push_source: custom_modal ou native_prompt |
ai_web_push_permission_timeout | O pedido terminou sem resposta, porque expirou ou foi fechado. Não é recusa, e o leitor ainda pode aceitar depois. Disponível a partir da versão 1.9.3 do plugin. | push_provider: ai_web_push, push_source: custom_modal ou native_prompt |
ai_web_push_subscription_success | Token FCM obtido e cadastro enviado ao servidor. O evento sai no envio e não confirma que o servidor salvou o inscrito. | push_provider: ai_web_push, push_source: custom_modal, native_prompt, site_controls ou permission_preexisting |
ai_web_push_subscription_skipped | O navegador já estava cadastrado com o mesmo token, e o plugin não envia um cadastro novo. Disponível a partir da versão 1.9.3 do plugin. | push_provider: ai_web_push, push_source: custom_modal, native_prompt, site_controls ou permission_preexisting |
ai_web_push_subscription_error | Erro ao obter token FCM | push_provider: ai_web_push, push_source: custom_modal, native_prompt, site_controls ou permission_preexisting |
Formato do push no GTM
Cada evento gera um dataLayer.push neste formato:
{
"event": "ai_web_push_<nome_do_evento>",
"push_provider": "ai_web_push",
"push_source": "custom_modal | native_prompt | site_controls | permission_preexisting"
}
Como ativar o debug (sem recarregar)
No console do navegador:
localStorage.setItem('ai-web-push-debug', 'true');
// para desativar:
// localStorage.removeItem('ai-web-push-debug');
Com o debug ativo, cada evento mostra no console:
- Nome do evento (
ai_web_push_*) push_sourcee detalhes- Preview do objeto enviado ao dataLayer
- Timestamp
Como testar os cenários
Navegador sem suporte (WebView, iOS Safari): Esperado: browser_not_supported. O fluxo encerra imediatamente, sem erros no console.
Modal personalizado, usuário aceita: Esperado: modal_shown → modal_accepted → prompt_shown → permission_granted → subscription_success.
Modal personalizado, usuário cancela: Esperado: modal_shown → modal_dismissed.
Modal personalizado, usuário aceita o modal mas nega o prompt: Esperado: modal_shown → modal_accepted → prompt_shown → permission_denied → modal_dismissed.
Prompt nativo direto (Chrome), usuário aceita: Esperado: prompt_shown → permission_granted → subscription_success.
Prompt nativo direto (Chrome), usuário nega: Esperado: prompt_shown → permission_denied → modal_dismissed.
Prompt nativo direto no Chrome 155 do Android, o visitante ignora e o aviso expira, ou fecha sem responder. Esperado a partir da versão 1.9.3, prompt_shown → permission_timeout, sem permission_denied. O pedido só volta depois do Intervalo de reexibição, em outra página.
O visitante deixou o pedido expirar e depois liberou a notificação pelos controles do site. Esperado a partir da versão 1.9.3, sem recarregar a página, subscription_success com push_source igual a site_controls. Se o mesmo navegador já estava cadastrado com o mesmo token, sai subscription_skipped.
Como criar tags no GTM
Trigger: Evento personalizado = ai_web_push_subscription_success
Variáveis úteis:
push_sourcepara segmentar modal vs prompt.push_provider(sempreai_web_push— bom se houver outros provedores).
Tags recomendadas:
- GA4: conversão de inscrição push.
- Google Ads: conversão de lead/inscrição.
- Facebook Pixel: evento customizado de inscrição.
- Hotjar/Clarity: eventos de funil.
Tag adicional recomendada: Crie um trigger para ai_web_push_browser_not_supported e envie como evento ao GA4. Isso permite monitorar quantos visitantes acessam o site em navegadores sem suporte a push, ajudando a dimensionar o impacto real e ajustar a estratégia.
Gatilhos novos a partir da versão 1.9.3. Crie um gatilho de Evento personalizado para ai_web_push_permission_timeout e envie ao GA4 como evento, para separar quem não decidiu de quem negou. Não use o ai_web_push_subscription_skipped como conversão, porque ele indica um navegador que já estava cadastrado. Se você usa um gatilho único com a expressão regular ^ai_web_push_.*, como no tutorial Como criar relatórios de Web Push no GA4 via GTM, os eventos novos já entram nele sem mudança.
Captura manual (sem GTM)
Você pode ouvir os eventos no navegador:
aiWebPushFront.on('subscription_success', (detail) => {
console.log('Nova inscrição via', detail.source);
});
// Detectar navegadores sem suporte:
aiWebPushFront.on('browser_not_supported', (detail) => {
console.log('Navegador não suporta push notifications');
// Exemplo: esconder botão de push, exibir mensagem alternativa
});
Eventos disponíveis: browser_not_supported, modal_shown, modal_accepted, modal_dismissed, prompt_shown, permission_granted, permission_denied, permission_timeout, subscription_success, subscription_skipped, subscription_error.
Melhores práticas
- Use
push_sourcepara comparar modal vs prompt nativo e otimizar a jornada. - Monitore
subscription_errorcomo alerta no GTM (quedas de conversão). - Monitore
browser_not_supportedpara entender qual porcentagem de visitantes usa navegadores incompatíveis e ajustar a estratégia de engajamento. - Para medir recusa de verdade, use
permission_denied. Quem não decidiu aparece empermission_timeoute ainda pode aceitar depois. Para comparar com o período antes da versão 1.9.3, some os dois. subscription_successmarca o envio do cadastro, não a confirmação do servidor.- Deixe o debug desligado em produção; ative apenas para troubleshooting.
Referências rápidas
- Prefixo de evento:
ai_web_push_... - Provider:
ai_web_push - Debug:
localStorage['ai-web-push-debug']='true' - Total de eventos da tabela, 11 a partir da versão 1.9.3, fora os de saída do WebView (veja a tabela em “Eventos disponíveis”)