15 min di letturaTutorial
Pilastro

Come tracciare le campagne UTM end-to-end senza un CDP

Un playbook pratico per i marketer: template UTM del workspace, importazione in blocco da Sheets, inoltro delle conversioni server-side e il dry-run QA che intercetta il drift prima del lancio

Ana Kowalska
Marketing solutions engineering
Pipeline UTM in cinque passaggi: template workspace, override campagna, importazione in blocco, inoltro server-side, verifica GA4 DebugView

Ho messo in piedi il tracciamento UTM end-to-end in tre aziende diverse. Ogni volta, le stesse cinque cose si sono rotte nello stesso ordine, e ogni volta la correzione è stata la stessa: portare il templating al livello della campagna, spingere l'inoltro delle conversioni sul server, e mettere un dry run tra i due. Questo è quasi tutto l'articolo. Il resto è la checklist QA che intercetta le cose che non avevi previsto di rompere.

Se non sei ancora sicuro di cosa faccia ciascuno dei cinque tag, Parametri UTM spiegati è la base su cui si costruisce questa pipeline.

Non ti serve una Customer Data Platform per questo. Prima o poi ne avrai bisogno se il tuo problema di attribuzione diventa "unire quattro touchpoint anonimi su tre dispositivi in un unico customer journey", ma per il caso che vedo più spesso - "tagga ogni link in uscita in modo coerente, cattura il clic, inoltra la conversione a Meta e GA4 lato server e sopravvivi a Safari" - uno URL shortener con i template più una API di conversioni fa il lavoro. Qui sotto trovi la versione che funziona, con le modalità di fallimento che ho visto emergere.

Cosa va storto con il tracciamento UTM

I marketer con cui lavoro non sono negati con gli UTM. Il problema è che gli strumenti, per impostazione predefinita, rendono facile digitare un UTM una volta, difficile farlo rispettare in tutta l'organizzazione, e impossibile correggerlo dopo il lancio. Quattro modalità di fallimento ricorrono continuamente.

Drift. Una persona digita utm_source=newsletter, un'altra digita utm_source=Newsletter, una terza digita utm_source=email. Sei mesi dopo, il tuo canale "newsletter" è spezzettato in nove varianti diverse in GA4. Ripulirlo a posteriori è un esercizio di regex e preghiere. Lo script urchinTracker() originale che introdusse questa convenzione - il prodotto di web analytics pre-Analytics di Google chiamato Urchin, reso brevemente open-source nel 2003 prima di essere assorbito - non aveva nemmeno un livello di template. La convenzione è sempre stata "scrivilo in modo coerente"; gli strumenti non l'hanno mai imposto.

Tagging manuale su scala. Una campagna con volantini con 80 short link su quattro negozi regionali sono 320 URL da digitare, incollare in un foglio di calcolo, copiare nel tuo shortener e sperare bene. Metà di loro finisce con l'utm_content sbagliato. Nessuno se ne accorge finché la campagna non è già partita da due settimane.

Lacune nelle conversioni server-side. Il pixel scatta sulla pagina di ringraziamento, GA4 lo raccoglie, Meta lo raccoglie, e torni a casa tranquillo. Poi Safari rilascia un'altra versione di ITP, le installazioni di ad blocker salgono, e le tue conversioni riportate crollano di un terzo. Le note di rilascio di Apple ITP 2.3 spiegano esattamente il meccanismo: la decorazione dei link viene limitata, document.referrer viene rimosso, e qualsiasi flusso di analytics che dipende dall'esecuzione di JS di terze parti nel browser degrada silenziosamente. Le conversioni continuano ad avvenire sul tuo server. Semplicemente non arrivano più alle piattaforme pubblicitarie.

Nessun dry-run. La prima conversione che attraversa la nuova pipeline è il primo acquirente vero. Se qualcosa è configurato male, te ne accorgi tre giorni dopo, quando l'algoritmo di ottimizzazione ha già tolto budget a una campagna che in realtà funzionava.

Questo articolo affronta i primi tre problemi con template + importazione in blocco + inoltro server-side, e il quarto con un passaggio di verifica facile da saltare e costoso da saltare.

Template UTM di workspace e di campagna

I template spostano il problema della coerenza più in alto nello stack. Definisci la tua convenzione di tagging una sola volta a livello di workspace, aggiungi override per campagna dove servono, e lascia che ogni link erediti il resto. Non resta più spazio per un errore di battitura.

Definisci prima i default del workspace. I valori letterali fissano le variabili che non cambiano mai per la tua organizzazione (utm_medium = email per le campagne newsletter); i placeholder si riempiono dal payload del link al momento della creazione:

curl -X PUT \
  https://api.elido.app/v1/workspaces/1/utm-template \
  -H "Authorization: Bearer $ELIDO_TOKEN" \
  -d '{
    "utm_source":   "{{ channel }}",
    "utm_medium":   "{{ medium }}",
    "utm_campaign": "{{ campaign }}",
    "utm_content":  "{{ creative }}",
    "utm_term":     "{{ audience.segment }}"
  }'

Alcuni dettagli che qui contano:

  • I placeholder vengono riempiti al momento della creazione del link, non al momento del clic. Quello che finisce nel tuo strumento di analytics è ciò che era previsto nel momento in cui il link è stato generato - non qualunque cosa la destinazione del link abbia calcolato al clic. Questo rende molto più semplice ricostruire l'audit log quando, sei mesi dopo, qualcosa sembra sbagliato.
  • I placeholder sconosciuti falliscono subito. Se la tua importazione in blocco manca di una colonna creative e il template del workspace fa riferimento a {{ creative }}, la API restituisce un 422 con il nome della variabile non risolta. Nessuna applicazione parziale silenziosa.
  • Il riferimento completo del template, inclusi i placeholder link.tag.<name> che leggono dall'array dei tag del link (utili per le agenzie multi-tenant che devono incorporare un identificativo cliente in ogni URL), è nella guida della documentazione.

Poi aggiungi un template di campagna. Le campagne ereditano dal workspace e sovrascrivono il sottoinsieme specifico della campagna:

curl -X POST \
  https://api.elido.app/v1/campaigns \
  -H "Authorization: Bearer $ELIDO_TOKEN" \
  -d '{
    "name": "Spring 2026 - DACH",
    "utm_template": {
      "utm_campaign": "spring_2026_dach",
      "utm_term":     "{{ audience.locale }}"
    }
  }'

Tutto ciò che non è impostato sulla campagna ricade sui default del workspace. Questa stratificazione a due livelli copre la maggior parte delle strutture organizzative reali: convenzioni condivise a livello di workspace, override specifici per team o stagione a livello di campagna. Se ti trovi a desiderare un terzo livello di ereditarietà, è un campanello d'allarme - di solito significa che due campagne dovrebbero essere in realtà una campagna sola con placeholder più intelligenti.

Pagina Campagne nella dashboard Elido, quattro campagne con i rispettivi default UTM compilati: Spring 2026 launch (newsletter / email), Newsletter weekly, Influencer DACH Q2 (creator / partner), Paid social Meta retargeting

Ciò a cui gli override per singolo link rinunciano: un override si attiva a prescindere dal template. Ciò che invece conservano: l'override viene registrato nell'audit log con attore, timestamp e il diff tra il valore risolto e quello finale. Tra sei mesi, quando qualcuno chiederà perché un link su 200 in una campagna ha utm_term=manual_override, potrai rispondere.

Importazione in blocco da Sheets - il workflow che i marketer usano davvero

I marketer non passano la giornata a digitare comandi curl. Il brief della campagna arriva come foglio di calcolo con URL di destinazione e metadati della campagna, la scadenza del lancio è venerdì, e la domanda è come far diventare quel foglio 200 short link senza che qualcuno debba digitare la stessa stringa UTM 200 volte.

I nomi delle colonne del CSV corrispondono ai nomi dei placeholder del tuo template (senza distinzione tra maiuscole e minuscole). Le colonne che Elido non riconosce vengono scartate con un avviso invece di essere copiate silenziosamente - questo è deliberato. La copia silenziosa è il modo in cui utm_brand_color finisce in GA4 perché qualcuno ha aggiunto una colonna per una nota interna.

destination_url,channel,medium,creative
https://shop.example.com/de,newsletter,email,hero_a
https://shop.example.com/fr,newsletter,email,hero_a
https://shop.example.com/de,paid_social,meta,carousel_v2
https://shop.example.com/fr,paid_social,meta,carousel_v2

Invialo come multipart:

curl -X POST \
  https://api.elido.app/v1/links/bulk \
  -H "Authorization: Bearer $ELIDO_TOKEN" \
  -F "csv=@launch_q2.csv" \
  -F "campaign_id=cmp_8a2f"

Due cose che questo flusso di validazione ti offre e che l'interfaccia link-per-link non offre:

  • Commit tutto-o-niente. Una singola riga sbagliata blocca l'intero upload e restituisce i numeri di riga incriminati con la relativa motivazione - row 47: unresolved variable {{ creative }} è un errore molto più utile che scoprire, alle 16 di un venerdì, che 47 dei tuoi 200 link si sono risolti in una stringa placeholder.
  • Anteprima pre-lancio. La riga di anteprima dell'importazione in blocco nella dashboard mostra l'URL risolto, inclusa la query string utm_* renderizzata, prima del commit. Guarda il secondo link per assicurarti che il template abbia fatto quello che ti aspettavi, poi guarda l'ultimo per assicurarti che le righe in fondo al file non abbiano preso una piega diversa. Due occhiate, un minuto.

Se il tuo foglio di calcolo non ha una forma stabile - l'ordine delle colonne cambia, le intestazioni vengono rinominate - l'endpoint di importazione in blocco ti darà del filo da torcere. La soluzione non sta nei nostri strumenti; la soluzione è impegnarsi su uno schema CSV per i brief di campagna e trattare il drift dello schema come un bug di processo. Ne discutiamo il pattern più ampio nella pagina delle soluzioni per i marketer.

Inoltro server-side delle conversioni a Meta CAPI e GA4

L'attribuzione basata solo sul pixel perde il 20-40% delle conversioni a causa di Safari ITP, ad blocker e banner di consenso. Il numero varia per settore - l'ecommerce DTC vede la fascia alta di questo intervallo, il SaaS B2B quella bassa - ma ogni misurazione che ho visto dopo iOS 14 colloca l'affidabilità del pixel ben sotto il 95% che le piattaforme pubblicitarie danno per scontato. L'algoritmo di ottimizzazione riceve input più rumorosi e il tuo CPA appare peggiore di quanto sia davvero.

La documentazione della Conversions API di Meta è esplicita su questo: gli eventi server sono ciò che vuoi, il pixel lato browser è il complemento. Il Measurement Protocol di GA4 sostiene la stessa tesi. Entrambi i protocolli accettano la stessa struttura: un evento server-side con i dettagli della conversione, un event_id per la deduplicazione, e idealmente identificatori utente sottoposti a hash così che le piattaforme possano ricollegare la conversione a un visitatore noto.

Il collegamento che chiude il divario è meccanico. Tre passaggi.

Passaggio uno - cattura il click_id. Ogni risposta di redirect di Elido porta un'intestazione X-Elido-Click-Id. Gli SDK TS / Python / Go la espongono sull'oggetto risposta del redirect; funziona anche l'HTTP grezzo:

curl -sI https://elido.me/launch | grep -i click-id
# X-Elido-Click-Id: clk_01HYZ7T8WV6KQX3M

Conservalo in un cookie di prima parte sulla pagina di destinazione (elido_click_id, TTL di 90 giorni - abbastanza lungo da coprire una tipica valutazione SaaS, abbastanza breve da rispettare le indicazioni ePrivacy). Rileggilo al checkout.

Passaggio due - collega le destinazioni. Invia le credenziali per le superfici verso cui vuoi inoltrare. Qualsiasi sottoinsieme funziona; le superfici mancanti vengono saltate silenziosamente:

curl -X PUT \
  https://api.elido.app/v1/workspaces/1/conversion-forwarding \
  -H "Authorization: Bearer $ELIDO_TOKEN" \
  -d '{
    "meta_capi": {
      "pixel_id": "1234567890",
      "access_token": "EAA…",
      "test_event_code": null
    },
    "ga4_mp": {
      "measurement_id": "G-ABC123",
      "api_secret": "abc_def_ghi"
    }
  }'

Mixpanel non è una destinazione di conversione. L'integrazione Mixpanel di Elido inoltra ogni clic su short link come evento link_click, e la colleghi separatamente sotto Integrazioni.

Passaggio tre - invia la conversione. Quando l'ordine scatta, invia l'evento con il click_id e i dettagli dell'ordine. event_id è la tua chiave di idempotenza:

curl -X POST \
  https://api.elido.app/v1/conversions \
  -H "Authorization: Bearer $ELIDO_TOKEN" \
  -d '{
    "click_id":   "clk_01HYZ7T8WV6KQX3M",
    "event_name": "purchase",
    "event_id":   "ord_98231",
    "value":      89.00,
    "currency":   "EUR",
    "user": {
      "email":  "[email protected]",
      "phone":  "+4915123456789",
      "external_id": "cust_5128"
    }
  }'

I campi identificativi dell'utente vengono sottoposti a hash SHA-256 prima dell'inoltro a Meta e GA4 - è ciò che entrambe le piattaforme richiedono. Il contesto UTM viene estratto dalla riga di clic che corrisponde al click_id, quindi l'evento inoltrato porta con sé l'attribuzione di campagna originale anche se l'utente ha girovagato sul sito per un'ora prima del checkout. La meccanica completa, incluse la gestione dei rimborsi e il toggle del modello di attribuzione multi-touch, è nella guida all'inoltro delle conversioni.

Tab admin del pixel di conversion tracking nella dashboard Elido, con campi per Meta Pixel ID, Google Ads / GA4 ID, LinkedIn Insight Tag e TikTok Pixel Code

Questo chiude gran parte del divario. Resta un buco residuo - visitatori che bloccano il cookie del click_id, o che arrivano attraverso un percorso non-Elido - ma per le campagne verso cui indirizzi davvero traffico, sei passato da "60-80% di affidabilità del pixel" a "oltre il 95% di affidabilità server".

Tre casi limite in cui l'audit log ti salva

Template e inoltro gestiscono il percorso lineare. I casi qui sotto emergono alla terza settimana di qualsiasi campagna non banale, e la risposta giusta a tutti loro sta nell'audit log e nel pannello delle conversioni, non nel tentativo di progettare un template più elaborato.

Un caso che non è in questa lista perché non puoi risolverlo con un template: un clic che arriva senza referrer e con un parametro di campagna che non hai impostato tu. È quello che mandano gli assistenti AI, e tracciare il traffico da ChatGPT spiega come comportarsi.

Rimborsi. Una conversione di acquisto è scattata, il cliente ha reso l'articolo una settimana dopo, e il tuo fatturato riportato è ora dell'8% troppo alto. La correzione è inviare lo stesso event_id con event_name: "refund". Meta e GA4 lo trattano come una conversione negativa rispetto a quella originale. Il motivo per cui event_id è strutturato così: l'idempotenza a livello di event id fa sì che non si possa contare due volte nemmeno il rimborso. Il pattern completo è documentato nella sezione sui casi limite della guida all'inoltro delle conversioni - rimborsi, rimborsi parziali e credito negozio hanno ciascuno una forma leggermente diversa.

Click_id non trovato. Una conversione scatta con un click_id che non corrisponde a nessun clic noto - un errore di battitura, una scadenza oltre il periodo di conservazione, un workspace sbagliato. La conversione viene comunque registrata sul workspace ma inoltrata con un contesto UTM vuoto. Questo è intenzionale: l'attribuzione generica è più utile che scartare del tutto la conversione, e il flag click_id_unknown nell'audit log ti permette di filtrare la quota non attribuita in fase di reporting. Se quella quota supera il 5% delle conversioni, c'è qualcosa che non va nel modo in cui persisti il click_id sulla pagina di destinazione - di solito l'attributo SameSite del cookie o l'ambito del percorso.

Conversioni in ritardo. Una vendita B2B SaaS si chiude 47 giorni dopo il clic originale. La conservazione predefinita dei clic di Elido è di 30 giorni, quindi quando la conversione scatta il clic è già scaduto e ti trovi nel caso di click_id non trovato descritto sopra. Due soluzioni, a seconda del tuo ciclo di vendita: alza la conservazione a 90 giorni sul workspace (piano Pro in su), oppure cattura il click_id su un identificatore di prima parte a lunga durata (la colonna original_click_id del record cliente) così puoi ricollegarlo al momento della conversione anche se il cookie non c'è più. Abbiamo visto entrambi i pattern in produzione.

L'audit log mostra il diff UTM tra valore risolto e finale per ogni link, il codice di risposta dell'inoltro per destinazione e per conversione, e lo stato del collegamento tra click_id e conversione. Quando l'algoritmo di ottimizzazione toglie budget a una campagna che sembra sottoperformare, l'audit log è ciò che ti permette di dire "no, la campagna va bene; abbiamo perso tre giorni di inoltro per colpa di un api_secret di GA4 ruotato e mai aggiornato". Guardalo.

Il QA pre-lancio - dry-run dell'intera pipeline

Non lasciare che la prima conversione che attraversa questa pipeline sia un acquirente vero. Il costo di un dry-run di 30 minuti lo sostieni interamente tu; il costo di una pipeline mal configurata lo sostiene l'algoritmo di ottimizzazione, che toglie budget alla tua campagna migliore per due giorni prima che tu te ne accorga. L'asimmetria è pesante.

Tre passaggi, in ordine.

Dry run dell'importazione in blocco. L'endpoint di importazione in blocco accetta dry_run=true come parametro di query. Esegue la validazione, risolve i template e restituisce i link che verrebbero creati senza eseguire il commit. Apri la risposta in un qualsiasi visualizzatore JSON; l'URL risolto di ogni riga è visibile. Controlla a campione 3-5 righe: il secondo link, l'ultimo link e qualsiasi riga che abbia sovrascritto i default del workspace. Verifica che la query string utm_* sia esattamente quella indicata nel brief della campagna.

Modalità test dell'inoltro delle conversioni. Meta CAPI accetta un parametro test_event_code, che instrada l'evento nella scheda Test Events di Events Manager invece che in produzione. Impostalo sulla configurazione di inoltro del workspace, invia 10-20 conversioni di prova e verifica che arrivino. Stessa cosa per GA4: imposta debug_mode: true sugli eventi e controlla in DebugView. Entrambi sono in tempo reale. Il punto non è verificare a campione che la API funzioni; il punto è intercettare un pixel_id configurato male o un api_secret che è stato ruotato e mai aggiornato.

Smoke test end-to-end. Clicca uno dei tuoi short link reali da una sessione browser pulita. Osserva il clic nel pannello dei clic recenti della dashboard Elido. Fingi di aver comprato qualcosa - invia una conversione purchase con quel click_id dal terminale. Verifica che la conversione compaia negli Eventi di Test di Meta e nel DebugView di GA4 con il contesto UTM corretto allegato. L'intero ciclo dura meno di 10 minuti, una volta che l'hai fatto una volta.

Dopo che tutti e tre i passaggi sono superati, rimuovi il test_event_code, imposta debug_mode: false e lancia. Il primo acquirente vero troverà una pipeline pulita ad attenderlo.

Pannello Conversioni nella dashboard Elido con conversioni totali e fatturato, top link per fatturato, grafico del fatturato giornaliero negli ultimi 30 giorni e ripartizione del fatturato per piattaforma

Quando ti serve davvero un CDP

Template più importazione in blocco più inoltro server-side ti portano quasi in fondo. C'è una classe di problemi in cui questo non basta, e lì rivolgersi a un CDP è la scelta giusta.

Riconciliazione dell'identità cross-device. Un visitatore clicca un link da mobile, non converte, torna da desktop, si registra. Vuoi che entrambi i touchpoint vengano attribuiti alla stessa persona. Il tracciamento UTM più click_id opera a livello di touchpoint; il livello di identità utente che unisce i due touchpoint in un unico customer journey è ciò per cui è costruito un CDP (Segment, mParticle, RudderStack). Elido conserva fino a 30 giorni di clic per visitatore e supporta l'attribuzione last-touch / first-touch / position-based all'interno di quella finestra, ma la riconciliazione cross-device richiede un identity graph che deliberatamente non gestiamo.

Personalizzazione sub-100ms. Se stai renderizzando la pagina di destinazione in base ai touchpoint precedenti del visitatore in tempo reale - recuperando il segmento da un feature store e variando il titolo dell'hero - ti serve la risoluzione dell'identità vicino al rendering. Questo è territorio da CDP oppure, più spesso, una piattaforma di sperimentazione come PostHog o LaunchDarkly sovrapposta a esso.

Attribuzione multi-touch su larga scala. Il last-touch va bene per la maggior parte delle campagne. Se il tuo ciclo di vendita ha sei touchpoint distribuiti su quattro mesi e devi davvero dare credito a ciascuno, sei nel territorio in cui l'attribuzione con catena di Markov o valore di Shapley inizia a fare la differenza. Elido offre last-touch / first-touch / position-based; qualcosa di più sofisticato richiede uno strumento con un vero identity graph e uno strato di modellazione.

Per tutto il resto - e "tutto il resto" è la maggior parte dei team di marketing con cui ho lavorato - il pattern template + importazione in blocco + inoltro server-side basta e avanza. Configura una volta il template del workspace, il template di campagna a ogni lancio, la configurazione dell'inoltro una volta per ogni integrazione con una piattaforma, ed esegui il dry-run prima di ogni lancio. Se fai tutte e quattro le cose, avrai una pipeline UTM più solida dell'80% dei team di marketing che ho controllato.

Costruiscila una volta, fai il dry-run prima di ogni lancio, e passa alla campagna successiva.

Altri articoli sul blog

Prova Elido

Incolla un URL, ottieni un link breve

Senza registrazione. Il link vive 30 giorni. Iscriviti per conservarlo.

Gratis, nessuna registrazione richiesta · 2 al giorno

Prova Elido

Accorciatore di URL ospitato nell'UE: domini personalizzati, analisi approfondite e API aperta. Piano gratuito - senza carta di credito.

Tag
utm tracking
utm template
utm builder
utm attribution
conversion forwarding
ga4
meta capi

Continua a leggere