UNPKG

@jussimirvfx/meta-pixel-tracking

Version:

Sistema completo de tracking do Meta Pixel (Pixel + CAPI) com proteção anti-adblock para landing pages

473 lines (368 loc) 14.3 kB
# @jussimirvfx/meta-pixel-tracking Sistema completo de tracking do Meta Pixel (Pixel + CAPI) para landing pages com **Advanced Matching otimizado**, **captura de IP real** e **proteção anti-adblock**. ## 🚀 **COMPATIBILIDADE UNIVERSAL** **✅ Funciona automaticamente em qualquer framework React:** - **Vite** - Configuração automática com `VITE_*` - **Next.js** - Configuração automática com `NEXT_PUBLIC_*` - **Create React App** - Configuração automática com `REACT_APP_*` - **Zero configuração adicional** - Detecta e configura tudo sozinho ## 📖 **GUIAS DE IMPLEMENTAÇÃO** Para implementar este sistema, siga as 2 etapas sequenciais abaixo: - **[ETAPA 1: Preparação do Sistema de Lead Scoring](./ETAPA1_LEAD_SCORING.md)** - **[ETAPA 2: Integração com Meta Pixel Package](./ETAPA2_META_PIXEL.md)** --- ## 🛠️ **Troubleshooting e Validação** ### 🔍 **Como Verificar se Está Funcionando** **1. Verificar logs de debug:** ```javascript // Ativar logs no console localStorage.setItem('meta-pixel-debug', 'true') // Logs esperados após enviar um lead: // ✅ [META PIXEL] - Lead enviado com sucesso // ✅ hasEmail: true, hasPhone: true, hasName: true // ✅ Advanced Matching: 5/8 campos preenchidos // ✅ Event ID: pixel_123456 ``` **2. Verificar API routes:** ```bash # Testar captura de IP curl https://seu-dominio.com/api/meta/conversions # Resposta esperada: # {"status": "ready", "ip": "123.456.789.0"} ``` ### ❌ **Problemas Comuns e Soluções** #### **1. Dados não chegam no Meta Events Manager** **❌ Problema:** Email, telefone ou nome não aparecem no Meta. **✅ Solução:** Verificar nomes dos campos: ```tsx // ❌ INCORRETO await trackLead({ user_name: 'João', // ❌ Deveria ser 'name' ou 'nome' user_email: 'j@j.com', // ❌ Deveria ser 'email' telephone: '11999' // ❌ Deveria ser 'phone' ou 'telefone' }) // ✅ CORRETO await trackLead({ name: 'João Silva', // ✅ ou 'nome' email: 'joao@email.com', // ✅ sempre 'email' phone: '11999999999' // ✅ ou 'telefone' }) ``` #### **2. Advanced Matching baixo** **❌ Problema:** Meta mostra baixa qualidade no Advanced Matching. **✅ Solução:** Incluir mais dados do usuário: ```tsx // ❌ Dados mínimos (match rate ~30%) await trackLead({ email: 'user@email.com' }) // ✅ Dados completos (match rate ~90%+) await trackLead({ name: 'João Silva', // ✅ Nome completo email: 'joao@email.com', // ✅ Email válido phone: '11999999999', // ✅ Telefone com DDD city: 'São Paulo', // ✅ Cidade state: 'SP', // ✅ Estado zip: '01234567', // ✅ CEP country: 'Brasil' // ✅ País }) ``` #### **3. Eventos não aparecem no Meta** **❌ Problema:** Nenhum evento chega no Meta Events Manager. **✅ Verificações:** 1. **Variáveis de ambiente:** ```env VITE_META_PIXEL_ID=seu_pixel_id VITE_META_API_ACCESS_TOKEN=seu_access_token ``` 2. **Console do navegador:** ```javascript // Verificar configuração console.log('Config:', { pixelId: import.meta.env.VITE_META_PIXEL_ID, hasToken: !!import.meta.env.VITE_META_API_ACCESS_TOKEN }) ``` 3. **Testar com dados simples:** ```tsx await trackLead({ name: 'Teste', email: 'teste@teste.com', phone: '11999999999' }) ``` #### **4. Package não funciona** **❌ Problema:** Hooks retornam erro ou não funcionam. **✅ Verificações:** 1. **Provider configurado:** ```tsx // ✅ CORRETO <MetaPixelProvider> <App /> </MetaPixelProvider> ``` 2. **Configuração antes dos hooks:** ```tsx // ✅ CORRETO - Configure primeiro configureMetaPixel({...}) // Depois use hooks const { trackLead } = useMetaPixel() ``` 3. **Ordem de importação:** ```tsx // ✅ CORRETO import { MetaPixelProvider } from '@jussimirvfx/meta-pixel-tracking' // ANTES de usar qualquer hook ``` #### **6. Confusão entre trackLead e trackLeadQualificado** **❌ Problema:** Não entender que ambos os eventos podem disparar para o mesmo lead. **✅ REGRA CORRETA:** ```tsx // ✅ SEMPRE use esta lógica: const leadScore = calculateLeadScore(formData) // 1. SEMPRE enviar Lead await trackLead(leadData) // 2. VERIFICAR se é qualificado para enviar LeadQualificado também const isLeadQualificado = verificarQualificacao(formData, leadScore) if (isLeadQualificado) { await trackLeadQualificado(leadData) // ✅ Dispara junto com Lead } ``` **❌ ERROS COMUNS:** ```tsx // ❌ ERRADO - Usar apenas um hook if (leadScore >= 70) { await trackLeadQualificado(leadData) // ❌ Deveria enviar Lead também } else { await trackLead(leadData) // ✅ Correto } // ❌ ERRADO - Usar trackLeadQualificado para pessoa física if (formData.tipoPessoa === 'fisica') { // ❌ Pessoa física não é qualificada await trackLeadQualificado(leadData) } // ❌ ERRADO - Não verificar perfil profissional if (leadScore >= 70) { // ❌ Score alto não garante qualificação await trackLeadQualificado(leadData) } ``` **✅ EXEMPLO CORRETO COMPLETO:** ```tsx const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() // 1. Validar dados if (!formData.nome || !formData.email || !formData.telefone) { alert('Preencha todos os campos obrigatórios') return } // 2. Calcular score const leadScore = calculateLeadScore(formData) // 3. Preparar dados const leadData = { name: formData.nome, email: formData.email, phone: formData.telefone, // ... outros campos } try { // 4. SEMPRE ENVIAR LEAD await trackLead(leadData) console.log('✅ Lead enviado para Meta!') // 5. VERIFICAR SE É QUALIFICADO const isLeadQualificado = verificarQualificacao(formData, leadScore) if (isLeadQualificado) { console.log(`📊 Lead qualificado detectado (perfil: ${formData.tipoPessoa || formData.profissao})`) await trackLeadQualificado(leadData) } // 6. Sua lógica de negócio await salvarLead(leadData) alert('Lead enviado com sucesso!') } catch (error) { console.error('Erro:', error) alert('Erro ao enviar. Tente novamente.') } } ``` if (leadScore >= 70) { console.log(`📊 Lead qualificado (score: ${leadScore})`) await trackLeadQualificado(leadData) } else { console.log(`📊 Lead básico (score: ${leadScore})`) await trackLead(leadData) } // 5. Sua lógica de negócio await salvarLead(leadData) alert('Lead enviado com sucesso!') } catch (error) { console.error('Erro:', error) alert('Erro ao enviar. Tente novamente.') } } ``` --- ## 📖 **Recursos Adicionais** ### 🚀 **Meta Parameter Builder SDK** Este package implementa as funcionalidades do [Meta Parameter Builder SDK oficial](https://developers.facebook.com/docs/marketing-api/conversions-api/parameter-builder-feature-library), proporcionando: #### **Otimização Automática de Parâmetros** - **FBC Inteligente**: Extrai e processa `fbclid` da URL automaticamente - **FBP Persistente**: Gera e mantém Facebook Browser ID otimizado - **Cookie Management**: Atualização automática seguindo best practices - **Validação**: Valida formato correto de FBC/FBP #### **Como Funciona** 1. **Na inicialização**: Processa URL e extrai `fbclid` se presente 2. **Em cada evento**: Usa parâmetros otimizados automaticamente 3. **No servidor**: Processa e otimiza cookies nas requisições 4. **Fallback inteligente**: Sempre garante FBC/FBP válidos #### **Benefícios vs Implementação Manual** | Aspecto | Manual | Com SDK | |---------|--------|---------| | **FBC Coverage** | ~60% | ~95% | | **Cookie Updates** | Manual | Automático | | **URL Processing** | Básico | Otimizado | | **Best Practices** | Parcial | Completo | ### 🔧 **Nomes de Campos Aceitos** | Dado | Português | Inglês | Obrigatório | |------|-----------|--------|-------------| | **Email** | `email` | `email` | ✅ Sim | | **Telefone** | `telefone` | `phone` | ✅ Sim | | **Nome** | `nome` | `name` | ✅ Sim | | **Cidade** | `cidade` | `city` | ❌ Opcional | | **Estado** | `estado` | `state` | ❌ Opcional | | **CEP** | `cep` | `zip` | ❌ Opcional | | **País** | `pais` | `country` | ❌ Opcional | ### 📱 **Formato do Telefone** ```tsx // ✅ Todos estes formatos funcionam: phone: '11999999999' // Sem formatação (recomendado) phone: '(11) 99999-9999' // Com formatação phone: '+5511999999999' // Com código do país phone: '11 99999-9999' // Com espaços ``` ### 🎯 **Eventos Disponíveis** -**PageView** - Enviado automaticamente ao carregar a página -**Lead** - Para leads básicos -**LeadQualificado** - Para leads qualificados (score ≥ 70) -**Scroll** - Rastreamento automático em 25%, 50%, 75% e 100% ### 🛡️ **Funcionalidades Principais** -**Configuração Automática** - Detecta framework e configura variáveis automaticamente -**IP Real Capturado** - Match rate 90%+ com IP real do cliente -**Advanced Matching** - Hash SHA-256 para todos os dados -**Deduplicação** - Event ID único entre Pixel e CAPI - 🛡️ **Proteção Anti-AdBlock** - Funciona mesmo com bloqueadores -**TypeScript** - Tipos completos incluídos - 🚀 **Multi-Framework Universal** - Funciona automaticamente em Vite, Next.js, CRA e outros - 🔧 **Detecção Automática** - Identifica framework e configura variáveis corretas - 🚀 **Meta Parameter Builder SDK** - Implementação das best practices oficiais do Meta ### 🔧 **Scripts Disponíveis (Opcionais)** ```bash npm run dev:meta # Servidor de desenvolvimento npm run dev:meta:prod # Servidor de produção ``` **📝 Nota:** Os scripts de desenvolvimento são opcionais. O package funciona perfeitamente sem eles. ### 📊 **Logs e Debug** ```javascript // Ativar logs localStorage.setItem('meta-pixel-debug', 'true') // Interface de logs window._metaPixelLogs.getLogs() // Todos os logs window._metaPixelLogs.getLogsByCategory('LEAD') // Logs por categoria window._metaPixelLogs.enable() // Ativar window._metaPixelLogs.disable() // Desativar ``` 📖 **Documentação completa:** [DEBUG.md](./DEBUG.md) | [CHANGELOG.md](./CHANGELOG.md) --- ## 🎉 **Resultado Final** Seguindo os 2 prompts acima, você terá um sistema completo de Meta Pixel com: ### ✅ **Do Prompt 1:** - Sistema de lead scoring funcional - Formulário capturando dados corretos - Validações robustas implementadas - Handler preparando dados no formato Meta-compatível ### ✅ **Do Prompt 2:** - Package Meta Pixel instalado e configurado - API routes criadas automaticamente - IP real sendo capturado (match rate 90%+) - Advanced Matching ativo - Proteção anti-adblock funcional ### 📊 **Benefícios Alcançados:** | Aspecto | Antes | Depois | |---------|-------|--------| | **Match Rate** | 30-50% | 85-95% | | **Setup Time** | 3-4 horas | 30 minutos | | **IP Capture** | Não disponível | ✅ Automático | | **Anti-AdBlock** | Não protegido | ✅ Protegido | | **Debug** | Manual | ✅ Automático | | **Framework Support** | Apenas Vite | ✅ Vite + Next.js + CRA | | **Migration** | Reescrita total | ✅ Zero alterações | | **Maintenance** | Múltiplas bases | ✅ Base única universal | ### 📖 **Documentação Adicional** - **[CHANGELOG.md](./CHANGELOG.md)** - Histórico de versões - **[DEBUG.md](./DEBUG.md)** - Guia completo de debug - **[ANTI_ADBLOCK_GUIDE.md](./ANTI_ADBLOCK_GUIDE.md)** - Proteção anti-adblock - **[IP_ADDRESS_IMPLEMENTATION.md](./IP_ADDRESS_IMPLEMENTATION.md)** - Captura de IP - **[MULTI_FRAMEWORK_GUIDE.md](./MULTI_FRAMEWORK_GUIDE.md)** - Compatibilidade com Vite, Next.js e CRA --- ## ❓ **FAQ - Perguntas Frequentes** ### 🤔 **Qual hook devo usar: trackLead ou trackLeadQualificado?** **✅ RESPOSTA CORRETA:** - **SEMPRE use `trackLead()`** para qualquer lead - **ADICIONALMENTE use `trackLeadQualificado()`** apenas para leads qualificados (pessoa jurídica, empresário, etc.) **📝 EXEMPLO PRÁTICO:** ```tsx const leadScore = calculateLeadScore(formData) // 1. SEMPRE enviar Lead await trackLead(leadData) // 2. VERIFICAR se é qualificado const isLeadQualificado = verificarQualificacao(formData, leadScore) if (isLeadQualificado) { await trackLeadQualificado(leadData) // ✅ Dispara junto com Lead } ``` ### 🤔 **Posso usar ambos os hooks para o mesmo lead?** **✅ SIM!** E é exatamente assim que deve funcionar: -`await trackLead(leadData)` - SEMPRE dispara -`await trackLeadQualificado(leadData)` - Dispara APENAS se qualificado **📋 IMPORTANTE:** Para leads qualificados, AMBOS os eventos devem disparar! ### 🤔 **Qual a diferença entre os dois hooks?** | Hook | Quando Usar | Valor Padrão | Evento no Meta | |------|-------------|--------------|----------------| | `trackLead()` | **SEMPRE** | R$ 25 | Lead básico | | `trackLeadQualificado()` | **APENAS se qualificado** | R$ 100 | Lead qualificado | **📋 Perfis qualificados:** - Pessoa jurídica - Empresário - Diretor - Gerente - Proprietário **📋 Perfis não qualificados:** - Pessoa física - Revendedor autônomo - Estudante - Desempregado ### 🤔 **E se eu não calcular o score?** **❌ NÃO FAÇA ISSO:** Sempre calcule o score E verifique o perfil para decidir se é qualificado. **✅ SEMPRE FAÇA:** ```tsx const leadScore = calculateLeadScore(formData) const isLeadQualificado = verificarQualificacao(formData, leadScore) // Depois decida se envia LeadQualificado ``` ### 🤔 **Posso mudar os critérios de qualificação?** **✅ SIM!** Mas mantenha a lógica consistente: ```tsx // Se quiser adicionar mais perfis qualificados const verificarQualificacao = (formData: any, leadScore: number): boolean => { if (leadScore < 50) return false const perfisQualificados = [ 'pessoa_juridica', 'empresario', 'diretor', 'gerente', 'proprietario', 'investidor' // ✅ Novo perfil qualificado ] return perfisQualificados.includes(formData.tipoPessoa || formData.profissao) } ``` --- ## 📄 **Licença** MIT - Veja [LICENSE](LICENSE) para detalhes.