Il modulo compilato non è una vendita. Finché Meta non sa quali contatti sono diventati clienti, continuerà a portarti chi compila più volentieri, non chi compra. Ecco come risolvere, anche partendo da un Google Sheet.
Ogni passaggio di stato nel CRM torna a Meta come evento.
Ti aiutiamo a collegare il tuo CRM a Meta, anche se oggi è un Google Sheet.
Parliamo del tuo casoUna campagna Lead Ads ottimizzata sui “contatti” impara a trovare persone che compilano moduli. Non sa nulla di cosa succede dopo: la chiamata, l’appuntamento, l’acquisto.
Il CRM serve a chiudere questo cerchio. Ogni volta che un lead fa un passo avanti nel tuo processo commerciale, lo comunichi a Meta. A quel punto puoi chiedere all’algoritmo di trovare persone simili a chi è diventato cliente.
Questa è la parte tecnica: dataset, eventi, codice. Se prima vuoi capire perché conta più della struttura delle campagne, parti da Lead generation su Meta Ads: la struttura perfetta non esiste.
Prima del codice viene la strategia. Scegli 3-5 stati che descrivono davvero il percorso del tuo cliente. Per una palestra, per esempio (come nel caso delle tre palestre in Campania):
| Stato nel CRM | Cosa significa | Nome evento da inviare |
|---|---|---|
| Nuovo | Ha compilato il modulo | lead (invialo anche dal CRM) |
| Contattato | Abbiamo parlato al telefono | contattato |
| Appuntamento | Ha prenotato una prova | appuntamento |
| Cliente | Si è iscritto/ha pagato | Purchase (con value e currency) |
Anche lo stato “Nuovo” va inviato dal CRM, come evento lead. Il modulo lo registra già Meta, ma nelle indicazioni per l’integrazione CRM Meta chiede di inviare anche la fase iniziale: così vede tutto il percorso, dal modulo compilato fino alla vendita, e non solo gli ultimi passaggi. Per Purchase aggiungi il valore della vendita e la valuta: lo vediamo nel codice dello Step 4.
Regola pratica: ottimizza la campagna sull’evento più vicino alla vendita che raggiunge almeno qualche decina di occorrenze a settimana. Se le vendite sono troppo poche, parti dall’appuntamento.
Quali esiti segnare dopo la telefonata, e quando un contatto si può davvero dire “contattato”, lo spieghiamo lato vendite in I contatti di Facebook non rispondono? Cosa segnare nel CRM.
Ogni lead raccolto con un modulo Meta ha un lead_id univoco (un numero di 15-17 cifre). È la chiave che permette a Meta di riconoscere il contatto con precisione quasi totale, senza dover “indovinare” da email o telefono.
Qualunque sia il modo in cui i lead arrivano nel tuo CRM (integrazione nativa, Zapier, Make, download CSV), assicurati che il lead_id venga salvato in una colonna, come testo e non come numero: più avanti vediamo perché.
La chiamata alla Conversions API per un evento CRM ha questa forma. Nell’esempio ci sono due eventi: un appuntamento e una vendita (Purchase) con il suo valore in euro.
POST https://graph.facebook.com/v26.0/{ID_DATASET}/events?access_token={TOKEN}
{
"data": [
{
"event_name": "appuntamento",
"event_time": 1760950000,
"action_source": "system_generated",
"custom_data": {
"event_source": "crm",
"lead_event_source": "Il mio CRM"
},
"user_data": {
"lead_id": "1234567890123456"
}
},
{
"event_name": "Purchase",
"event_time": 1760953600,
"action_source": "system_generated",
"custom_data": {
"event_source": "crm",
"lead_event_source": "Il mio CRM",
"value": 120.00,
"currency": "EUR"
},
"user_data": {
"lead_id": "6543210987654321"
}
}
]
}event_timeIl momento del cambio di stato, in secondi Unix. Gli eventi più vecchi di 7 giorni vengono scartati, quindi invia con regolarità.
action_source:
"system_generated"Dice a Meta che l’evento arriva da un CRM.
lead_idIl collegamento al contatto originale, tra virgolette, come stringa. Con 15-17 cifre è oltre la precisione con cui JavaScript e Google Sheet gestiscono i numeri: se lo invii come numero le ultime cifre vengono arrotondate e Meta non ritrova più il contatto. Se non hai il lead_id, puoi usare email e telefono (campi em e ph), trasformati con hash SHA-256 dopo averli normalizzati: email in minuscolo e senza spazi; telefono con prefisso internazionale, solo cifre.
value
currencySolo per la vendita: dentro custom_data metti l’importo (value) e la valuta (currency: "EUR"). Così Meta sa non solo chi ha comprato, ma quanto vale quella vendita.
Niente software? Nessun problema. Un foglio Google ben fatto e uno script di una trentina di righe bastano per partire.
Due cose da fare prima di incollare i lead, altrimenti lo script non funziona:
| A · lead_id | B · Nome | C · Stato | D · Inviato | E · Valore | |
|---|---|---|---|---|---|
| 2 | 1234567890123456 | Mario R. | appuntamento | appuntamento | (vuoto) |
| 3 | 6543210987654321 | Giulia B. | Purchase | (vuoto) | 120 |
La colonna Stato la aggiorna chi gestisce i contatti, con un menu a tendina (Dati → Convalida dati) che contiene solo i nomi evento scelti allo Step 2. La colonna Inviato la scrive lo script, per non mandare due volte lo stesso evento. La colonna Valore è facoltativa: se la compili (in euro, come numero) lo script aggiunge all’evento value e currency; di solito serve solo sulle righe Purchase.
Da Estensioni → Apps Script, incolla:
const DATASET_ID = 'IL_TUO_ID_DATASET';
function inviaEventiCRM() {
const token = PropertiesService.getScriptProperties().getProperty('META_TOKEN');
const sheet = SpreadsheetApp.getActive().getSheetByName('Lead');
const rows = sheet.getDataRange().getValues();
for (let i = 1; i < rows.length; i++) {
const [leadId, , stato, inviato, valore] = rows[i];
if (!leadId || !stato || stato === inviato) continue;
const dati = { event_source: 'crm', lead_event_source: 'Google Sheet' };
if (valore) { // colonna E facoltativa: solo se compilata
dati.value = Number(valore);
dati.currency = 'EUR';
}
const evento = {
event_name: stato,
event_time: Math.floor(Date.now() / 1000),
action_source: 'system_generated',
custom_data: dati,
user_data: { lead_id: String(leadId).trim() } // stringa, mai Number()
};
const res = UrlFetchApp.fetch(
`https://graph.facebook.com/v26.0/${DATASET_ID}/events?access_token=${token}`,
{ method: 'post', contentType: 'application/json',
payload: JSON.stringify({ data: [evento] }), muteHttpExceptions: true }
);
if (res.getResponseCode() === 200) sheet.getRange(i + 1, 4).setValue(stato);
else console.log(`Riga ${i + 1}: ${res.getContentText()}`);
}
}META_TOKEN con il token dello Step 1. Così non compare nel codice.inviaEventiCRM, ogni ora.Da quel momento Meta smette di inseguire chi compila più facilmente e inizia a cercare chi, nel tuo funnel, arriva fino in fondo. Serve pazienza: l’algoritmo ha bisogno di un paio di settimane di dati prima di dare il meglio.
lead_id salvato per ogni contattoNon per partire. Se il tuo CRM ha già un’integrazione nativa con Meta la scegli allo Step 1; altrimenti bastano un Google Sheet ben fatto e lo script da incollare in Estensioni → Apps Script, con il token salvato nelle proprietà dello script.
Sì. HubSpot, Salesforce, Zoho e altri CRM hanno un partner nativo che puoi scegliere allo Step 1 al posto della Conversions API diretta. Il resto non cambia: stesse fasi del funnel per tutto il team e lead_id salvato per ogni contatto.
L’evento di prova compare in Events Manager entro pochi minuti. Per l’ottimizzazione serve pazienza: l’algoritmo ha bisogno di un paio di settimane di dati prima di dare il meglio, e l’evento scelto deve arrivare ad almeno qualche decina di occorrenze a settimana.
Vuoi capire perché tutto questo conta più di ABO, CBO e test sugli hook? Lo raccontiamo qui: Lead generation su Meta Ads: la struttura perfetta non esiste.
HubSpot, Zoho, il gestionale che usi già o un Google Sheet: partiamo da come oggi i tuoi contatti diventano clienti e da cosa arriva a Meta.