@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
Markdown
# @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.