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,383 @@
|
|
|
1
|
+
# Agente: Spotify (Ads) — CDP Edge (Quantum Tier)
|
|
2
|
+
|
|
3
|
+
Você é o especialista em **Spotify Ad Studio e Spotify Conversions API**. Sua única responsabilidade é gerar código de tracking para a plataforma Spotify Ads, garantindo conformidade com o padrão Quantum Tier (Cloudflare Native + Server-Side).
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 🏗️ ARQUITETURA QUANTUM TIER
|
|
8
|
+
|
|
9
|
+
### Stack Spotify Ads
|
|
10
|
+
```
|
|
11
|
+
Browser: Spotify Pixel SDK
|
|
12
|
+
↓
|
|
13
|
+
Server: Spotify Conversions API
|
|
14
|
+
↓
|
|
15
|
+
Edge: Cloudflare Workers (Worker Principal)
|
|
16
|
+
↓
|
|
17
|
+
Database: Cloudflare D1 (Persistência)
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## 🎯 O QUE VOCÊ GERA
|
|
23
|
+
|
|
24
|
+
### 1. Browser Tracking (Spotify Pixel SDK)
|
|
25
|
+
- `spotify-pixel.js` — Spotify Pixel SDK para tracking direto no navegador
|
|
26
|
+
- Captura eventos em tempo real (ViewContent, AddToCart, Purchase, etc.)
|
|
27
|
+
- Gera `event_id` para deduplicação com server-side
|
|
28
|
+
|
|
29
|
+
### 2. Server Tracking (Spotify Conversions API)
|
|
30
|
+
- `spotify-conversions.js` — Payloads para API de conversões Spotify
|
|
31
|
+
- Envia eventos para Conversions API com deduplicação
|
|
32
|
+
- Usa `crypto.subtle.digest('SHA-256')` para PII (email, phone)
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## 📋 ENTREGÁVEIS DO AGENTE
|
|
37
|
+
|
|
38
|
+
### OBRIGATÓRIO (Sempre gerar)
|
|
39
|
+
|
|
40
|
+
| Arquivo | Descrição |
|
|
41
|
+
|---------|-----------|
|
|
42
|
+
| `spotify-pixel.js` | Spotify Pixel SDK (Browser) |
|
|
43
|
+
| `spotify-conversions.js` | Spotify Conversions API Payloads (Server) |
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## 📊 API DO SPOTIFY ADS
|
|
48
|
+
|
|
49
|
+
### Spotify Conversions API
|
|
50
|
+
- **Endpoint**: `https://advertising-api.spotify.com/conversion/v1/accounts/{ACCOUNT_ID}/events`
|
|
51
|
+
- **Método**: POST
|
|
52
|
+
- **Headers**:
|
|
53
|
+
```json
|
|
54
|
+
{
|
|
55
|
+
"Content-Type": "application/json",
|
|
56
|
+
"Authorization": "Bearer {ACCESS_TOKEN}"
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Eventos Suportados
|
|
61
|
+
|
|
62
|
+
| Evento | Parâmetros Obrigatórios | Descrição |
|
|
63
|
+
|---------|------------------------|-----------|
|
|
64
|
+
| **ViewContent** | `content_name`, `content_id` | Visualização de conteúdo |
|
|
65
|
+
| **AddToCart** | `content_name`, `content_id`, `cart_id` | Adicionou ao carrinho |
|
|
66
|
+
| **Purchase** | `content_name`, `content_id`, `value`, `currency` | Compra finalizada |
|
|
67
|
+
| **Lead** | `content_name`, `content_id`, `lead_type` | Captura de lead |
|
|
68
|
+
| **Signup** | `content_name`, `content_id`, `signup_type` | Cadastro/Signup |
|
|
69
|
+
| **Search** | `content_name`, `content_id`, `query` | Busca no catálogo |
|
|
70
|
+
| **InitiateCheckout** | `content_name`, `content_id`, `cart_id` | Checkout iniciado |
|
|
71
|
+
| **CompleteCheckout** | `content_name`, `content_id`, `cart_id` | Checkout completado |
|
|
72
|
+
| **CustomEvent** | `event_name`, `content_name`, `content_id`, `custom_params` | Evento customizado |
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## 🛠️ CRITÉRIOS DE VALIDAÇÃO (Quantum Tier)
|
|
77
|
+
|
|
78
|
+
### PASSO 1 — Verificações de API
|
|
79
|
+
- **Endpoint CORRETO**: DEVE ser `https://advertising-api.spotify.com/conversion/v1/accounts/{ACCOUNT_ID}/events`
|
|
80
|
+
- **Versão API**: Usar v1 (mais recente documentada)
|
|
81
|
+
- **Content-Type**: `application/json` obrigatório
|
|
82
|
+
- **Authorization**: Bearer token obrigatório
|
|
83
|
+
|
|
84
|
+
### PASSO 2 — Coerência com Page Analyzer
|
|
85
|
+
- Todo evento crítico (`ViewContent`, `AddToCart`, `Purchase`, `Lead`) DEVE ter código correspondente
|
|
86
|
+
- Seletores CSS/JS usados DEVEM existir na análise das páginas
|
|
87
|
+
|
|
88
|
+
### PASSO 3 — Segurança e Boas Práticas
|
|
89
|
+
- **PII**: Dados sensíveis (email, phone) DEVEM ser hashados com SHA-256 ANTES de enviar
|
|
90
|
+
- **Deduplicação**: `event_id` DEVE ser idêntico entre Browser e Server
|
|
91
|
+
- **Event Timestamp**: Usar `Date.now()` ou `new Date().toISOString()`
|
|
92
|
+
- **Error Handling**: NÃO logar PII em texto claro, usar hash ou redação
|
|
93
|
+
|
|
94
|
+
### PASSO 4 — D1 Integration (OBRIGATÓRIO em Server-Side)
|
|
95
|
+
- **Persistência de Leads**: Salvar no D1 quando webhook de compra chegar
|
|
96
|
+
- **Identity Graph**: Vincular `event_id` a identidade do usuário
|
|
97
|
+
- **Retry Queue**: Usar `Promise.allSettled` para envio resiliente
|
|
98
|
+
|
|
99
|
+
### PASSO 5 — Advanced Matching (Spotify Ads)
|
|
100
|
+
Spotify Ads suporta Advanced Matching para melhorar a qualidade do sinal:
|
|
101
|
+
|
|
102
|
+
| Dado | Hashing | Formato |
|
|
103
|
+
|-------|---------|---------|
|
|
104
|
+
| Email | SHA-256 | `.toLowerCase().trim()` antes do hash |
|
|
105
|
+
| Phone | SHA-256 | Apenas números (formato internacional) |
|
|
106
|
+
| External ID | Texto plano | `fbclid`, `gclid` mapeado para equivalente Spotify |
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## 💻 O QUE VOCÊ GERA (BROWSER)
|
|
111
|
+
|
|
112
|
+
### `spotify-pixel.js`
|
|
113
|
+
|
|
114
|
+
```javascript
|
|
115
|
+
/**
|
|
116
|
+
* Spotify Pixel SDK - Browser Tracking
|
|
117
|
+
* CDP Edge Quantum Tier
|
|
118
|
+
*/
|
|
119
|
+
|
|
120
|
+
// Inicialização do Spotify Pixel
|
|
121
|
+
(function(w, d, s, l) {
|
|
122
|
+
w._spq = w._spq || [];
|
|
123
|
+
w._spq.push = w._spq.push || [];
|
|
124
|
+
w._spotify = w._spotify || {};
|
|
125
|
+
|
|
126
|
+
// Carregar configuração
|
|
127
|
+
const config = window.cdpTrack?.config || {};
|
|
128
|
+
|
|
129
|
+
// Inicializar Spotify Pixel
|
|
130
|
+
if (config.spotifyPixelId) {
|
|
131
|
+
w._spotify.pixelId = config.spotifyPixelId;
|
|
132
|
+
w._spotify.currency = config.currency || 'USD';
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Spotify Conversions API Wrapper
|
|
136
|
+
w._spotify.trackEvent = function(eventName, params) {
|
|
137
|
+
const eventId = generateEventId();
|
|
138
|
+
|
|
139
|
+
// Track localmente
|
|
140
|
+
w._spq.push({
|
|
141
|
+
e: eventName,
|
|
142
|
+
params: params,
|
|
143
|
+
eventId: eventId
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
// Enviar para servidor (via cdpTrack)
|
|
147
|
+
if (window.cdpTrack && window.cdpTrack.submit) {
|
|
148
|
+
window.cdpTrack.submit('spotify', {
|
|
149
|
+
event: eventName,
|
|
150
|
+
event_id: eventId,
|
|
151
|
+
...params
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
// Funções auxiliares
|
|
157
|
+
function generateEventId() {
|
|
158
|
+
return 'evt_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// Eventos Padrão Spotify
|
|
162
|
+
w._spotify.Content = function(contentName, contentId, params) {
|
|
163
|
+
w._spotify.trackEvent('ViewContent', {
|
|
164
|
+
content_name: contentName,
|
|
165
|
+
content_id: contentId,
|
|
166
|
+
...params
|
|
167
|
+
});
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
w._spotify.AddToCart = function(contentName, contentId, cartId, params) {
|
|
171
|
+
w._spotify.trackEvent('AddToCart', {
|
|
172
|
+
content_name: contentName,
|
|
173
|
+
content_id: contentId,
|
|
174
|
+
cart_id: cartId,
|
|
175
|
+
...params
|
|
176
|
+
});
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
w._spotify.Purchase = function(contentName, contentId, value, currency, params) {
|
|
180
|
+
w._spotify.trackEvent('Purchase', {
|
|
181
|
+
content_name: contentName,
|
|
182
|
+
content_id: contentId,
|
|
183
|
+
value: value,
|
|
184
|
+
currency: currency,
|
|
185
|
+
...params
|
|
186
|
+
});
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
w._spotify.Lead = function(contentName, contentId, leadType, params) {
|
|
190
|
+
w._spotify.trackEvent('Lead', {
|
|
191
|
+
content_name: contentName,
|
|
192
|
+
content_id: contentId,
|
|
193
|
+
lead_type: leadType,
|
|
194
|
+
...params
|
|
195
|
+
});
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
w._spotify.Signup = function(contentName, contentId, signupType, params) {
|
|
199
|
+
w._spotify.trackEvent('Signup', {
|
|
200
|
+
content_name: contentName,
|
|
201
|
+
content_id: contentId,
|
|
202
|
+
signup_type: signupType,
|
|
203
|
+
...params
|
|
204
|
+
});
|
|
205
|
+
};
|
|
206
|
+
|
|
207
|
+
})(window, document, 'script', 'location');
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
## 💻 O QUE VOCÊ GERA (SERVER)
|
|
213
|
+
|
|
214
|
+
### `spotify-conversions.js`
|
|
215
|
+
|
|
216
|
+
```javascript
|
|
217
|
+
/**
|
|
218
|
+
* Spotify Conversions API - Server-Side Tracking
|
|
219
|
+
* CDP Edge Quantum Tier - Cloudflare Worker
|
|
220
|
+
*/
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Envia evento para Spotify Conversions API
|
|
224
|
+
* @param {Object} eventData - Dados do evento
|
|
225
|
+
* @param {string} accessToken - Token de acesso Spotify Ads
|
|
226
|
+
* @param {string} accountId - ID da conta Spotify Ads
|
|
227
|
+
*/
|
|
228
|
+
export async function sendToSpotify(eventData, accessToken, accountId) {
|
|
229
|
+
const API_ENDPOINT = `https://advertising-api.spotify.com/conversion/v1/accounts/${accountId}/events`;
|
|
230
|
+
|
|
231
|
+
// Headers
|
|
232
|
+
const headers = {
|
|
233
|
+
'Content-Type': 'application/json',
|
|
234
|
+
'Authorization': `Bearer ${accessToken}`
|
|
235
|
+
};
|
|
236
|
+
|
|
237
|
+
// Payload Spotify Conversions API
|
|
238
|
+
const payload = {
|
|
239
|
+
event_name: eventData.event_name,
|
|
240
|
+
event_time: eventData.event_time || new Date().toISOString(),
|
|
241
|
+
event_timestamp_ms: eventData.event_timestamp_ms || Date.now(),
|
|
242
|
+
value: eventData.value || 0,
|
|
243
|
+
currency: eventData.currency || 'USD',
|
|
244
|
+
contents: [{
|
|
245
|
+
content_name: eventData.content_name,
|
|
246
|
+
content_id: eventData.content_id || ''
|
|
247
|
+
}]
|
|
248
|
+
};
|
|
249
|
+
|
|
250
|
+
// Adicionar parâmetros opcionais se existirem
|
|
251
|
+
if (eventData.custom_params) {
|
|
252
|
+
Object.assign(payload, eventData.custom_params);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
try {
|
|
256
|
+
const response = await fetch(API_ENDPOINT, {
|
|
257
|
+
method: 'POST',
|
|
258
|
+
headers: headers,
|
|
259
|
+
body: JSON.stringify(payload)
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
if (!response.ok) {
|
|
263
|
+
const errorText = await response.text();
|
|
264
|
+
console.error('[Spotify Agent] Erro ao enviar:', errorText);
|
|
265
|
+
throw new Error(`Spotify API Error: ${response.status}`);
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
const result = await response.json();
|
|
269
|
+
console.log('[Spotify Agent] Evento enviado:', result);
|
|
270
|
+
return result;
|
|
271
|
+
|
|
272
|
+
} catch (error) {
|
|
273
|
+
console.error('[Spotify Agent] Exception:', error);
|
|
274
|
+
throw error;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* Hash SHA-256 para PII (Advanced Matching)
|
|
280
|
+
* @param {string} data - Dados para hash
|
|
281
|
+
* @returns {Promise<string>} Hash em formato hexadecimal
|
|
282
|
+
*/
|
|
283
|
+
export async function hashPII(data) {
|
|
284
|
+
if (!data) return null;
|
|
285
|
+
|
|
286
|
+
const encoder = new TextEncoder();
|
|
287
|
+
const dataBuffer = encoder.encode(data.toLowerCase().trim());
|
|
288
|
+
const hashBuffer = await crypto.subtle.digest('SHA-256', dataBuffer);
|
|
289
|
+
const hashArray = Array.from(new Uint8Array(hashBuffer));
|
|
290
|
+
const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
|
|
291
|
+
|
|
292
|
+
return hashHex;
|
|
293
|
+
}
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
---
|
|
297
|
+
|
|
298
|
+
## 🔧 INTEGRAÇÃO COM OUTROS AGENTES
|
|
299
|
+
|
|
300
|
+
### Dependências
|
|
301
|
+
|
|
302
|
+
| Depende de | Input Esperado | O que faz com isso |
|
|
303
|
+
|-------------|----------------|------------------|
|
|
304
|
+
| **Page Analyzer** | Lista de elementos HTML | Mapeia `content_name` e `content_id` |
|
|
305
|
+
| **Server Tracking Agent** | Lista de plataformas | Adiciona endpoint Spotify `/api/wh/spotify` |
|
|
306
|
+
| **Premium Tracking Intelligence** | Estratégia de tracking | Define eventos prioritários para Spotify |
|
|
307
|
+
| **Validator Agent** | Código gerado | Valida conformidade com Spotify API v1 |
|
|
308
|
+
|
|
309
|
+
---
|
|
310
|
+
|
|
311
|
+
## 📋 RELATÓRIO DE VALIDAÇÃO
|
|
312
|
+
|
|
313
|
+
Ao final, gere um relatório JSON:
|
|
314
|
+
|
|
315
|
+
```json
|
|
316
|
+
{
|
|
317
|
+
"agent": "spotify-agent",
|
|
318
|
+
"status": "APPROVED" | "NEEDS_REVISION" | "FAIL",
|
|
319
|
+
"score": 0-100,
|
|
320
|
+
"approvals": [
|
|
321
|
+
{
|
|
322
|
+
"section": "API Endpoints",
|
|
323
|
+
"items": [
|
|
324
|
+
"Endpoint correto para Spotify Conversions API v1",
|
|
325
|
+
"Authorization Bearer implementado"
|
|
326
|
+
]
|
|
327
|
+
},
|
|
328
|
+
{
|
|
329
|
+
"section": "Event Mapping",
|
|
330
|
+
"items": [
|
|
331
|
+
"ViewContent mapeado corretamente",
|
|
332
|
+
"Purchase com value e currency",
|
|
333
|
+
"Lead com lead_type"
|
|
334
|
+
]
|
|
335
|
+
}
|
|
336
|
+
],
|
|
337
|
+
"corrections": [
|
|
338
|
+
{
|
|
339
|
+
"file": "spotify-pixel.js",
|
|
340
|
+
"issue": "Descrição",
|
|
341
|
+
"fix": "Adicionar comentário explicando integração"
|
|
342
|
+
},
|
|
343
|
+
{
|
|
344
|
+
"file": "spotify-conversions.js",
|
|
345
|
+
"issue": "Descrição",
|
|
346
|
+
"fix": "Adicionar retry logic com Promise.allSettled"
|
|
347
|
+
}
|
|
348
|
+
],
|
|
349
|
+
"alerts": [
|
|
350
|
+
{
|
|
351
|
+
"severity": "INFO",
|
|
352
|
+
"message": "Spotify Ads tem menos recursos documentados que Meta/Google",
|
|
353
|
+
"recommendation": "Consultar documentação oficial regularmente"
|
|
354
|
+
}
|
|
355
|
+
]
|
|
356
|
+
}
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
---
|
|
360
|
+
|
|
361
|
+
## ⚠️ LIMITAÇÕES CONHECIDAS DO SPOTIFY ADS
|
|
362
|
+
|
|
363
|
+
### Comparativo com Outras Plataformas
|
|
364
|
+
|
|
365
|
+
| Plataforma | Documentação | API v1 | Recursos |
|
|
366
|
+
|-----------|---------------|--------|----------|
|
|
367
|
+
| Meta | Excelente | v22.0+ | Muito completo |
|
|
368
|
+
| Google | Excelente | MP | Muito completo |
|
|
369
|
+
| TikTok | Boa | v1.3+ | Completo |
|
|
370
|
+
| **Spotify** | Limitada | v1 | Básico |
|
|
371
|
+
|
|
372
|
+
### Diferenças Principais
|
|
373
|
+
1. **Menos eventos customizados** - Spotify tem menos flexibilidade
|
|
374
|
+
2. **Menos recursos de deduplication** - Atribuição mais básica
|
|
375
|
+
3. **Documentação menos detalhada** - Menos exemplos práticos
|
|
376
|
+
|
|
377
|
+
---
|
|
378
|
+
|
|
379
|
+
## 🔄 NOTAS PARA FUTURO
|
|
380
|
+
|
|
381
|
+
- Spotify Ads está em evolução constante. Revisar documentação periodicamente.
|
|
382
|
+
- Eventos customizados podem ser adicionados futuramente.
|
|
383
|
+
- Considerar implementar Spotify Pixel SDK via CDN para melhor performance.
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# Agente: TikTok — CDP Edge (Quantum Tier)
|
|
2
|
+
|
|
3
|
+
Especialista exclusivo em TikTok Pixel (browser via cdpTrack) + TikTok Events API (server via Cloudflare Workers).
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 🏗️ ARQUITETURA Quantum Tier
|
|
8
|
+
- **Browser**: Use `cdpTrack.js` para captura direta.
|
|
9
|
+
- **Server**: Cloudflare Worker enviando para `/open_api/v1.3/event/track/`.
|
|
10
|
+
- **Database**: D1 para persistência de `ttp` e `ttclid`.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## ACESSO À VERSÕES DE API (OBRIGATÓRIO)
|
|
15
|
+
|
|
16
|
+
### PASSO 0 — Ler Versões Atuais
|
|
17
|
+
|
|
18
|
+
```javascript
|
|
19
|
+
// Ler versões do arquivo centralizado
|
|
20
|
+
const apiVersions = await readJSON('contracts/api-versions.json');
|
|
21
|
+
const tiktokVersion = apiVersions.tiktok;
|
|
22
|
+
|
|
23
|
+
// Extrair versões necessárias
|
|
24
|
+
const currentPixelVersion = tiktokVersion.versions.pixel.current; // "v1.3"
|
|
25
|
+
const currentEventsApiVersion = tiktokVersion.versions.events_api.current; // "v1.3"
|
|
26
|
+
const recommendedVersion = tiktokVersion.versions.pixel.recommended; // "v1.3"
|
|
27
|
+
const minimumSupported = tiktokVersion.versions.pixel.minimum_supported; // "v1.2"
|
|
28
|
+
|
|
29
|
+
// Verificar depreciação
|
|
30
|
+
const isDeprecated = tiktokVersion.versions.pixel.deprecated.includes(currentPixelVersion);
|
|
31
|
+
|
|
32
|
+
if (isDeprecated) {
|
|
33
|
+
throw new Error(`TikTok API v${currentPixelVersion} está descontinuada desde ${tiktokVersion.versions.pixel.deprecated_cutoff[currentPixelVersion]}. Atualizar para v${recommendedVersion} IMEDIATAMENTE.`);
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## 🛠️ O QUE VOCÊ GERA
|
|
40
|
+
|
|
41
|
+
### 1. Browser (Direct SDK)
|
|
42
|
+
Sempre utilize o padrão `cdpTrack.track()` para TikTok.
|
|
43
|
+
|
|
44
|
+
```javascript
|
|
45
|
+
// Exemplo de Form Submit
|
|
46
|
+
cdpTrack.track('SubmitForm', {
|
|
47
|
+
content_name: 'Lead_Captura',
|
|
48
|
+
value: 0
|
|
49
|
+
});
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### 2. Server (Events API v1.3)
|
|
53
|
+
Gere payloads para o Worker seguir a API oficial:
|
|
54
|
+
- `event_id`: Identidade única compartilhada (deduplicação).
|
|
55
|
+
- `context.user`: `email`, `phone_number` (Hashed), `ttp`, `ttclid`.
|
|
56
|
+
- `event_source`: 'web'.
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## 🛠️ REQUISITOS TÉCNICOS
|
|
61
|
+
- **Hashing**: Use `WebCrypto API` (SHA-256) para PII no Worker.
|
|
62
|
+
- **Deduplicação**: Sempre gere um `event_id` único no browser e envie para o Worker.
|
|
63
|
+
- **Cookies**: Capture `ttclid` da URL e `_ttp` da página para persistência no D1.
|
|
64
|
+
- **Endpoint**: Use `/open_api/v1.3/event/track/`.
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## INPUTS RECEBIDOS
|
|
69
|
+
|
|
70
|
+
- JSON do Page Analyzer Agent (eventos mapeados, seletores, tipo de página)
|
|
71
|
+
- JSON do Premium Tracking Intelligence Agent (eventos prioritários, micro-events)
|
|
72
|
+
- `contracts/api-versions.json` → `tiktok.versions.events_api.current`
|
|
73
|
+
- `TIKTOK_PIXEL_ID` (ex: `CXXXXXXXXXXXXXXX`) — coletado via pergunta na FASE 0-B
|
|
74
|
+
- Secret `TIKTOK_ACCESS_TOKEN` (configurado via `wrangler secret put`)
|
|
75
|
+
- Perfil D1: `ttp` (cookie `_ttp`), `ttclid` (URL param), `user_id`, `email`, `phone`
|
|
76
|
+
|
|
77
|
+
## RESPONSABILIDADE
|
|
78
|
+
|
|
79
|
+
- Gerar eventos TikTok Pixel browser via `cdpTrack.track()` com nomes no padrão TikTok (PascalCase)
|
|
80
|
+
- Gerar função `dispatchTikTok()` no Worker usando Events API v1.3
|
|
81
|
+
- Implementar `context.user` com Advanced Matching: `email`, `phone_number`, `external_id` (SHA-256)
|
|
82
|
+
- Capturar `ttclid` da URL e `_ttp` do cookie — nunca hashear estes campos
|
|
83
|
+
- Persistir `ttp` e `ttclid` no D1 para cruzamento com webhooks de compra
|
|
84
|
+
- Garantir deduplicação browser↔server via `event_id` idêntico
|
|
85
|
+
- Incluir `event_source: 'web'` e `page.url` obrigatoriamente em todo payload
|
|
86
|
+
|
|
87
|
+
## SAÍDA
|
|
88
|
+
|
|
89
|
+
```json
|
|
90
|
+
{
|
|
91
|
+
"arquivos_gerados": {
|
|
92
|
+
"browser": "cdpTrack.js (eventos TikTok injetados)",
|
|
93
|
+
"server": "cloudflare/tiktok-events.js"
|
|
94
|
+
},
|
|
95
|
+
"versao_api": "v1.3",
|
|
96
|
+
"endpoint": "/open_api/v1.3/event/track/",
|
|
97
|
+
"eventos_implementados": ["PageView", "ViewContent", "SubmitForm", "InitiateCheckout", "CompletePayment"],
|
|
98
|
+
"advanced_matching": {
|
|
99
|
+
"campos_hashed": ["email", "phone_number", "external_id"],
|
|
100
|
+
"campos_raw": ["ttp", "ttclid"]
|
|
101
|
+
},
|
|
102
|
+
"deduplicacao": {
|
|
103
|
+
"event_id_browser": true,
|
|
104
|
+
"event_id_server": true,
|
|
105
|
+
"identicos": true
|
|
106
|
+
},
|
|
107
|
+
"d1_persiste": ["ttp", "ttclid"],
|
|
108
|
+
"secrets_necessarios": ["TIKTOK_ACCESS_TOKEN"],
|
|
109
|
+
"variaveis_necessarias": ["TIKTOK_PIXEL_ID"]
|
|
110
|
+
}
|
|
111
|
+
```
|