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,402 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CDP Edge Human-Behavior Engine (Quantum Tier)
|
|
3
|
+
* Responsável por capturar micro-interações e intenção real.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const BehaviorEngine = {
|
|
7
|
+
config: {
|
|
8
|
+
rageClickThreshold: 3,
|
|
9
|
+
rageClickTime: 700, // ms
|
|
10
|
+
idleThreshold: 60000, // 60s
|
|
11
|
+
scoreThresholds: {
|
|
12
|
+
engaged: 40,
|
|
13
|
+
highIntent: 80
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
|
|
17
|
+
state: {
|
|
18
|
+
clickHistory: [],
|
|
19
|
+
startTime: Date.now(),
|
|
20
|
+
lastActivity: Date.now(),
|
|
21
|
+
lastPulse: Date.now(),
|
|
22
|
+
isIdle: false,
|
|
23
|
+
formStartTime: {},
|
|
24
|
+
userScore: 0,
|
|
25
|
+
firedScoreEvents: new Set(),
|
|
26
|
+
abVariant: null,
|
|
27
|
+
},
|
|
28
|
+
|
|
29
|
+
init() {
|
|
30
|
+
this.setupRageClicks();
|
|
31
|
+
this.setupVisibility();
|
|
32
|
+
this.setupHeartbeat();
|
|
33
|
+
this.setupScroll();
|
|
34
|
+
this.setupVideoTracking();
|
|
35
|
+
this.setupFormAnalytics();
|
|
36
|
+
this.setupFormAbandonment();
|
|
37
|
+
this.setupCopyPaste();
|
|
38
|
+
this.setupExitIntent();
|
|
39
|
+
this.setupOutboundLinks();
|
|
40
|
+
this.setupErrorTracking();
|
|
41
|
+
this.setupIdleDetection();
|
|
42
|
+
this.setupScoring();
|
|
43
|
+
this.setupABTesting();
|
|
44
|
+
console.log('[CDP Edge] Enterprise Behavior Engine Initialized');
|
|
45
|
+
},
|
|
46
|
+
|
|
47
|
+
// 0.1 A/B Testing (Mode 1 - Edge Sync)
|
|
48
|
+
setupABTesting() {
|
|
49
|
+
const getCookie = (name) => {
|
|
50
|
+
const value = `; ${document.cookie}`;
|
|
51
|
+
const parts = value.split(`; ${name}=`);
|
|
52
|
+
if (parts.length === 2) return parts.pop().split(';').shift();
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
const urlParams = new URLSearchParams(window.location.search);
|
|
56
|
+
this.state.abVariant = urlParams.get('cdp_variant') || getCookie('cdp_ab_variant') || 'original';
|
|
57
|
+
|
|
58
|
+
console.log(`[CDP Edge] A/B Variant Detected: ${this.state.abVariant}`);
|
|
59
|
+
|
|
60
|
+
const originalTrack = cdpTrack.track;
|
|
61
|
+
cdpTrack.track = (eventName, eventParams = {}) => {
|
|
62
|
+
const enrichedParams = {
|
|
63
|
+
...eventParams,
|
|
64
|
+
ab_test_variant: this.state.abVariant,
|
|
65
|
+
user_score: this.state.userScore
|
|
66
|
+
};
|
|
67
|
+
return originalTrack.apply(cdpTrack, [eventName, enrichedParams]);
|
|
68
|
+
};
|
|
69
|
+
},
|
|
70
|
+
|
|
71
|
+
// 0. Scoring Engine (Internal)
|
|
72
|
+
setupScoring() {
|
|
73
|
+
console.log('[CDP Edge] Scoring Engine Online');
|
|
74
|
+
},
|
|
75
|
+
|
|
76
|
+
addScore(points, reason) {
|
|
77
|
+
this.state.userScore = Math.min(100, Math.max(0, this.state.userScore + points));
|
|
78
|
+
console.log(`[CDP Edge] Score Update: +${points} (${reason}) | Total: ${this.state.userScore}`);
|
|
79
|
+
|
|
80
|
+
if (this.state.userScore >= this.config.scoreThresholds.highIntent && !this.state.firedScoreEvents.has('highIntent')) {
|
|
81
|
+
this.state.firedScoreEvents.add('highIntent');
|
|
82
|
+
cdpTrack.track('High_Intent_Lead', { score: this.state.userScore, meta_intensity: 'high' });
|
|
83
|
+
} else if (this.state.userScore >= this.config.scoreThresholds.engaged && !this.state.firedScoreEvents.has('engaged')) {
|
|
84
|
+
this.state.firedScoreEvents.add('engaged');
|
|
85
|
+
cdpTrack.track('Engaged_User', { score: this.state.userScore, meta_intensity: 'medium' });
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
|
|
89
|
+
// 1. Rage Click Detector
|
|
90
|
+
setupRageClicks() {
|
|
91
|
+
document.addEventListener('click', (e) => {
|
|
92
|
+
const now = Date.now();
|
|
93
|
+
this.state.clickHistory.push(now);
|
|
94
|
+
this.state.clickHistory = this.state.clickHistory.filter(t => now - t < this.config.rageClickTime);
|
|
95
|
+
|
|
96
|
+
if (this.state.clickHistory.length >= this.config.rageClickThreshold) {
|
|
97
|
+
cdpTrack.track('rage_click', {
|
|
98
|
+
element_id: e.target.id || '',
|
|
99
|
+
element_class: e.target.className || '',
|
|
100
|
+
x: e.pageX,
|
|
101
|
+
y: e.pageY,
|
|
102
|
+
meta_intensity: 'low'
|
|
103
|
+
});
|
|
104
|
+
this.addScore(-10, 'rage_click');
|
|
105
|
+
this.state.clickHistory = [];
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
},
|
|
109
|
+
|
|
110
|
+
// 1.2 Scroll Depth (Quantum Tier)
|
|
111
|
+
setupScroll() {
|
|
112
|
+
const markers = [25, 50, 75, 90];
|
|
113
|
+
const fired = new Set();
|
|
114
|
+
|
|
115
|
+
window.addEventListener('scroll', () => {
|
|
116
|
+
const scrollPct = Math.round((window.scrollY / (document.documentElement.scrollHeight - window.innerHeight)) * 100);
|
|
117
|
+
|
|
118
|
+
markers.forEach(m => {
|
|
119
|
+
if (scrollPct >= m && !fired.has(m)) {
|
|
120
|
+
fired.add(m);
|
|
121
|
+
this.addScore(m === 25 ? 5 : (m === 50 ? 5 : 10), `scroll_${m}%`);
|
|
122
|
+
cdpTrack.track('scroll_depth', {
|
|
123
|
+
percent: m,
|
|
124
|
+
meta_intensity: m >= 50 ? 'medium' : 'low'
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
}, { passive: true });
|
|
129
|
+
},
|
|
130
|
+
|
|
131
|
+
// 2. Tab Visibility (VSL Focus)
|
|
132
|
+
setupVisibility() {
|
|
133
|
+
document.addEventListener('visibilitychange', () => {
|
|
134
|
+
const status = document.visibilityState;
|
|
135
|
+
cdpTrack.track('tab_visibility_change', {
|
|
136
|
+
status: status,
|
|
137
|
+
time_since_start: Math.floor((Date.now() - this.state.startTime) / 1000),
|
|
138
|
+
meta_intensity: status === 'visible' ? 'high' : 'low'
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
},
|
|
142
|
+
|
|
143
|
+
// 3. Click Heatmap (D1 Only)
|
|
144
|
+
setupHeatmap() {
|
|
145
|
+
document.addEventListener('click', (e) => {
|
|
146
|
+
if (typeof cdpTrack.sendServerEvent === 'function') {
|
|
147
|
+
cdpTrack.sendServerEvent('click_heatmap', null, {
|
|
148
|
+
x: e.pageX,
|
|
149
|
+
y: e.pageY,
|
|
150
|
+
element: e.target.tagName.toLowerCase(),
|
|
151
|
+
id: e.target.id || '',
|
|
152
|
+
classes: e.target.className || ''
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
},
|
|
157
|
+
|
|
158
|
+
// 4. Retention Pulse (Heartbeat)
|
|
159
|
+
setupHeartbeat() {
|
|
160
|
+
setInterval(() => {
|
|
161
|
+
const activeTime = Math.floor((Date.now() - this.state.startTime) / 1000);
|
|
162
|
+
cdpTrack.track('pulse_heartbeat', {
|
|
163
|
+
duration_seconds: activeTime,
|
|
164
|
+
is_visible: document.visibilityState === 'visible'
|
|
165
|
+
});
|
|
166
|
+
}, this.config.heartbeatInterval);
|
|
167
|
+
},
|
|
168
|
+
|
|
169
|
+
// 5. VSL / Video Tracking (YouTube & Vimeo)
|
|
170
|
+
setupVideoTracking() {
|
|
171
|
+
const iframes = document.querySelectorAll('iframe');
|
|
172
|
+
const fired = new Set();
|
|
173
|
+
|
|
174
|
+
iframes.forEach(iframe => {
|
|
175
|
+
const src = iframe.src || '';
|
|
176
|
+
const isYT = src.includes('youtube.com/embed');
|
|
177
|
+
const isVimeo = src.includes('vimeo.com/video');
|
|
178
|
+
|
|
179
|
+
if (isYT || isVimeo) {
|
|
180
|
+
window.addEventListener('message', (event) => {
|
|
181
|
+
try {
|
|
182
|
+
const data = typeof event.data === 'string' ? JSON.parse(event.data) : event.data;
|
|
183
|
+
if (isYT && data.event === 'infoDelivery' && data.info && data.info.currentTime) {
|
|
184
|
+
this.handleVideoProgress(iframe, data.info.currentTime, data.info.duration, fired, 'YouTube');
|
|
185
|
+
}
|
|
186
|
+
if (isVimeo && data.event === 'timeupdate') {
|
|
187
|
+
this.handleVideoProgress(iframe, data.data.seconds, data.data.duration, fired, 'Vimeo');
|
|
188
|
+
}
|
|
189
|
+
} catch (e) { /* ignore non-json messages */ }
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
if (isYT && !src.includes('enablejsapi=1')) {
|
|
193
|
+
const url = new URL(src);
|
|
194
|
+
url.searchParams.set('enablejsapi', '1');
|
|
195
|
+
iframe.src = url.toString();
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
},
|
|
200
|
+
|
|
201
|
+
handleVideoProgress(iframe, current, total, firedSet, platform) {
|
|
202
|
+
if (!total) return;
|
|
203
|
+
const pct = Math.floor((current / total) * 100);
|
|
204
|
+
const milestones = [25, 50, 75, 100];
|
|
205
|
+
const videoId = iframe.id || iframe.src.split('/').pop().split('?')[0];
|
|
206
|
+
|
|
207
|
+
milestones.forEach(m => {
|
|
208
|
+
const key = `${videoId}_${m}`;
|
|
209
|
+
if (pct >= m && !firedSet.has(key)) {
|
|
210
|
+
firedSet.add(key);
|
|
211
|
+
this.addScore(m === 25 ? 10 : (m === 50 ? 15 : 25), `vsl_${m}%`);
|
|
212
|
+
cdpTrack.track('video_milestone', {
|
|
213
|
+
video_id: videoId,
|
|
214
|
+
platform: platform,
|
|
215
|
+
percent: m,
|
|
216
|
+
meta_intensity: m >= 50 ? 'high' : 'medium'
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
},
|
|
221
|
+
|
|
222
|
+
// 6. Form Analytics (Friction & Abandonment)
|
|
223
|
+
setupFormAnalytics() {
|
|
224
|
+
const inputs = document.querySelectorAll('input, select, textarea');
|
|
225
|
+
inputs.forEach(input => {
|
|
226
|
+
input.addEventListener('focus', () => {
|
|
227
|
+
const name = input.name || input.id;
|
|
228
|
+
if (!this.state.formStartTime[name]) {
|
|
229
|
+
this.state.formStartTime[name] = Date.now();
|
|
230
|
+
this.addScore(10, `form_interaction_${name}`);
|
|
231
|
+
cdpTrack.track('form_field_focus', { field: name });
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
input.addEventListener('blur', () => {
|
|
236
|
+
const name = input.name || input.id;
|
|
237
|
+
const duration = Math.round((Date.now() - this.state.formStartTime[name]) / 1000);
|
|
238
|
+
if (duration > 0) {
|
|
239
|
+
cdpTrack.track('form_field_blur', { field: name, duration_sec: duration });
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
});
|
|
243
|
+
},
|
|
244
|
+
|
|
245
|
+
// 6.1 Form Abandonment — saiu da página após interagir com formulário sem submeter
|
|
246
|
+
setupFormAbandonment() {
|
|
247
|
+
const formInteracted = new Set();
|
|
248
|
+
let formSubmitted = false;
|
|
249
|
+
|
|
250
|
+
document.addEventListener('focusin', (e) => {
|
|
251
|
+
const el = e.target;
|
|
252
|
+
if (el.tagName === 'INPUT' || el.tagName === 'TEXTAREA' || el.tagName === 'SELECT') {
|
|
253
|
+
const name = el.name || el.id || el.type;
|
|
254
|
+
if (name) formInteracted.add(name);
|
|
255
|
+
}
|
|
256
|
+
}, true);
|
|
257
|
+
|
|
258
|
+
document.addEventListener('submit', () => {
|
|
259
|
+
formSubmitted = true;
|
|
260
|
+
}, true);
|
|
261
|
+
|
|
262
|
+
document.addEventListener('visibilitychange', () => {
|
|
263
|
+
if (document.visibilityState === 'hidden' && formInteracted.size > 0 && !formSubmitted) {
|
|
264
|
+
this.addScore(-5, 'form_abandonment');
|
|
265
|
+
cdpTrack.track('form_abandonment', {
|
|
266
|
+
fields_interacted: Array.from(formInteracted),
|
|
267
|
+
fields_count: formInteracted.size,
|
|
268
|
+
meta_intensity: 'medium',
|
|
269
|
+
time_on_page: Math.floor((Date.now() - this.state.startTime) / 1000),
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
|
|
274
|
+
window.addEventListener('beforeunload', () => {
|
|
275
|
+
if (formInteracted.size > 0 && !formSubmitted) {
|
|
276
|
+
if (navigator.sendBeacon && typeof cdpTrack !== 'undefined') {
|
|
277
|
+
const data = JSON.stringify({
|
|
278
|
+
eventName: 'form_abandonment',
|
|
279
|
+
behavioral_data: { user_score: this.state.userScore },
|
|
280
|
+
fields_interacted: Array.from(formInteracted),
|
|
281
|
+
fields_count: formInteracted.size,
|
|
282
|
+
meta_intensity: 'medium',
|
|
283
|
+
});
|
|
284
|
+
navigator.sendBeacon('/api/tracking', new Blob([data], { type: 'application/json' }));
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
},
|
|
289
|
+
|
|
290
|
+
// 6.2 Exit Intent — mouse saindo pelo topo da viewport
|
|
291
|
+
setupExitIntent() {
|
|
292
|
+
let exitFired = false;
|
|
293
|
+
|
|
294
|
+
document.addEventListener('mousemove', (e) => {
|
|
295
|
+
if (e.clientY < 20 && !exitFired) {
|
|
296
|
+
exitFired = true;
|
|
297
|
+
this.addScore(15, 'exit_intent');
|
|
298
|
+
cdpTrack.track('exit_intent', {
|
|
299
|
+
mouse_y: e.clientY,
|
|
300
|
+
time_on_page: Math.floor((Date.now() - this.state.startTime) / 1000),
|
|
301
|
+
user_score: this.state.userScore,
|
|
302
|
+
meta_intensity: 'high',
|
|
303
|
+
});
|
|
304
|
+
setTimeout(() => { exitFired = false; }, 30000);
|
|
305
|
+
}
|
|
306
|
+
}, { passive: true });
|
|
307
|
+
|
|
308
|
+
let mobileExitFired = false;
|
|
309
|
+
document.addEventListener('visibilitychange', () => {
|
|
310
|
+
if (document.visibilityState === 'hidden' && !mobileExitFired) {
|
|
311
|
+
const timeOnPage = Math.floor((Date.now() - this.state.startTime) / 1000);
|
|
312
|
+
if (timeOnPage > 5) {
|
|
313
|
+
mobileExitFired = true;
|
|
314
|
+
cdpTrack.track('exit_intent_mobile', {
|
|
315
|
+
time_on_page: timeOnPage,
|
|
316
|
+
user_score: this.state.userScore,
|
|
317
|
+
meta_intensity: 'medium',
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
});
|
|
322
|
+
},
|
|
323
|
+
|
|
324
|
+
// 7. Copy-Paste Intent (High Conv.)
|
|
325
|
+
setupCopyPaste() {
|
|
326
|
+
document.addEventListener('copy', () => {
|
|
327
|
+
const selectedText = window.getSelection().toString();
|
|
328
|
+
if (selectedText.length > 0) {
|
|
329
|
+
this.addScore(20, 'text_copy');
|
|
330
|
+
cdpTrack.track('content_copy', {
|
|
331
|
+
text_length: selectedText.length,
|
|
332
|
+
meta_intensity: 'medium'
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
});
|
|
336
|
+
},
|
|
337
|
+
|
|
338
|
+
// 8. Outbound Link Tracking (Whitelist: WhatsApp/Checkouts)
|
|
339
|
+
setupOutboundLinks() {
|
|
340
|
+
document.addEventListener('click', (e) => {
|
|
341
|
+
const link = e.target.closest('a');
|
|
342
|
+
if (link && link.href) {
|
|
343
|
+
const url = link.href;
|
|
344
|
+
const isExternal = !url.includes(window.location.hostname);
|
|
345
|
+
const isWhitelisted = url.includes('wa.me') ||
|
|
346
|
+
url.includes('hotmart.com') ||
|
|
347
|
+
url.includes('kiwify.com') ||
|
|
348
|
+
url.includes('checkout');
|
|
349
|
+
|
|
350
|
+
if (isExternal && isWhitelisted) {
|
|
351
|
+
this.addScore(100, 'outbound_conversion_intent');
|
|
352
|
+
cdpTrack.track('outbound_click', {
|
|
353
|
+
destination: url,
|
|
354
|
+
meta_intensity: 'high'
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
});
|
|
359
|
+
},
|
|
360
|
+
|
|
361
|
+
// 9. JS Error Tracking (D1 Only)
|
|
362
|
+
setupErrorTracking() {
|
|
363
|
+
window.addEventListener('error', (event) => {
|
|
364
|
+
if (typeof cdpTrack.sendServerEvent === 'function') {
|
|
365
|
+
cdpTrack.sendServerEvent('js_error', null, {
|
|
366
|
+
message: event.message,
|
|
367
|
+
source: event.filename,
|
|
368
|
+
lineno: event.lineno,
|
|
369
|
+
colno: event.colno
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
});
|
|
373
|
+
},
|
|
374
|
+
|
|
375
|
+
// 10. Idle Detection (Active Time)
|
|
376
|
+
setupIdleDetection() {
|
|
377
|
+
const activityEvents = ['mousedown', 'mousemove', 'keydown', 'scroll', 'touchstart'];
|
|
378
|
+
activityEvents.forEach(evt => {
|
|
379
|
+
document.addEventListener(evt, () => {
|
|
380
|
+
this.state.lastActivity = Date.now();
|
|
381
|
+
if (this.state.isIdle) {
|
|
382
|
+
this.state.isIdle = false;
|
|
383
|
+
cdpTrack.track('user_active', { status: 'back_online' });
|
|
384
|
+
}
|
|
385
|
+
}, { passive: true });
|
|
386
|
+
});
|
|
387
|
+
|
|
388
|
+
setInterval(() => {
|
|
389
|
+
if (Date.now() - this.state.lastActivity > this.config.idleThreshold && !this.state.isIdle) {
|
|
390
|
+
this.state.isIdle = true;
|
|
391
|
+
cdpTrack.track('user_idle', { idle_duration: this.config.idleThreshold / 1000 });
|
|
392
|
+
}
|
|
393
|
+
}, 10000);
|
|
394
|
+
}
|
|
395
|
+
};
|
|
396
|
+
|
|
397
|
+
// Auto-inicialização se o cdpTrack estiver presente
|
|
398
|
+
if (typeof cdpTrack !== 'undefined') {
|
|
399
|
+
BehaviorEngine.init();
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
export default BehaviorEngine;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Blueprint: Real Estate (Lançamento Imobiliário) - Quantum Tier
|
|
2
|
+
|
|
3
|
+
Este blueprint define a inteligência técnica para capturar e atribuir leads do mercado imobiliário com alta fidelidade.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 🏗️ ARQUITETURA TÉCNICA
|
|
8
|
+
|
|
9
|
+
### 1. Geolocalização Nativa (Edge Sync)
|
|
10
|
+
Para negócios locais, a geolocalização é o sinal mais rico para a Meta encontrar compradores próximos ao empreendimento.
|
|
11
|
+
* **Captura**: Ativar via `getCidade()` no browser.
|
|
12
|
+
* **Envio**: Incluir campos `ct` (city) e `st` (state) no Advanced Matching da Meta (CAPI).
|
|
13
|
+
|
|
14
|
+
### 2. WhatsApp Lead Lock (D1 Persistence)
|
|
15
|
+
O maior vazamento de dados no mercado imobiliário é o clique no botão de WhatsApp sem que o lead seja salvo no CRM.
|
|
16
|
+
* **Ação**: No momento do clique (`Contact`), o CDP Edge salva o `fbclid`, `gclid` e `ttclid` no D1 vinculado ao contexto da página.
|
|
17
|
+
* **Offline Match**: Quando a venda ocorre (offline), os IDs de rastro são recuperados do D1 para disparo do evento `Purchase`.
|
|
18
|
+
|
|
19
|
+
### 3. CTWA Support (Click-to-WhatsApp)
|
|
20
|
+
Anúncios de mensagem são o padrão. O parâmetro `ctwa_clid` é monitorado e persistido para o Worker.
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 🛠️ MAPEAMENTO DO PAGE ANALYZER
|
|
25
|
+
|
|
26
|
+
O Page Analyzer deve buscar os seguintes sinais:
|
|
27
|
+
* **Seletores**: `a[href*='wa.me']`, `a[href*='api.whatsapp.com']`, `#form-visita`.
|
|
28
|
+
* **Sinais Gráficos**: Palavras-chave como "Plantão", "Decorado", "Financiamento", "Quartos", "Suítes".
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## 📜 EXEMPLO DE INJEÇÃO (cdpTrack)
|
|
33
|
+
|
|
34
|
+
```javascript
|
|
35
|
+
// Exemplo de captura de visita a imóvel com geolocalização ativa
|
|
36
|
+
cdpTrack.track('ViewContent', {
|
|
37
|
+
content_category: 'imovel',
|
|
38
|
+
content_name: 'Residencial Aurora', // Capturado do H1
|
|
39
|
+
city: await cdpTrack.getCidade(), // Capturado nativamente
|
|
40
|
+
meta_intensity: 'high'
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
// Lead Lock no clique do WhatsApp
|
|
44
|
+
document.querySelector('.btn-whatsapp').addEventListener('click', () => {
|
|
45
|
+
cdpTrack.track('Contact', {
|
|
46
|
+
method: 'whatsapp',
|
|
47
|
+
lead_lock: true // Sinaliza para o D1 persistir os IDs de clique e a geolocalização
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
```
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Blueprint: Sales Page & Checkout (Páginas de Vendas) - Quantum Tier
|
|
2
|
+
|
|
3
|
+
Este blueprint define a inteligência técnica para rastrear e atribuir vendas em infoprodutos com alta precisão e 100% de dedução de ROI.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 🏗️ ARQUITETURA TÉCNICA
|
|
8
|
+
|
|
9
|
+
### 1. Checkout Passthrough (UTM & UID Injection)
|
|
10
|
+
Indispensável para Hotmart, Kiwify, Eduzz, CartPanda.
|
|
11
|
+
* **Captura**: O CDP Edge captura as UTMs no carregamento da página.
|
|
12
|
+
* **Injeção**: Ao clicar no botão de compra, o CDP Edge injeta automaticamente os parâmetros `xcod`, `sck` (Hotmart), `src` (Kiwify) ou parâmetros customizados no URL do checkout.
|
|
13
|
+
* **D1 Lock**: Salva o `_cdp_uid` persistente para atribuição server-side posterior (no recebimento do Webhook de venda).
|
|
14
|
+
|
|
15
|
+
### 2. VSL Retention Engine (Video Milestone)
|
|
16
|
+
Mede a eficácia do vídeo de vendas antes do botão de compra aparecer.
|
|
17
|
+
* **Milestones**: 25%, 50%, 75%, 100%.
|
|
18
|
+
* **Visibility Sync**: Pausa a contagem de retenção se a aba for escondida, mas registra o status do áudio separadamente.
|
|
19
|
+
* **Ação**: Disparar `ViewContent` (25/50/75) e `AddToCart` (100% ou clique no botão).
|
|
20
|
+
|
|
21
|
+
### 3. Adblock Immunity (Stealth Tracking)
|
|
22
|
+
Utiliza rotas no mesmo domínio (ex: `/api/tracking`) para garantir que o script de rastreamento não seja bloqueado por uBlock ou Ghostery.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## 🛠️ MAPEAMENTO DO PAGE ANALYZER
|
|
27
|
+
|
|
28
|
+
O Page Analyzer deve buscar os seguintes sinais:
|
|
29
|
+
* **Checkouts**: Qualquer `<a>` com links contendo `pay.hotmart.com`, `kiwify.com.br`, `eduzz.com`, `monetizze.com.br`.
|
|
30
|
+
* **Vídeos**: Tags `<iframe>` de YouTube ou Vimeo, ou players customizados.
|
|
31
|
+
* **Sinais Gráficos**: Headlines de promessa, Garantia de X dias, Botão de "Quero Garantir Minha Vaga".
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## 📜 EXEMPLO DE INJEÇÃO (cdpTrack)
|
|
36
|
+
|
|
37
|
+
```javascript
|
|
38
|
+
// Exemplo de injeção automática de Checkout
|
|
39
|
+
cdpTrack.passCheckoutParams({
|
|
40
|
+
platforms: ['hotmart', 'kiwify'],
|
|
41
|
+
extra: { source: 'facebook_ads' }
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
// Exemplo de retenção de VSL
|
|
45
|
+
cdpTrack.track('ViewContent', {
|
|
46
|
+
vsl_name: 'VSL_Lote_1',
|
|
47
|
+
watch_time: 120, // segundos
|
|
48
|
+
meta_intensity: 'high'
|
|
49
|
+
});
|
|
50
|
+
```
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spotify Pixel — Browser Template — CDP Edge Quantum Tier
|
|
3
|
+
*
|
|
4
|
+
* Inclui no <head> do projeto. Inicializa o Spotify Pixel SDK
|
|
5
|
+
* e captura eventos de conversão browser-side.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
// ── Inicialização do Spotify Pixel ───────────────────────────────────────────
|
|
9
|
+
!function(e){
|
|
10
|
+
if (!window.SpotifyPixel) {
|
|
11
|
+
var n = window.SpotifyPixel = function() {
|
|
12
|
+
n.callMethod ? n.callMethod.apply(n, arguments) : n.queue.push(arguments)
|
|
13
|
+
};
|
|
14
|
+
n.push = n;
|
|
15
|
+
n.loaded = !0;
|
|
16
|
+
n.version = "1.0";
|
|
17
|
+
n.queue = [];
|
|
18
|
+
var t = document.createElement("script");
|
|
19
|
+
t.async = !0;
|
|
20
|
+
t.src = "https://pixel.byspotify.com/ping.min.js";
|
|
21
|
+
var r = document.getElementsByTagName("script")[0];
|
|
22
|
+
r.parentNode.insertBefore(t, r);
|
|
23
|
+
}
|
|
24
|
+
}();
|
|
25
|
+
|
|
26
|
+
window.SpotifyPixel('init', '{{SPOTIFY_PIXEL_ID}}');
|
|
27
|
+
window.SpotifyPixel('track', 'PAGE_VIEW');
|
|
28
|
+
|
|
29
|
+
// ── Mapeamento de Eventos CDP Edge → Spotify ──────────────────────────────────
|
|
30
|
+
// PageView → PAGE_VIEW
|
|
31
|
+
// ViewContent → VIEW_CONTENT
|
|
32
|
+
// Lead → LEAD
|
|
33
|
+
// Purchase → PURCHASE
|
|
34
|
+
// AddToCart → ADD_TO_CART
|
|
35
|
+
// InitiateCheckout → INITIATE_CHECKOUT
|
|
36
|
+
// CompleteRegistration → SIGN_UP
|
|
37
|
+
|
|
38
|
+
function trackSpotifyEvent(eventType, params) {
|
|
39
|
+
if (typeof window.SpotifyPixel === 'function') {
|
|
40
|
+
window.SpotifyPixel('track', eventType, params || {});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// ── Integração com cdpTrack.js ────────────────────────────────────────────────
|
|
45
|
+
// O cdpTrack.js envia o evento para o Worker server-side via sendSpotifyCapi()
|
|
46
|
+
// O browser dispara via trackSpotifyEvent() em paralelo para deduplicação
|