�em �����cada�landing�page. ������*�������������Substitui�os�scripts�de�conversão �����anteriores. ������*/ �����(function()�{ �������'use�strict'; �������//�──�Configuração �����────────────────────────────────────── �������var�CONFIG�=�{ ���������conversionId:����'AW-1019734857', ���������conversionLabel:�'Un8qCIj2r5McEMnWn-YD', ���������conversionValue:�150.0, ���������currency:��������'BRL', ���������base44Domain:����'rm2crm.base44.app', ���������base44Endpoint:��'https://rm2crm.base44.app/api/fu �����nctions/processWhatsAppLead', ���������apiToken:��������'rm2leads2026', ���������deduplication:���7200000,�//�2�horas�em�ms ���������debug:�����������false,���//�true�para�ver�logs�no ������console �������}; �������var�_fired�=�{}; �������function�log()�{ ���������if�(CONFIG.debug)�{ �����������console.log('[RM2-CONV]', �����Array.prototype.join.call(arguments,�'�')); ���������} �������} �������//�──�Captura�gclid�da�URL�e�salva�no�sessionStorage ������──── �������function�capturarGclid()�{ ���������var�url����=�new �����URLSearchParams(window.location.search); ���������var�gclid��=�url.get('gclid'); ���������var�gbraid�=�url.get('gbraid'); ���������var�wbraid�=�url.get('wbraid'); ���������if�(gclid)��{�sessionStorage.setItem('rm2_gclid', ������gclid);��log('gclid�capturado:',�gclid);�} ���������if�(gbraid)�{�sessionStorage.setItem('rm2_gbraid', ������gbraid);�log('gbraid�capturado:',�gbraid);�} ���������if�(wbraid)�{�sessionStorage.setItem('rm2_wbraid', ������wbraid);�log('wbraid�capturado:',�wbraid);�} ���������//�Também�tenta�ler�do�cookie�_gcl_aw�(salvo�pelo �����gtag�automaticamente) ���������var�match�= �����document.cookie.match(/(?:^|;s*)_gcl_aw=([^;]+)/); ���������if�(match)�{ �����������//�formato:�GCL.timestamp.gclid �����������var�parts�=�match[1].split('.'); �����������if�(parts.length�>=�3)�{ �������������var�gclidFromCookie�= �����parts.slice(2).join('.'); �������������sessionStorage.setItem('rm2_gclid', �����gclidFromCookie); �������������log('gclid�do�cookie:',�gclidFromCookie); �����������} ���������} �������} �������//�──�Dispara�conversão�no�Google�Ads �����────────────────── �������function�dispararConversaoGoogleAds(dados)�{ ���������var�dedupeKey�=�'conv_'�+�(dados.email�|| �����dados.telefone�||�dados.source�||�'default'); ���������//�Deduplicação�—�não�dispara�2x�no�mesmo�período ���������var�ultimo�=�_fired[dedupeKey]; ���������if�(ultimo�&&�(Date.now()�-�ultimo)�< �����CONFIG.deduplication)�{ �����������log('Conversão�deduplicada:',�dedupeKey); �����������return; ���������} ���������_fired[dedupeKey]�=�Date.now(); ���������if�(typeof�gtag�===�'undefined')�{ �����������log('ERRO:�gtag�não�encontrado.�Verifique�se�o �����Google�Tag�está�carregado.'); �����������return; ���������} ���������var�parametros�=�{ �����������'send_to':����������CONFIG.conversionId�+�'/'�+ �����CONFIG.conversionLabel, �����������'value':������������CONFIG.conversionValue, �����������'currency':���������CONFIG.currency, �����������'transaction_id':���dedupeKey�+�'_'�+ �����Date.now(), ���������}; ���������//�Adiciona�dados�de�Enhanced�Conversions�se �����disponíveis ���������if�(dados.email)����parametros['user_data']�=�{ �����email:�dados.email�}; ���������if�(dados.telefone)�{ �����������parametros['user_data']�= �����parametros['user_data']�||�{}; �����������parametros['user_data']['phone_number']�= �����dados.telefone; ���������} ���������gtag('event',�'conversion',�parametros); ���������log('✅�Conversão�Google�Ads�disparada:', �����parametros); ���������//�Também�envia�ao�dataLayer�para�GTM ���������if�(window.dataLayer)�{ �����������window.dataLayer.push({ �������������'event':����������'rm2_conversion', �������������'conversion_id':��CONFIG.conversionId, �������������'source':���������dados.source�|| �����'base44_widget', �������������'email':����������dados.email, �������������'telefone':�������dados.telefone, �����������}); �����������log('dataLayer�atualizado'); ���������} �������} �������//�──�Escuta�eventos�do�widget�Base44�(PostMessage) �����──── �������function�escutarBase44()�{ ���������window.addEventListener('message',�function(event) ������{ �����������//�Segurança:�aceita�apenas�mensagens�do�domínio ������Base44 �����������if�(event.origin.indexOf(CONFIG.base44Domain) �����===�-1�&& ���������������event.origin.indexOf('base44.app')�===�-1)�{ �������������return; �����������} �����������var�data�=�event.data; �����������log('PostMessage�recebido�do�Base44:', �����JSON.stringify(data)); �����������//�Base44�pode�enviar�vários�formatos�— �����detectamos�todos �����������var�isConversao�=�false; �����������var�dadosLead���=�{}; �����������//�Formato�1:�{�type:�'form_submit',�...�} �����������if�(data�&&�data.type�&&�( ���������������data.type�===�'form_submit'�|| ���������������data.type�===�'lead_submit'�|| ���������������data.type�===�'conversion'�|| ���������������data.type�===�'whatsapp_click'�|| ���������������data.type�===�'success' �����������))�{ �������������isConversao��=�true; �������������dadosLead����=�data.data�||�data; �����������} �����������//�Formato�2:�{�event:�'submit',�...�} �����������if�(data�&&�data.event�&&�( ���������������data.event�===�'submit'�|| ���������������data.event�===�'lead'�|| ���������������data.event�===�'conversion' �����������))�{ �������������isConversao��=�true; �������������dadosLead����=�data; �����������} �����������//�Formato�3:�payload�direto�com�email�ou �����telefone �����������if�(data�&&�(data.email�||�data.telefone�|| �����data.phone�||�data.whatsapp))�{ �������������isConversao��=�true; �������������dadosLead����=�data; �����������} �����������if�(isConversao)�{ �������������log('🎯�Evento�de�conversão�detectado!', �����dadosLead); �������������dispararConversaoGoogleAds({ ���������������email:����dadosLead.email, ���������������telefone:�dadosLead.telefone�|| �����dadosLead.phone�||�dadosLead.whatsapp, ���������������source:���'base44_postmessage_'�+ �����(dadosLead.type�||�dadosLead.event�||�'widget'), �������������}); �����������} ���������}); ���������log('PostMessage�listener�ativo�para�Base44'); �������} �������//�──�Fallback:�observa�mudanças�na�URL �����(redirecionamento�pós-submit)�── �������function�escutarRedirecionamento()�{ ���������var�urlInicial�=�window.location.href; ���������//�Monitora�se�o�Base44�redireciona�para�uma �����página�de�sucesso ���������var�observer�=�new�MutationObserver(function()�{ �����������if�(window.location.href�!==�urlInicial)�{ �������������var�novaUrl�= �����window.location.href.toLowerCase(); �������������if�(novaUrl.indexOf('sucesso')�>�-1�|| �����������������novaUrl.indexOf('obrigado')�>�-1�|| �����������������novaUrl.indexOf('success')�>�-1�|| �����������������novaUrl.indexOf('thank')�>�-1�|| �����������������novaUrl.indexOf('confirmacao')�>�-1)�{ ���������������log('Redirecionamento�de�sucesso �����detectado:',�novaUrl); ���������������dispararConversaoGoogleAds({�source: �����'redirect_success'�}); �������������} �������������urlInicial�=�window.location.href; �����������} ���������}); ���������observer.observe(document.body,�{�childList:�true, ������subtree:�true�}); ���������log('Observer�de�redirecionamento�ativo'); �������} �������//�──�Fallback:�intercepta�chamadas�à�API�Base44 �����──────── �������function�interceptarBase44API()�{ ���������var�originalFetch�=�window.fetch; ���������window.fetch�=�function(url,�options)�{ �����������var�urlStr�=�typeof�url�===�'string'�?�url�: �����(url�&&�url.url)�||�''; �����������//�Detecta�chamada�ao�endpoint�Base44�de �����processamento�de�lead �����������if�(urlStr.indexOf('base44')�>�-1�&& ���������������(urlStr.indexOf('processWhatsApp')�>�-1�|| ����������������urlStr.indexOf('lead')�>�-1�|| ����������������urlStr.indexOf('contact')�>�-1�|| ����������������urlStr.indexOf('form')�>�-1))�{ �������������log('🎯�Chamada�Base44�API�interceptada:', �����urlStr); �������������//�Tenta�extrair�dados�do�body �������������var�dadosLead�=�{�source:�'api_intercept'�}; �������������if�(options�&&�options.body)�{ ���������������try�{ �����������������var�body�=�typeof�options.body�=== �����'string' �������������������?�JSON.parse(options.body) �������������������:�options.body; �����������������dadosLead.email����=�body.email; �����������������dadosLead.telefone�=�body.phone�|| �����body.telefone�||�body.whatsapp; ���������������}�catch(e)�{} �������������} �������������dispararConversaoGoogleAds(dadosLead); �����������} �����������return�originalFetch.apply(this,�arguments); ���������}; ���������//�Intercepta�XHR�também ���������var�originalOpen�=�XMLHttpRequest.prototype.open; ���������XMLHttpRequest.prototype.open�=�function(method, �����url)�{ �����������this._rm2_url�=�url; �����������return�originalOpen.apply(this,�arguments); ���������}; ���������var�originalSend�=�XMLHttpRequest.prototype.send; ���������XMLHttpRequest.prototype.send�=�function(body)�{ �����������var�url�=�this._rm2_url�||�''; �����������if�(url.indexOf('base44')�>�-1�&& �����url.indexOf('lead')�>�-1)�{ �������������log('🎯�XHR�Base44�interceptado:',�url); �������������var�dadosLead�=�{�source:�'xhr_intercept'�}; �������������try�{ ���������������var�parsed�=�JSON.parse(body); ���������������dadosLead.email����=�parsed.email; ���������������dadosLead.telefone�=�parsed.phone�|| �����parsed.telefone; �������������}�catch(e)�{} �������������dispararConversaoGoogleAds(dadosLead); �����������} �����������return�originalSend.apply(this,�arguments); ���������}; ���������log('Interceptação�de�API�Base44�ativa�(fetch�+ �����XHR)'); �������} �������//�──�Fallback:�monitora�botão�WhatsApp�dentro�do �����iframe�── �������function�monitorarBotaoWhatsApp()�{ ���������document.querySelectorAll('a[href*="wa.me"], �����a[href*="whatsapp"]').forEach(function(el)�{ �����������el.addEventListener('click',�function()�{ �������������log('🎯�Clique�WhatsApp�detectado�na�landing �����page'); �������������dispararConversaoGoogleAds({�source: �����'whatsapp_direct_click'�}); �����������}); ���������}); ���������//�Observa�novos�botões�adicionados�dinamicamente �����(pelo�widget�Base44) ���������var�observer�=�new�MutationObserver(function()�{ �����������document.querySelectorAll('a[href*="wa.me"]:not( �����[data-rm2-tracked])').forEach(function(el)�{ �������������el.setAttribute('data-rm2-tracked',�'1'); �������������el.addEventListener('click',�function()�{ ���������������log('🎯�Clique�WhatsApp�(dinâmico) �����detectado'); ���������������dispararConversaoGoogleAds({�source: �����'whatsapp_dynamic_click'�}); �������������}); �����������}); ���������}); ���������observer.observe(document.body,�{�childList:�true, ������subtree:�true�}); ���������log('Monitor�de�WhatsApp�ativo'); �������} �������//�──�Inicialização �����───────────────────────────────────── �������function�init()�{ ���������log('RM2�Conversion�Bridge�v2.0�iniciando...'); ���������capturarGclid(); ���������escutarBase44(); ���������interceptarBase44API(); ���������monitorarBotaoWhatsApp(); ���������escutarRedirecionamento(); ���������log('✅�Todos�os�listeners�ativos.�Sistema �����pronto.'); �������} �������//�Aguarda�DOM�estar�pronto �������if�(document.readyState�===�'loading')�{ ���������document.addEventListener('DOMContentLoaded', �����init); �������}�else�{ ���������init(); �������} �������//�Expõe�função�de�teste�global �������window.rm2TestConversao�=�function(tipo)�{ ���������log('===�TESTE�MANUAL�==='); ���������dispararConversaoGoogleAds({ �����������email:����'teste@rm2.com.br', �����������telefone:�'+5511999999999', �����������source:���'teste_manual_'�+�(tipo�||�'console'), ���������}); ���������return�'✅�Conversão�de�teste�disparada!�Verifique ������o�Google�Ads�em�~2h.'; �������}; �����})(); --> /** �� * RM2 Holding�—�Correção�de�Conversão�Google�Ads�+ Base44 Widget * * PROBLEMA: Base44 widget roda em iframe �� (rm2crm.base44.app). ������*�����������O�iframe�não�consegue�acessar�o�gclid�do �����domínio�pai, ������*�����������então�conversões�chegam�no�Google�Ads�sem ������atribuição. ������* ������*�SOLUÇÃO:��PostMessage�Bridge�—�a�landing�page �����escuta�os�eventos ������*�����������do�widget�Base44�e�dispara�a�conversão�no ������contexto ������*�����������correto�(domínio�pai,�com�gclid �����disponível). ������* ������*�INSTALAÇÃO:�Cole�este�script�ANTES�do��em �����cada�landing�page. ������*�������������Substitui�os�scripts�de�conversão �����anteriores. ������*/ �����(function()�{ �������'use�strict'; �������//�──�Configuração �����────────────────────────────────────── �������var�CONFIG�=�{ ���������conversionId:����'AW-1019734857', ���������conversionLabel:�'Un8qCIj2r5McEMnWn-YD', ���������conversionValue:�150.0, ���������currency:��������'BRL', ���������base44Domain:����'rm2crm.base44.app', ���������base44Endpoint:��'https://rm2crm.base44.app/api/fu �����nctions/processWhatsAppLead', ���������apiToken:��������'rm2leads2026', ���������deduplication:���7200000,�//�2�horas�em�ms ���������debug:�����������false,���//�true�para�ver�logs�no ������console �������}; �������var�_fired�=�{}; �������function�log()�{ ���������if�(CONFIG.debug)�{ �����������console.log('[RM2-CONV]', �����Array.prototype.join.call(arguments,�'�')); ���������} �������} �������//�──�Captura�gclid�da�URL�e�salva�no�sessionStorage ������──── �������function�capturarGclid()�{ ���������var�url����=�new �����URLSearchParams(window.location.search); ���������var�gclid��=�url.get('gclid'); ���������var�gbraid�=�url.get('gbraid'); ���������var�wbraid�=�url.get('wbraid'); ���������if�(gclid)��{�sessionStorage.setItem('rm2_gclid', ������gclid);��log('gclid�capturado:',�gclid);�} ���������if�(gbraid)�{�sessionStorage.setItem('rm2_gbraid', ������gbraid);�log('gbraid�capturado:',�gbraid);�} ���������if�(wbraid)�{�sessionStorage.setItem('rm2_wbraid', ������wbraid);�log('wbraid�capturado:',�wbraid);�} ���������//�Também�tenta�ler�do�cookie�_gcl_aw�(salvo�pelo �����gtag�automaticamente) ���������var�match�= �����document.cookie.match(/(?:^|;s*)_gcl_aw=([^;]+)/); ���������if�(match)�{ �����������//�formato:�GCL.timestamp.gclid �����������var�parts�=�match[1].split('.'); �����������if�(parts.length�>=�3)�{ �������������var�gclidFromCookie�= �����parts.slice(2).join('.'); �������������sessionStorage.setItem('rm2_gclid', �����gclidFromCookie); �������������log('gclid�do�cookie:',�gclidFromCookie); �����������} ���������} �������} �������//�──�Dispara�conversão�no�Google�Ads �����────────────────── �������function�dispararConversaoGoogleAds(dados)�{ ���������var�dedupeKey�=�'conv_'�+�(dados.email�|| �����dados.telefone�||�dados.source�||�'default'); ���������//�Deduplicação�—�não�dispara�2x�no�mesmo�período ���������var�ultimo�=�_fired[dedupeKey]; ���������if�(ultimo�&&�(Date.now()�-�ultimo)�< �����CONFIG.deduplication)�{ �����������log('Conversão�deduplicada:',�dedupeKey); �����������return; ���������} ���������_fired[dedupeKey]�=�Date.now(); ���������if�(typeof�gtag�===�'undefined')�{ �����������log('ERRO:�gtag�não�encontrado.�Verifique�se�o �����Google�Tag�está�carregado.'); �����������return; ���������} ���������var�parametros�=�{ �����������'send_to':����������CONFIG.conversionId�+�'/'�+ �����CONFIG.conversionLabel, �����������'value':������������CONFIG.conversionValue, �����������'currency':���������CONFIG.currency, �����������'transaction_id':���dedupeKey�+�'_'�+ �����Date.now(), ���������}; ���������//�Adiciona�dados�de�Enhanced�Conversions�se �����disponíveis ���������if�(dados.email)����parametros['user_data']�=�{ �����email:�dados.email�}; ���������if�(dados.telefone)�{ �����������parametros['user_data']�= �����parametros['user_data']�||�{}; �����������parametros['user_data']['phone_number']�= �����dados.telefone; ���������} ���������gtag('event',�'conversion',�parametros); ���������log('✅�Conversão�Google�Ads�disparada:', �����parametros); ���������//�Também�envia�ao�dataLayer�para�GTM ���������if�(window.dataLayer)�{ �����������window.dataLayer.push({ �������������'event':����������'rm2_conversion', �������������'conversion_id':��CONFIG.conversionId, �������������'source':���������dados.source�|| �����'base44_widget', �������������'email':����������dados.email, �������������'telefone':�������dados.telefone, �����������}); �����������log('dataLayer�atualizado'); ���������} �������} �������//�──�Escuta�eventos�do�widget�Base44�(PostMessage) �����──── �������function�escutarBase44()�{ ���������window.addEventListener('message',�function(event) ������{ �����������//�Segurança:�aceita�apenas�mensagens�do�domínio ������Base44 �����������if�(event.origin.indexOf(CONFIG.base44Domain) �����===�-1�&& ���������������event.origin.indexOf('base44.app')�===�-1)�{ �������������return; �����������} �����������var�data�=�event.data; �����������log('PostMessage�recebido�do�Base44:', �����JSON.stringify(data)); �����������//�Base44�pode�enviar�vários�formatos�— �����detectamos�todos �����������var�isConversao�=�false; �����������var�dadosLead���=�{}; �����������//�Formato�1:�{�type:�'form_submit',�...�} �����������if�(data�&&�data.type�&&�( ���������������data.type�===�'form_submit'�|| ���������������data.type�===�'lead_submit'�|| ���������������data.type�===�'conversion'�|| ���������������data.type�===�'whatsapp_click'�|| ���������������data.type�===�'success' �����������))�{ �������������isConversao��=�true; �������������dadosLead����=�data.data�||�data; �����������} �����������//�Formato�2:�{�event:�'submit',�...�} �����������if�(data�&&�data.event�&&�( ���������������data.event�===�'submit'�|| ���������������data.event�===�'lead'�|| ���������������data.event�===�'conversion' �����������))�{ �������������isConversao��=�true; �������������dadosLead����=�data; �����������} �����������//�Formato�3:�payload�direto�com�email�ou �����telefone �����������if�(data�&&�(data.email�||�data.telefone�|| �����data.phone�||�data.whatsapp))�{ �������������isConversao��=�true; �������������dadosLead����=�data; �����������} �����������if�(isConversao)�{ �������������log('🎯�Evento�de�conversão�detectado!', �����dadosLead); �������������dispararConversaoGoogleAds({ ���������������email:����dadosLead.email, ���������������telefone:�dadosLead.telefone�|| �����dadosLead.phone�||�dadosLead.whatsapp, ���������������source:���'base44_postmessage_'�+ �����(dadosLead.type�||�dadosLead.event�||�'widget'), �������������}); �����������} ���������}); ���������log('PostMessage�listener�ativo�para�Base44'); �������} �������//�──�Fallback:�observa�mudanças�na�URL �����(redirecionamento�pós-submit)�── �������function�escutarRedirecionamento()�{ ���������var�urlInicial�=�window.location.href; ���������//�Monitora�se�o�Base44�redireciona�para�uma �����página�de�sucesso ���������var�observer�=�new�MutationObserver(function()�{ �����������if�(window.location.href�!==�urlInicial)�{ �������������var�novaUrl�= �����window.location.href.toLowerCase(); �������������if�(novaUrl.indexOf('sucesso')�>�-1�|| �����������������novaUrl.indexOf('obrigado')�>�-1�|| �����������������novaUrl.indexOf('success')�>�-1�|| �����������������novaUrl.indexOf('thank')�>�-1�|| �����������������novaUrl.indexOf('confirmacao')�>�-1)�{ ���������������log('Redirecionamento�de�sucesso �����detectado:',�novaUrl); ���������������dispararConversaoGoogleAds({�source: �����'redirect_success'�}); �������������} �������������urlInicial�=�window.location.href; �����������} ���������}); ���������observer.observe(document.body,�{�childList:�true, ������subtree:�true�}); ���������log('Observer�de�redirecionamento�ativo'); �������} �������//�──�Fallback:�intercepta�chamadas�à�API�Base44 �����──────── �������function�interceptarBase44API()�{ ���������var�originalFetch�=�window.fetch; ���������window.fetch�=�function(url,�options)�{ �����������var�urlStr�=�typeof�url�===�'string'�?�url�: �����(url�&&�url.url)�||�''; �����������//�Detecta�chamada�ao�endpoint�Base44�de �����processamento�de�lead �����������if�(urlStr.indexOf('base44')�>�-1�&& ���������������(urlStr.indexOf('processWhatsApp')�>�-1�|| ����������������urlStr.indexOf('lead')�>�-1�|| ����������������urlStr.indexOf('contact')�>�-1�|| ����������������urlStr.indexOf('form')�>�-1))�{ �������������log('🎯�Chamada�Base44�API�interceptada:', �����urlStr); �������������//�Tenta�extrair�dados�do�body �������������var�dadosLead�=�{�source:�'api_intercept'�}; �������������if�(options�&&�options.body)�{ ���������������try�{ �����������������var�body�=�typeof�options.body�=== �����'string' �������������������?�JSON.parse(options.body) �������������������:�options.body; �����������������dadosLead.email����=�body.email; �����������������dadosLead.telefone�=�body.phone�|| �����body.telefone�||�body.whatsapp; ���������������}�catch(e)�{} �������������} �������������dispararConversaoGoogleAds(dadosLead); �����������} �����������return�originalFetch.apply(this,�arguments); ���������}; ���������//�Intercepta�XHR�também ���������var�originalOpen�=�XMLHttpRequest.prototype.open; ���������XMLHttpRequest.prototype.open�=�function(method, �����url)�{ �����������this._rm2_url�=�url; �����������return�originalOpen.apply(this,�arguments); ���������}; ���������var�originalSend�=�XMLHttpRequest.prototype.send; ���������XMLHttpRequest.prototype.send�=�function(body)�{ �����������var�url�=�this._rm2_url�||�''; �����������if�(url.indexOf('base44')�>�-1�&& �����url.indexOf('lead')�>�-1)�{ �������������log('🎯�XHR�Base44�interceptado:',�url); �������������var�dadosLead�=�{�source:�'xhr_intercept'�}; �������������try�{ ���������������var�parsed�=�JSON.parse(body); ���������������dadosLead.email����=�parsed.email; ���������������dadosLead.telefone�=�parsed.phone�|| �����parsed.telefone; �������������}�catch(e)�{} �������������dispararConversaoGoogleAds(dadosLead); �����������} �����������return�originalSend.apply(this,�arguments); ���������}; ���������log('Interceptação�de�API�Base44�ativa�(fetch�+ �����XHR)'); �������} �������//�──�Fallback:�monitora�botão�WhatsApp�dentro�do �����iframe�── �������function�monitorarBotaoWhatsApp()�{ ���������document.querySelectorAll('a[href*="wa.me"], �����a[href*="whatsapp"]').forEach(function(el)�{ �����������el.addEventListener('click',�function()�{ �������������log('🎯�Clique�WhatsApp�detectado�na�landing �����page'); �������������dispararConversaoGoogleAds({�source: �����'whatsapp_direct_click'�}); �����������}); ���������}); ���������//�Observa�novos�botões�adicionados�dinamicamente �����(pelo�widget�Base44) ���������var�observer�=�new�MutationObserver(function()�{ �����������document.querySelectorAll('a[href*="wa.me"]:not( �����[data-rm2-tracked])').forEach(function(el)�{ �������������el.setAttribute('data-rm2-tracked',�'1'); �������������el.addEventListener('click',�function()�{ ���������������log('🎯�Clique�WhatsApp�(dinâmico) �����detectado'); ���������������dispararConversaoGoogleAds({�source: �����'whatsapp_dynamic_click'�}); �������������}); �����������}); ���������}); ���������observer.observe(document.body,�{�childList:�true, ������subtree:�true�}); ���������log('Monitor�de�WhatsApp�ativo'); �������} �������//�──�Inicialização �����───────────────────────────────────── �������function�init()�{ ���������log('RM2�Conversion�Bridge�v2.0�iniciando...'); ���������capturarGclid(); ���������escutarBase44(); ���������interceptarBase44API(); ���������monitorarBotaoWhatsApp(); ���������escutarRedirecionamento(); ���������log('✅�Todos�os�listeners�ativos.�Sistema �����pronto.'); �������} �������//�Aguarda�DOM�estar�pronto �������if�(document.readyState�===�'loading')�{ ���������document.addEventListener('DOMContentLoaded', �����init); �������}�else�{ ���������init(); �������} �������//�Expõe�função�de�teste�global �������window.rm2TestConversao�=�function(tipo)�{ ���������log('===�TESTE�MANUAL�==='); ���������dispararConversaoGoogleAds({ �����������email:����'teste@rm2.com.br', �����������telefone:�'+5511999999999', �����������source:���'teste_manual_'�+�(tipo�||�'console'), ���������}); ���������return�'✅�Conversão�de�teste�disparada!�Verifique ������o�Google�Ads�em�~2h.'; �������}; �����})();