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.
Files changed (128) hide show
  1. package/README.md +367 -0
  2. package/bin/cdp-edge.js +61 -0
  3. package/contracts/api-versions.json +368 -0
  4. package/dist/commands/analyze.js +52 -0
  5. package/dist/commands/infra.js +54 -0
  6. package/dist/commands/install.js +168 -0
  7. package/dist/commands/server.js +174 -0
  8. package/dist/commands/setup.js +123 -0
  9. package/dist/commands/validate.js +84 -0
  10. package/dist/index.js +12 -0
  11. package/docs/CI-CD-SETUP.md +217 -0
  12. package/docs/PixelBuilder-Documentacao-Completa (2).docx +0 -0
  13. package/docs/events-reference.md +359 -0
  14. package/docs/installation.md +155 -0
  15. package/docs/quick-start.md +185 -0
  16. package/docs/sdk-reference.md +371 -0
  17. package/docs/whatsapp-ctwa.md +209 -0
  18. package/extracted-skill/tracking-events-generator/INDEX.md +94 -0
  19. package/extracted-skill/tracking-events-generator/INSTALACAO-CDPEDGE.md +58 -0
  20. package/extracted-skill/tracking-events-generator/INTEGRACAO-COMPLETA.md +594 -0
  21. package/extracted-skill/tracking-events-generator/MELHORIAS-IMPLEMENTADAS.md +412 -0
  22. package/extracted-skill/tracking-events-generator/Premium-Tracking-Intelligence-Resumo.md +333 -0
  23. package/extracted-skill/tracking-events-generator/SKILL.md +257 -0
  24. package/extracted-skill/tracking-events-generator/advanced-matching.js +364 -0
  25. package/extracted-skill/tracking-events-generator/agents/ab-testing-agent.md +54 -0
  26. package/extracted-skill/tracking-events-generator/agents/attribution-agent.md +1304 -0
  27. package/extracted-skill/tracking-events-generator/agents/bing-agent.md +76 -0
  28. package/extracted-skill/tracking-events-generator/agents/browser-tracking.md +264 -0
  29. package/extracted-skill/tracking-events-generator/agents/code-guardian-agent.md +149 -0
  30. package/extracted-skill/tracking-events-generator/agents/compliance-agent.md +2077 -0
  31. package/extracted-skill/tracking-events-generator/agents/crm-integration-agent.md +1419 -0
  32. package/extracted-skill/tracking-events-generator/agents/dashboard-agent.md +456 -0
  33. package/extracted-skill/tracking-events-generator/agents/database-agent.md +667 -0
  34. package/extracted-skill/tracking-events-generator/agents/debug-agent.md +1455 -0
  35. package/extracted-skill/tracking-events-generator/agents/domain-setup-agent.md +224 -0
  36. package/extracted-skill/tracking-events-generator/agents/email-agent.md +61 -0
  37. package/extracted-skill/tracking-events-generator/agents/fingerprint-agent.md +52 -0
  38. package/extracted-skill/tracking-events-generator/agents/google-agent.md +109 -0
  39. package/extracted-skill/tracking-events-generator/agents/intelligence-agent.md +365 -0
  40. package/extracted-skill/tracking-events-generator/agents/intelligence-scheduling.md +643 -0
  41. package/extracted-skill/tracking-events-generator/agents/linkedin-agent.md +62 -0
  42. package/extracted-skill/tracking-events-generator/agents/localization-agent.md +55 -0
  43. package/extracted-skill/tracking-events-generator/agents/ltv-predictor-agent.md +59 -0
  44. package/extracted-skill/tracking-events-generator/agents/master-feedback-loop.md +900 -0
  45. package/extracted-skill/tracking-events-generator/agents/master-orchestrator.md +1922 -0
  46. package/extracted-skill/tracking-events-generator/agents/memory-agent.json +109 -0
  47. package/extracted-skill/tracking-events-generator/agents/memory-agent.md +703 -0
  48. package/extracted-skill/tracking-events-generator/agents/meta-agent.md +110 -0
  49. package/extracted-skill/tracking-events-generator/agents/page-analyzer.md +255 -0
  50. package/extracted-skill/tracking-events-generator/agents/performance-agent.md +1157 -0
  51. package/extracted-skill/tracking-events-generator/agents/performance-optimization-agent.md +1432 -0
  52. package/extracted-skill/tracking-events-generator/agents/pinterest-agent.md +310 -0
  53. package/extracted-skill/tracking-events-generator/agents/premium-tracking-intelligence-agent.md +849 -0
  54. package/extracted-skill/tracking-events-generator/agents/r2-setup-agent.md +250 -0
  55. package/extracted-skill/tracking-events-generator/agents/reddit-agent.md +313 -0
  56. package/extracted-skill/tracking-events-generator/agents/security-enterprise-agent.md +1752 -0
  57. package/extracted-skill/tracking-events-generator/agents/server-tracking.md +1188 -0
  58. package/extracted-skill/tracking-events-generator/agents/spotify-agent.md +383 -0
  59. package/extracted-skill/tracking-events-generator/agents/tiktok-agent.md +111 -0
  60. package/extracted-skill/tracking-events-generator/agents/tracking-plan-agent.md +364 -0
  61. package/extracted-skill/tracking-events-generator/agents/validator-agent.md +267 -0
  62. package/extracted-skill/tracking-events-generator/agents/webhook-agent.md +69 -0
  63. package/extracted-skill/tracking-events-generator/agents/whatsapp-agent.md +76 -0
  64. package/extracted-skill/tracking-events-generator/agents/whatsapp-ctwa-setup-agent.md +699 -0
  65. package/extracted-skill/tracking-events-generator/agents/youtube-agent.md +422 -0
  66. package/extracted-skill/tracking-events-generator/anti-blocking.js +285 -0
  67. package/extracted-skill/tracking-events-generator/cdpTrack.js +641 -0
  68. package/extracted-skill/tracking-events-generator/contracts/api-versions.json +368 -0
  69. package/extracted-skill/tracking-events-generator/docs/guia-cloudflare-iniciante.md +107 -0
  70. package/extracted-skill/tracking-events-generator/engagement-scoring.js +226 -0
  71. package/extracted-skill/tracking-events-generator/evals/evals.json +235 -0
  72. package/extracted-skill/tracking-events-generator/integration-test.js +497 -0
  73. package/extracted-skill/tracking-events-generator/knowledge-base.md +2894 -0
  74. package/extracted-skill/tracking-events-generator/micro-events.js +992 -0
  75. package/extracted-skill/tracking-events-generator/models/captura-de-lead.md +78 -0
  76. package/extracted-skill/tracking-events-generator/models/captura-lead-evento-externo.md +99 -0
  77. package/extracted-skill/tracking-events-generator/models/checkout-proprio.md +111 -0
  78. package/extracted-skill/tracking-events-generator/models/multi-step-checkout.md +672 -0
  79. package/extracted-skill/tracking-events-generator/models/pagina-obrigado.md +55 -0
  80. package/extracted-skill/tracking-events-generator/models/pinterest/conversions-api-template.js +144 -0
  81. package/extracted-skill/tracking-events-generator/models/pinterest/event-mappings.json +48 -0
  82. package/extracted-skill/tracking-events-generator/models/pinterest/tag-template.js +28 -0
  83. package/extracted-skill/tracking-events-generator/models/quiz-funnel.md +68 -0
  84. package/extracted-skill/tracking-events-generator/models/reddit/conversions-api-template.js +205 -0
  85. package/extracted-skill/tracking-events-generator/models/reddit/event-mappings.json +56 -0
  86. package/extracted-skill/tracking-events-generator/models/reddit/pixel-template.js +19 -0
  87. package/extracted-skill/tracking-events-generator/models/scenarios/behavior-engine.js +425 -0
  88. package/extracted-skill/tracking-events-generator/models/scenarios/real-estate-logic.md +50 -0
  89. package/extracted-skill/tracking-events-generator/models/scenarios/sales-page-logic.md +50 -0
  90. package/extracted-skill/tracking-events-generator/models/trafego-direto.md +582 -0
  91. package/extracted-skill/tracking-events-generator/models/webinar-registration.md +63 -0
  92. package/extracted-skill/tracking-events-generator/tracking.config.js +46 -0
  93. package/extracted-skill/tracking-events-generator/walkthrough.md +26 -0
  94. package/package.json +75 -0
  95. package/server-edge-tracker/INSTALAR.md +328 -0
  96. package/server-edge-tracker/migrate-new-db.sql +137 -0
  97. package/server-edge-tracker/migrate-v2.sql +16 -0
  98. package/server-edge-tracker/migrate-v3.sql +6 -0
  99. package/server-edge-tracker/migrate-v4.sql +18 -0
  100. package/server-edge-tracker/migrate-v5.sql +17 -0
  101. package/server-edge-tracker/migrate-v6.sql +24 -0
  102. package/server-edge-tracker/migrate.sql +111 -0
  103. package/server-edge-tracker/schema.sql +265 -0
  104. package/server-edge-tracker/worker.js +2574 -0
  105. package/server-edge-tracker/wrangler.toml +85 -0
  106. package/templates/afiliado-sem-landing.md +312 -0
  107. package/templates/captura-de-lead.md +78 -0
  108. package/templates/captura-lead-evento-externo.md +99 -0
  109. package/templates/checkout-proprio.md +111 -0
  110. package/templates/install/.claude/commands/cdp.md +1 -0
  111. package/templates/install/CLAUDE.md +65 -0
  112. package/templates/linkedin/tag-template.js +46 -0
  113. package/templates/multi-step-checkout.md +673 -0
  114. package/templates/pagina-obrigado.md +55 -0
  115. package/templates/pinterest/conversions-api-template.js +144 -0
  116. package/templates/pinterest/event-mappings.json +48 -0
  117. package/templates/pinterest/tag-template.js +28 -0
  118. package/templates/quiz-funnel.md +68 -0
  119. package/templates/reddit/conversions-api-template.js +205 -0
  120. package/templates/reddit/event-mappings.json +56 -0
  121. package/templates/reddit/pixel-template.js +46 -0
  122. package/templates/scenarios/behavior-engine.js +402 -0
  123. package/templates/scenarios/real-estate-logic.md +50 -0
  124. package/templates/scenarios/sales-page-logic.md +50 -0
  125. package/templates/spotify/pixel-template.js +46 -0
  126. package/templates/trafego-direto.md +582 -0
  127. package/templates/vsl-page.md +292 -0
  128. 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
+ ```