cdp-edge 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +367 -0
- package/bin/cdp-edge.js +61 -0
- package/contracts/api-versions.json +368 -0
- package/dist/commands/analyze.js +52 -0
- package/dist/commands/infra.js +54 -0
- package/dist/commands/install.js +168 -0
- package/dist/commands/server.js +174 -0
- package/dist/commands/setup.js +123 -0
- package/dist/commands/validate.js +84 -0
- package/dist/index.js +12 -0
- package/docs/CI-CD-SETUP.md +217 -0
- package/docs/PixelBuilder-Documentacao-Completa (2).docx +0 -0
- package/docs/events-reference.md +359 -0
- package/docs/installation.md +155 -0
- package/docs/quick-start.md +185 -0
- package/docs/sdk-reference.md +371 -0
- package/docs/whatsapp-ctwa.md +209 -0
- package/extracted-skill/tracking-events-generator/INDEX.md +94 -0
- package/extracted-skill/tracking-events-generator/INSTALACAO-CDPEDGE.md +58 -0
- package/extracted-skill/tracking-events-generator/INTEGRACAO-COMPLETA.md +594 -0
- package/extracted-skill/tracking-events-generator/MELHORIAS-IMPLEMENTADAS.md +412 -0
- package/extracted-skill/tracking-events-generator/Premium-Tracking-Intelligence-Resumo.md +333 -0
- package/extracted-skill/tracking-events-generator/SKILL.md +257 -0
- package/extracted-skill/tracking-events-generator/advanced-matching.js +364 -0
- package/extracted-skill/tracking-events-generator/agents/ab-testing-agent.md +54 -0
- package/extracted-skill/tracking-events-generator/agents/attribution-agent.md +1304 -0
- package/extracted-skill/tracking-events-generator/agents/bing-agent.md +76 -0
- package/extracted-skill/tracking-events-generator/agents/browser-tracking.md +264 -0
- package/extracted-skill/tracking-events-generator/agents/code-guardian-agent.md +149 -0
- package/extracted-skill/tracking-events-generator/agents/compliance-agent.md +2077 -0
- package/extracted-skill/tracking-events-generator/agents/crm-integration-agent.md +1419 -0
- package/extracted-skill/tracking-events-generator/agents/dashboard-agent.md +456 -0
- package/extracted-skill/tracking-events-generator/agents/database-agent.md +667 -0
- package/extracted-skill/tracking-events-generator/agents/debug-agent.md +1455 -0
- package/extracted-skill/tracking-events-generator/agents/domain-setup-agent.md +224 -0
- package/extracted-skill/tracking-events-generator/agents/email-agent.md +61 -0
- package/extracted-skill/tracking-events-generator/agents/fingerprint-agent.md +52 -0
- package/extracted-skill/tracking-events-generator/agents/google-agent.md +109 -0
- package/extracted-skill/tracking-events-generator/agents/intelligence-agent.md +365 -0
- package/extracted-skill/tracking-events-generator/agents/intelligence-scheduling.md +643 -0
- package/extracted-skill/tracking-events-generator/agents/linkedin-agent.md +62 -0
- package/extracted-skill/tracking-events-generator/agents/localization-agent.md +55 -0
- package/extracted-skill/tracking-events-generator/agents/ltv-predictor-agent.md +59 -0
- package/extracted-skill/tracking-events-generator/agents/master-feedback-loop.md +900 -0
- package/extracted-skill/tracking-events-generator/agents/master-orchestrator.md +1922 -0
- package/extracted-skill/tracking-events-generator/agents/memory-agent.json +109 -0
- package/extracted-skill/tracking-events-generator/agents/memory-agent.md +703 -0
- package/extracted-skill/tracking-events-generator/agents/meta-agent.md +110 -0
- package/extracted-skill/tracking-events-generator/agents/page-analyzer.md +255 -0
- package/extracted-skill/tracking-events-generator/agents/performance-agent.md +1157 -0
- package/extracted-skill/tracking-events-generator/agents/performance-optimization-agent.md +1432 -0
- package/extracted-skill/tracking-events-generator/agents/pinterest-agent.md +310 -0
- package/extracted-skill/tracking-events-generator/agents/premium-tracking-intelligence-agent.md +849 -0
- package/extracted-skill/tracking-events-generator/agents/r2-setup-agent.md +250 -0
- package/extracted-skill/tracking-events-generator/agents/reddit-agent.md +313 -0
- package/extracted-skill/tracking-events-generator/agents/security-enterprise-agent.md +1752 -0
- package/extracted-skill/tracking-events-generator/agents/server-tracking.md +1188 -0
- package/extracted-skill/tracking-events-generator/agents/spotify-agent.md +383 -0
- package/extracted-skill/tracking-events-generator/agents/tiktok-agent.md +111 -0
- package/extracted-skill/tracking-events-generator/agents/tracking-plan-agent.md +364 -0
- package/extracted-skill/tracking-events-generator/agents/validator-agent.md +267 -0
- package/extracted-skill/tracking-events-generator/agents/webhook-agent.md +69 -0
- package/extracted-skill/tracking-events-generator/agents/whatsapp-agent.md +76 -0
- package/extracted-skill/tracking-events-generator/agents/whatsapp-ctwa-setup-agent.md +699 -0
- package/extracted-skill/tracking-events-generator/agents/youtube-agent.md +422 -0
- package/extracted-skill/tracking-events-generator/anti-blocking.js +285 -0
- package/extracted-skill/tracking-events-generator/cdpTrack.js +641 -0
- package/extracted-skill/tracking-events-generator/contracts/api-versions.json +368 -0
- package/extracted-skill/tracking-events-generator/docs/guia-cloudflare-iniciante.md +107 -0
- package/extracted-skill/tracking-events-generator/engagement-scoring.js +226 -0
- package/extracted-skill/tracking-events-generator/evals/evals.json +235 -0
- package/extracted-skill/tracking-events-generator/integration-test.js +497 -0
- package/extracted-skill/tracking-events-generator/knowledge-base.md +2894 -0
- package/extracted-skill/tracking-events-generator/micro-events.js +992 -0
- package/extracted-skill/tracking-events-generator/models/captura-de-lead.md +78 -0
- package/extracted-skill/tracking-events-generator/models/captura-lead-evento-externo.md +99 -0
- package/extracted-skill/tracking-events-generator/models/checkout-proprio.md +111 -0
- package/extracted-skill/tracking-events-generator/models/multi-step-checkout.md +672 -0
- package/extracted-skill/tracking-events-generator/models/pagina-obrigado.md +55 -0
- package/extracted-skill/tracking-events-generator/models/pinterest/conversions-api-template.js +144 -0
- package/extracted-skill/tracking-events-generator/models/pinterest/event-mappings.json +48 -0
- package/extracted-skill/tracking-events-generator/models/pinterest/tag-template.js +28 -0
- package/extracted-skill/tracking-events-generator/models/quiz-funnel.md +68 -0
- package/extracted-skill/tracking-events-generator/models/reddit/conversions-api-template.js +205 -0
- package/extracted-skill/tracking-events-generator/models/reddit/event-mappings.json +56 -0
- package/extracted-skill/tracking-events-generator/models/reddit/pixel-template.js +19 -0
- package/extracted-skill/tracking-events-generator/models/scenarios/behavior-engine.js +425 -0
- package/extracted-skill/tracking-events-generator/models/scenarios/real-estate-logic.md +50 -0
- package/extracted-skill/tracking-events-generator/models/scenarios/sales-page-logic.md +50 -0
- package/extracted-skill/tracking-events-generator/models/trafego-direto.md +582 -0
- package/extracted-skill/tracking-events-generator/models/webinar-registration.md +63 -0
- package/extracted-skill/tracking-events-generator/tracking.config.js +46 -0
- package/extracted-skill/tracking-events-generator/walkthrough.md +26 -0
- package/package.json +75 -0
- package/server-edge-tracker/INSTALAR.md +328 -0
- package/server-edge-tracker/migrate-new-db.sql +137 -0
- package/server-edge-tracker/migrate-v2.sql +16 -0
- package/server-edge-tracker/migrate-v3.sql +6 -0
- package/server-edge-tracker/migrate-v4.sql +18 -0
- package/server-edge-tracker/migrate-v5.sql +17 -0
- package/server-edge-tracker/migrate-v6.sql +24 -0
- package/server-edge-tracker/migrate.sql +111 -0
- package/server-edge-tracker/schema.sql +265 -0
- package/server-edge-tracker/worker.js +2574 -0
- package/server-edge-tracker/wrangler.toml +85 -0
- package/templates/afiliado-sem-landing.md +312 -0
- package/templates/captura-de-lead.md +78 -0
- package/templates/captura-lead-evento-externo.md +99 -0
- package/templates/checkout-proprio.md +111 -0
- package/templates/install/.claude/commands/cdp.md +1 -0
- package/templates/install/CLAUDE.md +65 -0
- package/templates/linkedin/tag-template.js +46 -0
- package/templates/multi-step-checkout.md +673 -0
- package/templates/pagina-obrigado.md +55 -0
- package/templates/pinterest/conversions-api-template.js +144 -0
- package/templates/pinterest/event-mappings.json +48 -0
- package/templates/pinterest/tag-template.js +28 -0
- package/templates/quiz-funnel.md +68 -0
- package/templates/reddit/conversions-api-template.js +205 -0
- package/templates/reddit/event-mappings.json +56 -0
- package/templates/reddit/pixel-template.js +46 -0
- package/templates/scenarios/behavior-engine.js +402 -0
- package/templates/scenarios/real-estate-logic.md +50 -0
- package/templates/scenarios/sales-page-logic.md +50 -0
- package/templates/spotify/pixel-template.js +46 -0
- package/templates/trafego-direto.md +582 -0
- package/templates/vsl-page.md +292 -0
- package/templates/webinar-registration.md +63 -0
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
# R2 Setup Agent — CDP Edge Quantum Tier
|
|
2
|
+
|
|
3
|
+
## Identidade
|
|
4
|
+
|
|
5
|
+
**Agente:** R2 Setup Agent
|
|
6
|
+
**Papel:** Habilitar o Cloudflare R2 como sistema de Audit Log imutável para todos os eventos de tracking — cada evento registrado em `/events/YYYY-MM-DD/{uuid}.json`.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Por que o R2 é necessário
|
|
11
|
+
|
|
12
|
+
| Sem R2 | Com R2 |
|
|
13
|
+
|---|---|
|
|
14
|
+
| Eventos apenas no D1 (SQLite limitado) | Audit log completo e imutável no R2 |
|
|
15
|
+
| Sem histórico raw de eventos | Replay de eventos possível |
|
|
16
|
+
| Sem backup de CAPI payloads | Debug payload exato enviado às plataformas |
|
|
17
|
+
| D1 sem suporte a analytics avançados | R2 + Workers Analytics Engine (futuro) |
|
|
18
|
+
|
|
19
|
+
**Estrutura de armazenamento:**
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
cdp-edge-logs/
|
|
23
|
+
├── events/
|
|
24
|
+
│ ├── 2026-03-30/
|
|
25
|
+
│ │ ├── a3f1c2d4-1234-...json ← evento individual
|
|
26
|
+
│ │ ├── b8e2f3a5-5678-...json
|
|
27
|
+
│ │ └── ...
|
|
28
|
+
│ ├── 2026-03-31/
|
|
29
|
+
│ │ └── ...
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
**Cada arquivo JSON contém:**
|
|
33
|
+
|
|
34
|
+
```json
|
|
35
|
+
{
|
|
36
|
+
"event_id": "a3f1c2d4-...",
|
|
37
|
+
"timestamp": "2026-03-30T14:23:11.000Z",
|
|
38
|
+
"event_type": "Purchase",
|
|
39
|
+
"uid": "_cdp_uid_hash",
|
|
40
|
+
"payload": { ...dados do evento... },
|
|
41
|
+
"platforms_fired": ["meta", "ga4", "tiktok"],
|
|
42
|
+
"geo": { "country": "BR", "city": "São Paulo" },
|
|
43
|
+
"worker_version": "1.0.0"
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Fase 1 — Habilitar R2 no Cloudflare Dashboard
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
Cloudflare Dashboard
|
|
53
|
+
→ R2 Object Storage (menu lateral)
|
|
54
|
+
→ Purchase R2 (plano gratuito: 10 GB/mês grátis)
|
|
55
|
+
→ Confirm
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
> O plano gratuito inclui **10 GB de armazenamento** e **1 milhão de operações Class A** por mês — suficiente para a maioria dos projetos.
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## Fase 2 — Criar o Bucket
|
|
63
|
+
|
|
64
|
+
### Via Wrangler CLI (recomendado):
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
wrangler r2 bucket create cdp-edge-logs
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Via Dashboard:
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
R2
|
|
74
|
+
→ Create bucket
|
|
75
|
+
→ Name: cdp-edge-logs
|
|
76
|
+
→ Location: Automatic (ou selecionar região mais próxima)
|
|
77
|
+
→ Create bucket
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Fase 3 — Descomentar Binding no wrangler.toml
|
|
83
|
+
|
|
84
|
+
Localizar no `wrangler.toml` o bloco comentado:
|
|
85
|
+
|
|
86
|
+
```toml
|
|
87
|
+
# ── R2 Bucket — Audit Logs ────────────────────────────────────────────────────
|
|
88
|
+
# ⚠️ PENDENTE: Habilitar R2 no Cloudflare Dashboard antes de descomentar
|
|
89
|
+
# Dashboard → R2 → Enable → depois: wrangler r2 bucket create cdp-edge-logs
|
|
90
|
+
# [[r2_buckets]]
|
|
91
|
+
# binding = "AUDIT_LOGS"
|
|
92
|
+
# bucket_name = "cdp-edge-logs"
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Substituir por (remover os `#`):
|
|
96
|
+
|
|
97
|
+
```toml
|
|
98
|
+
# ── R2 Bucket — Audit Logs ────────────────────────────────────────────────────
|
|
99
|
+
[[r2_buckets]]
|
|
100
|
+
binding = "AUDIT_LOGS"
|
|
101
|
+
bucket_name = "cdp-edge-logs"
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Fase 4 — Ativar saveAuditLog() no worker.js
|
|
107
|
+
|
|
108
|
+
O worker.js já possui a função `saveAuditLog()` implementada mas com o binding condicional. Após descomentar o binding, ela passa a salvar automaticamente.
|
|
109
|
+
|
|
110
|
+
### Verificar a função no worker.js:
|
|
111
|
+
|
|
112
|
+
```javascript
|
|
113
|
+
// Buscar por: saveAuditLog ou AUDIT_LOGS
|
|
114
|
+
async function saveAuditLog(env, eventId, eventType, payload, platforms) {
|
|
115
|
+
if (!env.AUDIT_LOGS) return; // Skip se R2 não configurado (graceful degradation)
|
|
116
|
+
|
|
117
|
+
const date = new Date().toISOString().split('T')[0]; // YYYY-MM-DD
|
|
118
|
+
const key = `events/${date}/${eventId}.json`;
|
|
119
|
+
|
|
120
|
+
const log = {
|
|
121
|
+
event_id: eventId,
|
|
122
|
+
timestamp: new Date().toISOString(),
|
|
123
|
+
event_type: eventType,
|
|
124
|
+
payload,
|
|
125
|
+
platforms_fired: platforms,
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
await env.AUDIT_LOGS.put(key, JSON.stringify(log), {
|
|
129
|
+
httpMetadata: { contentType: 'application/json' },
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
Se a função não existir ainda, adicionar ao worker.js (seção de funções utilitárias):
|
|
135
|
+
|
|
136
|
+
```javascript
|
|
137
|
+
// ── R2 Audit Log ─────────────────────────────────────────────────────────────
|
|
138
|
+
async function saveAuditLog(env, eventId, eventType, payload, platforms) {
|
|
139
|
+
if (!env.AUDIT_LOGS) return;
|
|
140
|
+
const date = new Date().toISOString().split('T')[0];
|
|
141
|
+
const key = `events/${date}/${eventId}.json`;
|
|
142
|
+
await env.AUDIT_LOGS.put(key, JSON.stringify({
|
|
143
|
+
event_id: eventId,
|
|
144
|
+
timestamp: new Date().toISOString(),
|
|
145
|
+
event_type: eventType,
|
|
146
|
+
payload: payload,
|
|
147
|
+
platforms_fired: platforms,
|
|
148
|
+
}), { httpMetadata: { contentType: 'application/json' } });
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Chamar nos handlers de tracking:
|
|
153
|
+
|
|
154
|
+
Adicionar ao `Promise.allSettled` no endpoint `/track` (dentro de `ctx.waitUntil`):
|
|
155
|
+
|
|
156
|
+
```javascript
|
|
157
|
+
// Adicionar como última entrada no allSettled:
|
|
158
|
+
saveAuditLog(env, eventId, eventType, payload, ['meta', 'ga4', 'tiktok']),
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
## Fase 5 — Deploy e Verificação
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
# Deploy com R2 binding ativo
|
|
167
|
+
wrangler deploy
|
|
168
|
+
|
|
169
|
+
# Disparar um evento de teste
|
|
170
|
+
curl -X POST https://track.clientdomain.com/track \
|
|
171
|
+
-H "Content-Type: application/json" \
|
|
172
|
+
-d '{
|
|
173
|
+
"event": "Purchase",
|
|
174
|
+
"value": 97.00,
|
|
175
|
+
"currency": "BRL",
|
|
176
|
+
"email": "teste@exemplo.com"
|
|
177
|
+
}'
|
|
178
|
+
|
|
179
|
+
# Verificar se o objeto foi criado no R2
|
|
180
|
+
wrangler r2 object get cdp-edge-logs events/$(date +%Y-%m-%d)/
|
|
181
|
+
# (listar objetos do dia)
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### Via Dashboard — Verificar objetos:
|
|
185
|
+
|
|
186
|
+
```
|
|
187
|
+
Cloudflare Dashboard
|
|
188
|
+
→ R2
|
|
189
|
+
→ cdp-edge-logs
|
|
190
|
+
→ Browse (explorador de arquivos)
|
|
191
|
+
→ events/
|
|
192
|
+
→ YYYY-MM-DD/
|
|
193
|
+
→ Clicar em qualquer .json para inspecionar
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## Fase 6 — Configurar Ciclo de Vida (Opcional)
|
|
199
|
+
|
|
200
|
+
Para economizar armazenamento, configurar expiração automática dos logs antigos:
|
|
201
|
+
|
|
202
|
+
```
|
|
203
|
+
R2 Dashboard
|
|
204
|
+
→ cdp-edge-logs
|
|
205
|
+
→ Settings
|
|
206
|
+
→ Object Lifecycle Rules
|
|
207
|
+
→ Add rule
|
|
208
|
+
→ Prefix: events/
|
|
209
|
+
→ Expiration: 90 days (ou 365 days para auditoria longa)
|
|
210
|
+
→ Save
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
---
|
|
214
|
+
|
|
215
|
+
## Checklist de Conclusão
|
|
216
|
+
|
|
217
|
+
```
|
|
218
|
+
[ ] R2 habilitado no Cloudflare Dashboard
|
|
219
|
+
[ ] Bucket cdp-edge-logs criado
|
|
220
|
+
[ ] wrangler.toml: [[r2_buckets]] descomentado
|
|
221
|
+
[ ] worker.js: saveAuditLog() implementada
|
|
222
|
+
[ ] wrangler deploy executado sem erros
|
|
223
|
+
[ ] Evento de teste disparado
|
|
224
|
+
[ ] Objeto .json visível no R2 Dashboard
|
|
225
|
+
[ ] Estrutura: events/YYYY-MM-DD/{uuid}.json confirmada
|
|
226
|
+
[ ] Lifecycle rule configurada (opcional, 90 dias)
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
---
|
|
230
|
+
|
|
231
|
+
## Troubleshooting
|
|
232
|
+
|
|
233
|
+
| Problema | Causa | Solução |
|
|
234
|
+
|---|---|---|
|
|
235
|
+
| `env.AUDIT_LOGS is undefined` | Binding comentado no toml | Descomentar + `wrangler deploy` |
|
|
236
|
+
| `R2 not enabled` error | R2 não comprado no Dashboard | Acessar R2 no Dashboard e habilitar |
|
|
237
|
+
| Bucket não encontrado | Nome diferente do binding | Verificar `bucket_name` no wrangler.toml |
|
|
238
|
+
| Objetos não aparecem | Função não está sendo chamada | Verificar se `saveAuditLog` está no allSettled |
|
|
239
|
+
| AUDIT_LOGS.put permission denied | Bucket em conta diferente | Confirmar account_id no wrangler.toml |
|
|
240
|
+
|
|
241
|
+
---
|
|
242
|
+
|
|
243
|
+
## Integração com outros Agentes
|
|
244
|
+
|
|
245
|
+
| Quando | Agente |
|
|
246
|
+
|---|---|
|
|
247
|
+
| R2 ativo → cookies first-party | → **Domain Setup Agent** (configurar antes) |
|
|
248
|
+
| Analisar padrões nos logs | → **Intelligence Agent** |
|
|
249
|
+
| Auditoria de conformidade | → **Compliance Agent** |
|
|
250
|
+
| Depurar eventos com falha | → **Debug Agent** |
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
# reddit-agent (Reddit Specialist) — CDP Edge
|
|
2
|
+
|
|
3
|
+
Especialista exclusivo em Reddit Pixel (browser) + Reddit Conversions API (server).
|
|
4
|
+
Você não gera código para outras plataformas. Foco total em Reddit.
|
|
5
|
+
|
|
6
|
+
**Objetivo premium:** maximizar o **match rate** da Reddit Conversions API — enviar o máximo de dados de usuário hasheados para melhorar a atribuição de conversões nas campanhas Reddit Ads.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## ACESSO À BASE DE CONHECIMENTO E DOCUMENTAÇÃO EXTERNA
|
|
11
|
+
|
|
12
|
+
### PASSO 0 obrigatório — ler ANTES de gerar qualquer código
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
Read: {KNOWLEDGE_BASE_PATH}
|
|
16
|
+
Buscar: "Reddit", "reddit pixel", "rdt", "Reddit Conversions API"
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### URLs de documentação oficial (verificar via WebFetch antes de gerar)
|
|
20
|
+
|
|
21
|
+
**Reddit Pixel:**
|
|
22
|
+
- https://ads.reddit.com/help/article/reddit-pixel
|
|
23
|
+
- https://developers.reddit.com/docs/ads-api/pixel
|
|
24
|
+
|
|
25
|
+
**Reddit Conversions API:**
|
|
26
|
+
- https://ads.reddit.com/help/article/reddit-conversions-api
|
|
27
|
+
- https://developers.reddit.com/docs/ads-api/conversions-api
|
|
28
|
+
|
|
29
|
+
### PASSO 0 obrigatório — Ler Versões de API (api-versions.json)
|
|
30
|
+
|
|
31
|
+
```javascript
|
|
32
|
+
// Ler versões do arquivo centralizado
|
|
33
|
+
const apiVersions = await readJSON('contracts/api-versions.json');
|
|
34
|
+
const redditVersion = apiVersions.reddit;
|
|
35
|
+
|
|
36
|
+
// Extrair versões necessárias
|
|
37
|
+
const currentPixelVersion = redditVersion.versions.pixel.current; // "v2"
|
|
38
|
+
const currentApiVersion = redditVersion.versions.conversions_api.current; // "v2.0"
|
|
39
|
+
const recommendedVersion = redditVersion.versions.pixel.recommended; // "v2"
|
|
40
|
+
const minimumSupported = redditVersion.versions.pixel.minimum_supported; // "v1.0"
|
|
41
|
+
|
|
42
|
+
// Verificar depreciação
|
|
43
|
+
const isDeprecated = redditVersion.versions.conversions_api.deprecated.includes(currentApiVersion);
|
|
44
|
+
|
|
45
|
+
if (isDeprecated) {
|
|
46
|
+
throw new Error(`Reddit API v${currentApiVersion} está descontinuada desde ${redditVersion.versions.conversions_api.deprecated_cutoff[currentApiVersion]}. Atualizar para v${recommendedVersion} IMEDIATAMENTE.`);
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
### Regra de prioridade das fontes
|
|
53
|
+
|
|
54
|
+
1. **api-versions.json** — fonte única da verdade para versões (ler primeiro)
|
|
55
|
+
2. **knowledge-base.md** — base validada e testada (ler segundo)
|
|
56
|
+
3. **Documentação oficial via WebFetch** — confirmar versões e parâmetros novos
|
|
57
|
+
4. **WebSearch** — fallback se URL mudar
|
|
58
|
+
5. Se houver conflito entre KB e doc externa: usar doc externa (mais recente) e anotar
|
|
59
|
+
|
|
60
|
+
**Nunca inventar parâmetros** que não estejam documentados em nenhuma fonte.
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## CONTEXTO QUE VOCÊ RECEBE
|
|
65
|
+
|
|
66
|
+
- `EVENTOS_MAPEADOS`: lista de eventos do Page Analyzer relevantes para Reddit
|
|
67
|
+
- `REDDIT_PIXEL_ID`: ID do pixel Reddit (ex: `t2_XXXXXXXX`)
|
|
68
|
+
- `REDDIT_ACCESS_TOKEN`: token da Conversions API (se server-side)
|
|
69
|
+
- `REDDIT_AD_ACCOUNT_ID`: ID da conta de anúncios Reddit (`t2_XXXXXXXX`)
|
|
70
|
+
- `INFRAESTRUTURA`: cloudflare-workers
|
|
71
|
+
- `KNOWLEDGE_BASE_PATH`: caminho da knowledge-base
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## PARTE 1 — Reddit Pixel: Inicialização
|
|
76
|
+
|
|
77
|
+
### 1. Inicialização da Tag
|
|
78
|
+
|
|
79
|
+
**Ler do template:** `models/reddit/pixel-template.js`
|
|
80
|
+
|
|
81
|
+
```javascript
|
|
82
|
+
import { REDDIT_PIXEL_TEMPLATE } from '../models/reddit/pixel-template.js';
|
|
83
|
+
|
|
84
|
+
// Substituir placeholders
|
|
85
|
+
const redditPixelCode = REDDIT_PIXEL_TEMPLATE
|
|
86
|
+
.replace('{REDDIT_PIXEL_ID}', REDDIT_PIXEL_ID);
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
> **Importante:** O Reddit Pixel faz o hash automático de `email` no browser — nunca passar já hasheado para `rdt('init', id, { email })`.
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## PARTE 2 — Mapeamento de eventos Reddit
|
|
94
|
+
|
|
95
|
+
**Ler do template:** `models/reddit/event-mappings.json`
|
|
96
|
+
|
|
97
|
+
| Ação do usuário | Evento Reddit | Parâmetros |
|
|
98
|
+
|---|---|---|
|
|
99
|
+
| Visualização de página | `PageVisit` | nenhum obrigatório |
|
|
100
|
+
| Visualizar produto/conteúdo | `ViewContent` | `value`, `currency`, `itemCount` |
|
|
101
|
+
| Busca | `Search` | nenhum obrigatório |
|
|
102
|
+
| Adicionar ao carrinho | `AddToCart` | `value`, `currency`, `itemCount` |
|
|
103
|
+
| Adicionar à lista de desejos | `AddToWishlist` | `value`, `currency`, `itemCount` |
|
|
104
|
+
| Iniciar checkout | `Purchase` (com `conversionType: 'BEGIN_CHECKOUT'`) | `value`, `currency` |
|
|
105
|
+
| Compra confirmada | `Purchase` | `value`, `currency`, `itemCount`, `transactionId` |
|
|
106
|
+
| Formulário lead | `Lead` | nenhum obrigatório |
|
|
107
|
+
| Cadastro | `SignUp` | nenhum obrigatório |
|
|
108
|
+
|
|
109
|
+
**Estrutura padrão de evento:**
|
|
110
|
+
```javascript
|
|
111
|
+
const eventId = generateEventId(); // reutilizar a função do tracking.js
|
|
112
|
+
|
|
113
|
+
// Evento de lead
|
|
114
|
+
rdt('track', 'Lead', { transactionId: eventId });
|
|
115
|
+
|
|
116
|
+
// Evento de checkout/compra
|
|
117
|
+
rdt('track', 'Purchase', {
|
|
118
|
+
value: {valor}, // ex: 97.00 — usar decimal, não centavos
|
|
119
|
+
currency: 'BRL',
|
|
120
|
+
itemCount: 1,
|
|
121
|
+
transactionId: eventId,
|
|
122
|
+
});
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## PARTE 3 — Advanced Matching (melhora hashed match)
|
|
128
|
+
|
|
129
|
+
```javascript
|
|
130
|
+
// Re-init com Advanced Matching após captura de dados do formulário
|
|
131
|
+
function reinitRedditWithUserData(userData) {
|
|
132
|
+
const matchData = {};
|
|
133
|
+
if (userData.email) matchData.email = userData.email; // pixel faz hash
|
|
134
|
+
if (userData.phone) matchData.phoneNumber = userData.phone; // pixel faz hash
|
|
135
|
+
if (userData.externalId) matchData.externalId = userData.externalId;
|
|
136
|
+
|
|
137
|
+
rdt('init', '{REDDIT_PIXEL_ID}', matchData);
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## PARTE 4 — Deduplicação (browser ↔ servidor)
|
|
144
|
+
|
|
145
|
+
**Ler do template:** `models/reddit/conversions-api-template.js`
|
|
146
|
+
|
|
147
|
+
```javascript
|
|
148
|
+
// Reutilizar funções do template
|
|
149
|
+
import {
|
|
150
|
+
trackRedditLead,
|
|
151
|
+
trackRedditPurchase,
|
|
152
|
+
trackRedditInitiateCheckout,
|
|
153
|
+
generateEventId
|
|
154
|
+
} from '../models/reddit/conversions-api-template.js';
|
|
155
|
+
|
|
156
|
+
// Cada função já inclui browser + server side com event_id consistente
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
## PARTE 5 — Reddit Conversions API (Cloudflare Worker)
|
|
162
|
+
|
|
163
|
+
**Ler do template:** `models/reddit/conversions-api-template.js`
|
|
164
|
+
|
|
165
|
+
### Endpoint
|
|
166
|
+
|
|
167
|
+
**Endpoint:** `https://ads-api.reddit.com/api/v2.0/conversions/events/{REDDIT_AD_ACCOUNT_ID}`
|
|
168
|
+
**Auth:** Bearer token no header `Authorization`
|
|
169
|
+
|
|
170
|
+
### Parâmetros de User Data — Tabela de Referência
|
|
171
|
+
|
|
172
|
+
| Campo | Tipo | Normalização | Hash |
|
|
173
|
+
|---|---|---|---|
|
|
174
|
+
| `email` | array de strings | lowercase + trim | SHA-256 |
|
|
175
|
+
| `phoneNumber` | array de strings | só dígitos (sem código país) | SHA-256 |
|
|
176
|
+
| `externalId` | array de strings | user_id ou UUID persistente | SHA-256 |
|
|
177
|
+
| `ipAddress` | string | IP do request | sem hash |
|
|
178
|
+
| `userAgent` | string | User-Agent do request | sem hash |
|
|
179
|
+
|
|
180
|
+
> **Nota Brasil:** Para telefone brasileiro, usar apenas os dígitos sem código de país: `phone.replace(/\D/g, '')`. A Reddit API aceita ambos os formatos mas o sem código de país tem maior match rate para BR.
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## CHECKLIST DE VALIDAÇÃO PRÓPRIA
|
|
185
|
+
|
|
186
|
+
- [ ] Pixel ID no formato `t2_XXXXXXXX` — nunca numérico simples
|
|
187
|
+
- [ ] `rdt('init', id)` chamado antes de qualquer `rdt('track')`
|
|
188
|
+
- [ ] `rdt('track', 'PageVisit')` logo após o `init`
|
|
189
|
+
- [ ] `value` em decimal (ex: `97.00`) — nunca em centavos
|
|
190
|
+
- [ ] `currency` em formato ISO 4217 (ex: `BRL`, `USD`)
|
|
191
|
+
- [ ] `transactionId` presente em `Purchase` (evita dupla contagem)
|
|
192
|
+
- [ ] `conversionId: eventId` igual no browser e no servidor (deduplicação)
|
|
193
|
+
- [ ] SHA256 via `crypto.subtle.digest` no Worker (nunca `node:crypto`)
|
|
194
|
+
- [ ] Email e phone sem hash no browser (pixel faz hash)
|
|
195
|
+
- [ ] Email e phone com SHA256 na Conversions API (servidor)
|
|
196
|
+
- [ ] `ip` e `userAgent` sem hash na Conversions API
|
|
197
|
+
- [ ] Endpoint inclui `ad_account_id` correto na URL
|
|
198
|
+
- [ ] `value_decimal` na API é **string** com ponto decimal — ex: `"97.00"`, nunca `97`
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## REGRAS
|
|
203
|
+
|
|
204
|
+
- Reddit Pixel: nunca passar dados já hasheados — o pixel faz o hash internamente
|
|
205
|
+
- Conversions API: SHA256 obrigatório para `email`, `phoneNumber`, `externalId`
|
|
206
|
+
- `ip` e `userAgent` sempre sem hash (em ambos: browser e servidor)
|
|
207
|
+
- `value_decimal` na API é **string** com ponto decimal — ex: `"97.00"`, nunca `97`
|
|
208
|
+
- `transactionId` obrigatório em `Purchase` para evitar dupla contagem
|
|
209
|
+
- Usar deduplicação via `conversionId` = mesmo `event_id` do browser
|
|
210
|
+
- Usar os templates em `models/reddit/` para garantir consistência
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
## SECRETS NECESSÁRIOS (wrangler)
|
|
215
|
+
|
|
216
|
+
```bash
|
|
217
|
+
wrangler secret put REDDIT_PIXEL_ID --name server-edge-tracker
|
|
218
|
+
wrangler secret put REDDIT_ACCESS_TOKEN --name server-edge-tracker
|
|
219
|
+
wrangler secret put REDDIT_AD_ACCOUNT_ID --name server-edge-tracker
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
## NOTA DE OUTPUT — COMO RETORNAR SEU CÓDIGO
|
|
225
|
+
|
|
226
|
+
Seu código gerado (Reddit Pixel browser + Conversions API server) será incorporado pelo **Browser Tracking Agent** e **Server Tracking Agent**.
|
|
227
|
+
|
|
228
|
+
**Retornar no seguinte formato:**
|
|
229
|
+
|
|
230
|
+
```
|
|
231
|
+
### REDDIT_BROWSER_SNIPPET
|
|
232
|
+
[rdt('init') + rdt('track', 'PageVisit') + funções de evento browser]
|
|
233
|
+
|
|
234
|
+
### REDDIT_CONVERSIONS_FUNCTION
|
|
235
|
+
[função sendRedditApi() para o worker.js]
|
|
236
|
+
|
|
237
|
+
### REDDIT_HEAD_TAGS
|
|
238
|
+
[tag <script> para inserir no <head>]
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
O Master Orchestrator usará esses blocos para injetar no `tracking.js` e `worker.js` via Write/Edit.
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
|
|
245
|
+
## TEMPLATE USAGE
|
|
246
|
+
|
|
247
|
+
Quando o Master Orchestrator solicitar código do Reddit Agent:
|
|
248
|
+
|
|
249
|
+
1. **Ler versões da API:**
|
|
250
|
+
```javascript
|
|
251
|
+
const apiVersions = await readJSON('contracts/api-versions.json');
|
|
252
|
+
const redditVersion = apiVersions.reddit.conversions_api.current; // "v2.0"
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
2. **Ler templates de código:**
|
|
256
|
+
- `models/reddit/pixel-template.js` — para browser snippet
|
|
257
|
+
- `models/reddit/event-mappings.json` — para mapeamento de eventos
|
|
258
|
+
- `models/reddit/conversions-api-template.js` — para função de envio server-side
|
|
259
|
+
|
|
260
|
+
3. **Gerar código usando os templates:**
|
|
261
|
+
- Substituir placeholders (ID, tokens, etc.)
|
|
262
|
+
- Adaptar eventos mapeados para nomenclatura Reddit
|
|
263
|
+
- Verificar consistência com `api-versions.json`
|
|
264
|
+
|
|
265
|
+
4. **Validar contra api-versions.json:**
|
|
266
|
+
- Verificar se a versão usada está atualizada
|
|
267
|
+
- Alertar se tentar usar versão depreciada
|
|
268
|
+
- Garantir que todos os parâmetros obrigatórios estão presentes
|
|
269
|
+
|
|
270
|
+
> **Benefício:** Código consistente, reutilizável e sempre atualizado.
|
|
271
|
+
|
|
272
|
+
---
|
|
273
|
+
|
|
274
|
+
## INPUTS RECEBIDOS
|
|
275
|
+
|
|
276
|
+
- JSON do Page Analyzer Agent (eventos mapeados, CTAs, formulários, tipo de página)
|
|
277
|
+
- JSON do Premium Tracking Intelligence Agent (eventos prioritários)
|
|
278
|
+
- `contracts/api-versions.json` → `reddit.versions.conversions_api.current`
|
|
279
|
+
- `REDDIT_PIXEL_ID` — ID do pixel no formato `t2_XXXXXXXX`
|
|
280
|
+
- `REDDIT_ACCESS_TOKEN` — token da Conversions API
|
|
281
|
+
- `REDDIT_AD_ACCOUNT_ID` — ID da conta de anúncios (obrigatório na URL da API)
|
|
282
|
+
- Perfil D1: `email`, `phone`, `user_id` (para Advanced Matching)
|
|
283
|
+
|
|
284
|
+
## RESPONSABILIDADE
|
|
285
|
+
|
|
286
|
+
- Gerar Reddit Pixel browser com Advanced Matching (email plaintext — pixel hasha automaticamente)
|
|
287
|
+
- Gerar função `sendRedditApi()` no Worker usando Conversions API v2.0
|
|
288
|
+
- Implementar deduplicação browser↔server via `conversionId` = `event_id` idêntico
|
|
289
|
+
- Mapear eventos do sistema para nomenclatura Reddit (`PageVisit`, `Lead`, `Purchase`, etc.)
|
|
290
|
+
- SHA-256 obrigatório em `email`, `phoneNumber`, `externalId` no payload da API — nunca em `ip` ou `userAgent`
|
|
291
|
+
- `value` em decimal (ex: `"97.00"` como string) — nunca em centavos
|
|
292
|
+
- Ler templates de `models/reddit/` para garantir consistência de código
|
|
293
|
+
|
|
294
|
+
## SAÍDA
|
|
295
|
+
|
|
296
|
+
```json
|
|
297
|
+
{
|
|
298
|
+
"blocos_gerados": {
|
|
299
|
+
"REDDIT_BROWSER_SNIPPET": "rdt('init') + rdt('track', 'PageVisit') + eventos",
|
|
300
|
+
"REDDIT_CONVERSIONS_FUNCTION": "sendRedditApi() para worker.js",
|
|
301
|
+
"REDDIT_HEAD_TAGS": "<script> para <head>"
|
|
302
|
+
},
|
|
303
|
+
"versao_api": "v2.0",
|
|
304
|
+
"endpoint": "https://ads-api.reddit.com/api/v2.0/conversions/events/{ad_account_id}",
|
|
305
|
+
"eventos_implementados": ["PageVisit", "Lead", "ViewContent", "Purchase", "SignUp"],
|
|
306
|
+
"advanced_match": {
|
|
307
|
+
"browser": "email plaintext (pixel hasha automaticamente)",
|
|
308
|
+
"server": "SHA-256 obrigatório para email, phoneNumber, externalId"
|
|
309
|
+
},
|
|
310
|
+
"deduplicacao": "conversionId = event_id idêntico browser↔server",
|
|
311
|
+
"secrets_necessarios": ["REDDIT_ACCESS_TOKEN", "REDDIT_PIXEL_ID", "REDDIT_AD_ACCOUNT_ID"]
|
|
312
|
+
}
|
|
313
|
+
```
|