Dal click alla vendita: come tracciamo tutto
Documentazione dell'architettura completa per raccogliere, pulire e attribuire ogni dato: dagli UTM fino alle conversioni offline che diventano entrate reali.
In questa pagina
Panoramica dell'architettura
Il sistema è organizzato su tre livelli. Il browser raccoglie UTM, click ID e stato del consenso e invia gli eventi a un container su un tuo sottodominio. Il server container deduplica, arricchisce con i dati del CRM, filtra il traffico non valido e inoltra. Le destinazioni (Meta, Google Ads, GA4, BigQuery, CRM) ricevono eventi completi e coerenti. Nessun dato personale viaggia in chiaro e nessun passaggio dipende da cookie di terze parti.
| Livello | Ruolo | Componenti |
|---|---|---|
| 1 · Browser | Cattura click ID e UTM, genera event_id, legge il consenso, invia al sottodominio first-party | GTM web, dataLayer, Consent Mode v2, cookie first-party, Pixel e tag GA4 (in parallelo) |
| 2 · Server | Riceve gli eventi, scrive cookie HTTP di lunga durata, deduplica, hasha i dati, filtra, inoltra | GTM server container (Stape o Cloud Run), client GA4, tag Meta CAPI, tag Google Ads, webhook dal CRM |
| 3 · Destinazioni | Ottimizzazione campagne, reporting, storico e attribuzione | Meta Conversions API, Google Ads (Enhanced + OCI), GA4 Measurement Protocol, BigQuery, CRM, Looker Studio |
1 · Struttura UTM e link tracking
L'attribuzione comincia dall'URL. Ogni link verso il sito, a pagamento o no, porta parametri UTM coerenti con una convenzione unica (foglio master versionato). Meta e Google li compilano con variabili dinamiche; i link in email, SMS, WhatsApp e bio passano da un redirect server che registra click, IP, dispositivo e orario prima di reindirizzare.
| Parametro | Meta Ads | Google Ads (ValueTrack) | Email / social / SMS |
|---|---|---|---|
utm_source | facebook / instagram | google | email, instagram_bio, whatsapp |
utm_medium | paid_social | cpc | newsletter, bio, sms |
utm_campaign | {{campaign.name}} | {campaign} | nome campagna versionato (es. wuc_mar26) |
utm_content | {{ad.name}} | {creative} | variante del messaggio o posizione del link |
utm_term | {{adset.name}} | {keyword} + device={device} | segmento destinatario |
Esempi di tagging
# Meta Ads · parametri URL dinamici a livello di annuncio
utm_source=facebook&utm_medium=paid_social
&utm_campaign={{campaign.name}}&utm_content={{ad.name}}&utm_term={{adset.name}}
# Google Ads · template di tracciamento con ValueTrack
utm_source=google&utm_medium=cpc
&utm_campaign={campaign}&utm_term={keyword}&utm_content={creative}&device={device}
# Link tracciati · redirect server (email, SMS, WhatsApp, bio)
https://trk.tuodominio.it/l/?src=email_wuc_mar26&uid={{contact_id}}&seq=followup_3
Cookie first-party e click ID
fbclid, gclid, gbraid/wbraid e msclkid vengono catturati al primo accesso e salvati in tre posti: localStorage, un cookie first-party di 180 giorni impostato dal server e il campo del contatto nel CRM al primo form. Così una conversione tardiva, anche dopo settimane o da un altro dispositivo, può essere ricondotta al click di origine.
// Sulla landing page, al primo accesso
fbclid → localStorage → cookie first-party (180 gg, HTTP) → campo CRM "fbclid"
gclid → stessa pipeline → campo CRM "gclid"
utm_* → stessa pipeline → campi CRM "sorgente", "campagna", "contenuto"
2 · Eventi tracciati
Ogni evento ha un nome standard per Meta e per GA4, scatta in un punto preciso del funnel e porta parametri obbligatori: valore, valuta, identificativo univoco e dati di matching. Gli eventi web vengono inviati sia dal browser sia dal server con lo stesso event_id; quelli offline partono solo dal server.
| Momento | Evento Meta | Evento GA4 / Google Ads | Parametri chiave | Fonte |
|---|---|---|---|---|
| Visita rilevante | PageView | page_view | URL, referrer, UTM, consenso | Browser + server |
| Pagina chiave (prezzi, programma) | ViewContent | view_item | content_id, content_name | Browser + server |
| Form compilato / download | Lead | generate_lead | em, ph hashati, fbclid/gclid, event_id, lead_id | Browser + server |
| Iscrizione evento confermata | CompleteRegistration | sign_up | event_id, value del biglietto, currency | Server (webhook CRM) |
| Inizio acquisto | InitiateCheckout | begin_checkout | value carrello, currency, items | Browser + server |
| Acquisto corso / evento | Purchase | purchase | order_id come event_id, value reale, currency=EUR, items | Browser + server |
| Contratto coaching firmato | Purchase (offline) | Offline Conversion Import | gclid/fbclid salvato, value o LTV stimato, conversion_time | Server, entro 24 h dalla firma |
| Chiamata da annuncio | Contact | phone_call | numero dinamico, durata, campagna | Call tracking → server |
3 · Deduplicazione con event_id
Browser e server inviano la stessa conversione. Per contarla una volta sola, entrambi portano lo stesso event_name e lo stesso event_id, generato una sola volta nel dataLayer (per gli acquisti coincide con l'ID ordine). Meta e Google riconoscono la coppia entro la finestra di deduplicazione e scartano il doppione.
| Regola | Dettaglio | Perché |
|---|---|---|
| event_id univoco | Generato nel dataLayer, passato a Pixel, tag GA4 e server; per Purchase è l'order_id | Senza ID condiviso le piattaforme contano due conversioni |
| Finestra di dedup | Standard 48 ore; estesa fino a 7 giorni per eventi lenti come il coaching | Eventi offline arrivano con ritardo rispetto al browser |
| Stesso event_name | Purchase da browser e Purchase da server, mai nomi diversi | La dedup funziona solo su eventi con lo stesso nome |
| Log dei duplicati | Eventi scartati registrati in BigQuery per audit mensile | Tasso di duplicati target sotto il 5% |
| Test Event Code | Attivo solo in staging, mai in produzione | Evita che eventi di test contaminino l'ottimizzazione |
4 · Consent Mode v2
Il consenso dell'utente governa tutto il flusso. Consent Mode v2 definisce quattro segnali che i tag Google leggono prima di scrivere cookie o inviare dati; il server container riceve lo stesso stato e lo applica anche agli eventi verso Meta. Di default tutto è denied; il banner (CMP) aggiorna i valori appena l'utente sceglie.
| Segnale | Cosa governa | Con consenso negato |
|---|---|---|
analytics_storage | Cookie e identificativi di GA4 | GA4 invia ping anonimi senza cookie; i report usano il behavioral modeling |
ad_storage | Cookie pubblicitari (gclid, conversion linker) | Nessun cookie ads; ping di conversione anonimi per il conversion modeling |
ad_user_data | Invio di dati utente a Google per finalità pubblicitarie | Enhanced Conversions e Customer Match non inviano dati hashati |
ad_personalization | Remarketing e personalizzazione annunci | L'utente non entra nelle liste di remarketing |
// Prima di qualsiasi tag: default negato, in attesa del banner
gtag('consent', 'default', {
ad_storage: 'denied',
analytics_storage: 'denied',
ad_user_data: 'denied',
ad_personalization: 'denied',
wait_for_update: 500
});
// La CMP aggiorna i segnali con la scelta dell'utente
gtag('consent', 'update', { ad_storage: 'granted', analytics_storage: 'granted',
ad_user_data: 'granted', ad_personalization: 'granted' });
Il server container legge lo stato di consenso dall'evento in arrivo: se ad_user_data è negato, i tag Meta CAPI e Google Ads non includono email, telefono né click ID. Gli eventi aggregati restano disponibili per il reporting interno in forma anonima.
5 · GTM server container
Il cuore dell'architettura è un container Google Tag Manager lato server, pubblicato su un sottodominio first-party come trk.tuodominio.it, ospitato su Stape o Google Cloud Run. Il container web del sito invia tutti gli eventi lì, invece che direttamente a Meta e Google.
- Cookie HTTP di lunga durata: i cookie
_ga,_fbpe_fbcvengono riscritti dal server con scadenza fino a 2 anni, aggirando il limite di 7 giorni che Safari e iOS impongono ai cookie scritti da JavaScript. - Resistenza agli adblocker: le richieste vanno al tuo dominio, non a facebook.com o google-analytics.com, quindi non vengono bloccate dalle liste dei filtri.
- Un evento, molte destinazioni: il client GA4 riceve l'evento dal browser e lo passa ai tag Meta CAPI, Google Ads, GA4 e BigQuery, ciascuno con il proprio formato.
- Arricchimento: una variabile Firestore o un lookup sul CRM aggiunge email e telefono hashati, external_id e valore LTV all'evento prima dell'inoltro.
- Filtri: IP interni, user agent di bot e richieste malformate vengono scartati o marcati come test prima di arrivare alle piattaforme.
- Ingresso webhook: il CRM e il sistema di pagamento inviano al container gli eventi offline (contratto firmato, pagamento ricevuto) che il browser non può vedere.
| Componente | Configurazione tipica |
|---|---|
| Hosting | Stape (EU) o Cloud Run in europe-west; 2+ istanze in produzione, 1 in staging |
| Dominio | trk.tuodominio.it con record A/CNAME e certificato TLS; mappato anche per il caricamento di gtm.js first-party |
| Client | GA4 client (eventi web), Data Client per i webhook JSON dal CRM |
| Tag | Meta Conversions API, Google Ads Conversion (Enhanced), GA4, BigQuery insert, Slack webhook per alert |
| Variabili | event_id dal dataLayer, consenso, SHA-256 su em/ph/fn/ln, lookup CRM per external_id e LTV |
6 · Meta Conversions API
La Conversions API (CAPI) è il canale server-to-server verso Meta. Ogni evento porta i dati di matching hashati, il click ID, IP e user agent dell'utente, l'event_id per la deduplicazione con il Pixel e l'action_source che distingue web da offline. L'obiettivo è un Event Match Quality alto, condizione per cui Meta attribuisca correttamente la conversione e ottimizzi la consegna.
| Parametro | Contenuto | Note |
|---|---|---|
em, ph | Email e telefono hashati SHA-256 | Email lowercase e trim; telefono in E.164 prima dell'hash |
fn, ln, ct, zp | Nome, cognome, città, CAP hashati | Aumentano il match quando l'email non è disponibile |
external_id | ID contatto CRM hashato | Chiave stabile cross-device |
fbc, fbp | Click ID (da fbclid) e browser ID | Riscritti dal server con lunga scadenza |
client_ip_address, client_user_agent | IP e user agent dell'utente | Obbligatori per eventi web; migliorano il matching |
event_id | Identificativo univoco condiviso con il Pixel | Per Purchase coincide con l'order_id |
action_source | website, phone_call, physical_store, other | Gli eventi offline usano valori diversi da website |
custom_data | value, currency, content_ids, order_id | Valore reale o LTV stimato |
POST https://graph.facebook.com/v21.0/{PIXEL_ID}/events
{
"data": [{
"event_name": "Purchase",
"event_time": 1760000000,
"event_id": "ORD-1042",
"action_source": "website",
"event_source_url": "https://tuodominio.it/grazie",
"user_data": {
"em": ["<sha256 email>"], "ph": ["<sha256 telefono>"],
"external_id": ["<sha256 crm_id>"],
"fbc": "fb.1.1759000000.AbCdEf", "fbp": "fb.1.1758000000.123456",
"client_ip_address": "203.0.113.4", "client_user_agent": "Mozilla/5.0 ..."
},
"custom_data": { "currency": "EUR", "value": 1990, "order_id": "ORD-1042" }
}]
}
Eventi inviati: PageView, ViewContent, Lead (email hashata + fbclid + IP per attribuzione certa), CompleteRegistration (iscrizione evento confermata dal CRM), Purchase con valore reale, order_id e currency, Purchase offline per il coaching inviato entro 24 ore dalla firma con LTV stimato. Target di Event Match Quality: oltre 7/10; match rate su email hashata oltre il 70%.
7 · GA4 Measurement Protocol
Il Measurement Protocol è l'API con cui il server invia eventi a GA4. Serve per registrare in analytics ciò che accade fuori dal browser (contratto firmato, pagamento ricevuto, rimborso) e per completare gli eventi web con dati che il client non ha. Ogni chiamata richiede measurement_id, api_secret e un client_id esistente (dal cookie _ga) oppure uno user_id, altrimenti l'evento non viene associato a nessun utente.
POST https://www.google-analytics.com/mp/collect?measurement_id=G-XXXXXXX&api_secret=***
{
"client_id": "1234567890.1759000000",
"user_id": "crm_8812",
"timestamp_micros": 1760000000000000,
"consent": { "ad_user_data": "GRANTED", "ad_personalization": "GRANTED" },
"events": [{
"name": "purchase",
"params": {
"transaction_id": "ORD-1042", "value": 1990, "currency": "EUR",
"items": [{ "item_id": "corso-marketing", "item_name": "Corso Marketing", "price": 1990, "quantity": 1 }],
"session_id": "1759000000", "engagement_time_msec": 100
}
}]
}
- Il
client_idviene salvato sul contatto CRM al primo form, così gli eventi offline tornano nella stessa sessione utente di GA4. - Il Measurement Protocol non crea nuovi utenti né sessioni complete: va usato per integrare, non per sostituire il tag web.
- I dati arrivano in BigQuery con l'export giornaliero o in streaming, dove vengono uniti a costi e CRM per la dashboard.
8 · Google Enhanced Conversions e offline conversions
Lato Google Ads lavoriamo su tre livelli: le Enhanced Conversions for web arricchiscono le conversioni del sito con email e telefono hashati; le Enhanced Conversions for leads e l'Offline Conversion Import portano in Google Ads le vendite chiuse fuori dal sito; Customer Match carica liste hashate per audience, lookalike ed esclusioni.
| Meccanismo | Chiave di matching | Quando | Tempistica |
|---|---|---|---|
| Enhanced Conversions for web | Email, telefono, indirizzo hashati SHA-256 + gclid | generate_lead, purchase sul sito | In tempo reale dal server container |
| Enhanced Conversions for leads | Email o telefono hashati del lead | Il lead diventa cliente nel CRM | Entro 63 giorni dal click |
| Offline Conversion Import (OCI) | gclid, gbraid o wbraid salvato sul lead | Contratto firmato, pagamento ricevuto | Entro 90 giorni dal click, via API o import schedulato |
| Customer Match | Liste di email e telefoni hashati | Segmenti RFM settimanali | Sync automatico ogni settimana |
// Pipeline offline → Google Ads
CRM: il lead firma il contratto
→ webhook al server container
→ estrae gclid (o gbraid/wbraid), data di conversione, valore reale
→ Offline Conversion Import via Google Ads API (entro 90 gg dal click)
→ Google ottimizza le aste su chi compra davvero, non su chi compila un form
9 · Pipeline nurturing: dal lead alla vendita tracciata
Ogni tappa del funnel invia un evento server-side. Le piattaforme imparano da tutto il percorso, non solo dal primo click, e il CRM mantiene punteggio, sorgente e click ID aggiornati. Volumi di esempio, struttura reale.
| Tappa | Volume | Passaggio | Eventi inviati |
|---|---|---|---|
| 1 · Lead freddo | 10.000 | 100% (top of funnel) | CAPI Lead · CRM: contatto creato · fbclid/gclid salvati · UTM registrati |
| 2 · Lead caldo | 3.200 | 32% | Apre 3+ email · CAPI ViewContent · CRM score > 50 · retargeting attivato |
| 3 · Iscritto evento | 1.100 | 34% dai lead caldi | CAPI CompleteRegistration · offline conversion Meta · sequenza pre-evento · score aggiornato |
| 4 · Primo acquisto | 320 | 29% dagli iscritti | CAPI Purchase con valore reale · Google OCI · audience "clienti" |
| 5 · Cliente ricorrente | 145 | 45% upsell | CAPI Purchase ×2 · LTV stimato inviato · lookalike sugli acquirenti · pipeline coaching |
10 · Pulizia e qualità del dato
Deduplicazione eventi Critico
- event_id univoco su ogni evento: Pixel e CAPI mandano lo stesso ID, Meta e Google deduplicano.
- Finestra di dedup configurata fino a 7 giorni per eventi lenti come il coaching.
- Log degli eventi duplicati per l'audit mensile.
- Test Event Code attivo in staging, mai in produzione.
Normalizzazione contatti Critico
- Email sempre lowercase, trim e validazione regex prima dell'hashing.
- Telefono normalizzato in formato E.164 (+39…).
- Merge automatico dei duplicati nel CRM su email e telefono.
- Flag "test interno" sui contatti del team per escluderli dalle metriche.
Filtro del traffico non valido Importante
- IP interni e del team in blacklist su GA4, Meta e Google Ads.
- Filtro bot attivo su GA4 e Cloudflare Turnstile sui form.
- Monitoraggio anomalie: picchi improvvisi di CTR o click generano un alert.
- Esclusione dal remarketing dei clienti già attivi.
Stitching cross-device Importante
- Email come chiave univoca che unifica sessioni mobile e desktop.
- fbclid e gclid collegati al contact_id del CRM dal primo click.
- Continuità di sessione: lo stesso utente che torna dopo 30 giorni viene riconosciuto dal CRM.
- Finestra di attribuzione configurata: 7 giorni click / 1 giorno view per Meta.
Validazione UTM e tagging Importante
- Foglio master UTM: ogni campagna ha un codice unico e versionato.
- Alert automatico se arrivano sessioni senza UTM da canali a pagamento.
- Regex per rilevare UTM malformati o duplicati nel naming.
- Revisione mensile degli UTM orfani (click senza conversioni).
Data quality score Avanzato
- Score mensile automatico per ogni fonte: percentuale di eventi con email matchata.
- Match rate CAPI target oltre il 70%; sotto il 60% è un problema di qualità dei dati.
- Dashboard separata di data health, visibile solo internamente.
- Alert su Slack quando il match rate scende sotto la soglia critica.
11 · Obiettivi di qualità del dato
I target mensili che monitoriamo e riportiamo nel report di data health.
| Metrica | Target | Come la misuriamo |
|---|---|---|
| CAPI match rate (email hashata) | > 70% | Events Manager, per evento e per settimana |
| Sessioni paid con UTM completo | > 95% | GA4 + BigQuery: sessioni con medium cpc/paid_social senza campaign |
| Tasso di eventi duplicati CAPI | < 5% | Log di dedup in BigQuery |
| Lead con email valida nel CRM | > 98% | Validazione regex e bounce al primo invio |
| Conversioni offline importate entro 90 giorni | 100% | Confronto CRM vs Google Ads OCI e Meta offline |
| gclid/fbclid salvato su ogni lead | > 85% | Campi CRM non vuoti sui lead da canali paid |
| Traffico bot e test nei report | < 2% | Sessioni marcate "invalid" vs totale |
12 · Funzionalità avanzate
Quello che si costruisce sopra un dato affidabile. Per il dettaglio orientato al business vedi la fase 05 del framework.
| Funzionalità | Come funziona | Impatto |
|---|---|---|
| Time-to-purchase attribution | Giorni tra primo click e vendita per ogni prodotto, da BigQuery | Finestre di attribuzione e budget tarati sul ciclo reale |
| LTV predittivo a 12 mesi | Modello sullo storico ordini; il valore stimato sostituisce il primo ordine negli eventi | Le piattaforme ottimizzano verso chi spende di più |
| Audience RFM dinamiche | Recency, Frequency, Monetary ricalcolati ogni settimana e sincronizzati con Meta e Google | Win-back automatico, esclusioni, upsell premium |
| Anomaly detection | Soglie su CPL, conversioni, budget, CAPI fermo; notifica Slack/email con causa probabile | Zero budget sprecato in silenzio |
| Tracking senza cookie di terze parti | Identità first-party, server-side, Consent Mode v2 | Funziona con iOS, Safari e normative future |
| Attribuzione multi-touch | Analisi delle sequenze di touchpoint (es. Google → blog → email → retargeting Meta) in BigQuery | Budget allocato sulla sequenza che converte |
| Call tracking + CRM match | Numero dinamico per campagna; la chiamata che diventa vendita è importata come conversione offline | Attribuzione anche delle vendite telefoniche |
| Report AI settimanale | Ogni lunedì: confronto settimana precedente, anomalie, 3 insight, 3 azioni | Zero ore di reporting manuale |
13 · Stack tecnologico tipico
Gli strumenti cambiano in base a quello che usi già; l'architettura resta la stessa.