8. Integrazioni — Webhook in uscita
I webhook in uscita permettono a NoviaMind di notificare i tuoi sistemi nel momento in cui i dati CRM cambiano — senza dover interrogare l'API in continuazione. Usi tipici: avviare un workflow n8n / Make / Zapier quando viene acquisito un nuovo prospect, o mantenere sincronizzato uno strumento interno.
Accedi da Integrazioni → Webhook in uscita nella sezione CRM.
8.9 Eventi disponibili
| Evento | Inviato quando |
|---|---|
lead.created | Viene creato un prospect |
lead.updated | Viene aggiornato un prospect |
property.created | Viene creato un immobile |
property.updated | Viene aggiornato un immobile |
realtor.created | Viene creato un agente |
realtor.updated | Viene aggiornato un agente |
Un webhook si iscrive a uno o più eventi — solo quelli attivano una consegna verso il tuo URL.
8.10 Creare un webhook
- Vai su Integrazioni → Webhook in uscita
- Clicca su «Aggiungi webhook»
- Inserisci il tuo URL di callback (deve essere
https://in produzione;http://è accettato solo per test locali, ad es. un tunnel ngrok) - Aggiungi facoltativamente una descrizione (es. «workflow n8n produzione»)
- Seleziona gli eventi a cui iscriverti
- Clicca su «Salva»
⚠️ Salva subito il segreto di firma. Dopo la creazione, NoviaMind mostra il segreto (
whsec_...) una sola volta. Ogni visualizzazione successiva lo mostra mascherato. Se lo perdi, elimina il webhook e creane uno nuovo.
💡 Gli URL che puntano a indirizzi di rete privati o interni vengono rifiutati per motivi di sicurezza.
8.11 Cosa riceve il tuo endpoint
Ogni consegna è una richiesta HTTP POST con un corpo JSON:
E queste intestazioni:
| Intestazione | Contenuto |
|---|---|
X-Webhook-Id | Identificativo univoco della consegna (anche l'id nel corpo) |
X-Webhook-Event | Nome dell'evento (es. lead.created) |
X-Webhook-Signature | sha256=<hex> — firma HMAC-SHA256 del corpo grezzo |
Formato di data per entità
data non è un DTO di risposta curato: è la riga completa del contatto/immobile/agente così com'è memorizzata, quindi può contenere più campi di quelli documentati qui sotto (tratta i campi sconosciuti come compatibili con le evoluzioni future, non rifiutarli) e ogni campo nullable che non usi vale semplicemente null.
lead.created / lead.updated — data è il contatto. Cattura reale (da una chiamata con l'agente IA, con segreti/dati personali accorciati e notes e i blocchi di raccolta dati dell'IA in custom_fields / raw_data troncati per brevità — in pratica notes contiene il riepilogo completo della chiamata e custom_fields.* una voce per ogni campo di raccolta configurato):
💡 Gli identificativi interni di tracciamento delle chiamate vengono rimossi prima che il payload esca da NoviaMind: non vedrai mai un campo
conversation_ids, anche se è una colonna reale del record sottostante.💡
custom_fieldseraw_data.data_collection_resultsderivano entrambi dall'estrazione dei campi da parte dell'IA e si sovrappongono in gran parte (raw_dataè l'estrazione così come è stata catturata in origine;custom_fieldsè ciò che viene effettivamente salvato sul contatto). Ogni voce riportavalue,rationale(perché l'IA ha estratto quel valore) edata_collection_id; alcune voci includono anche un bloccojson_schemache descrive il tipo/enum atteso del campo.valueè spessonullquando l'IA non ha trovato nulla da estrarre per quel campo durante la chiamata.
property.created / property.updated — data è l'immobile:
realtor.created / realtor.updated — data è l'agente:
💡 Le consegne
webhook.test(dal pulsante «Invia test») non corrispondono a nessuna delle forme sopra:dataè semplicemente{ "message": "This is a test webhook delivery from NoviaMind." }.
Verificare la firma
Calcola un HMAC-SHA256 dei byte grezzi del corpo della richiesta (non dell'oggetto ri-serializzato/parsificato: differenze nell'ordine delle chiavi o negli spazi faranno fallire il confronto) con il tuo segreto di firma e confrontalo con l'intestazione X-Webhook-Signature usando un confronto a tempo costante. Esempio Node/Express, supponendo che la route abbia accesso al corpo grezzo (es. express.raw({ type: 'application/json' }) montato solo su questa route, prima di qualsiasi parser del corpo JSON):
💡 In n8n, il nodo Webhook ti fornisce il corpo grezzo tramite la sua opzione dati binari/raw: verificalo in un nodo Code con la stessa logica prima di fidarti di
event.data, oppure mantieni semplicemente segreto l'URL se la verifica della firma non è necessaria per il tuo caso d'uso.
Il tuo endpoint deve rispondere con uno stato 2xx entro 10 secondi. Qualsiasi altra risposta conta come fallimento.
8.12 Testare un webhook
Clicca su «Invia test» sulla riga di un webhook. NoviaMind invia un evento sintetico webhook.test, firmato esattamente come una consegna reale, e ti mostra lo stato HTTP restituito dal tuo endpoint — ideale per validare il tuo workflow n8n o la verifica della firma prima di andare in produzione.
8.13 Nuovi tentativi, errori e disattivazione automatica
- Ogni evento viene consegnato con fino a 5 tentativi e backoff esponenziale.
- La riga del webhook mostra lo stato dell'ultima consegna e il numero di errori consecutivi.
- Dopo 20 errori consecutivi, il webhook viene disattivato automaticamente così un URL morto smette di consumare tentativi di consegna. Sistema il tuo endpoint, poi clicca su «Riattiva».
- Qualsiasi consegna riuscita azzera il contatore degli errori.
Cronologia delle consegne
Clicca su «Cronologia» per vedere le ultime consegne (fino a 50, conservate per 30 giorni): data e ora, evento, stato HTTP e numero di tentativo. Vengono conservati solo i metadati dell'esito — mai il contenuto del payload.
8.14 Gestire i webhook
| Azione | Chi può farlo |
|---|---|
| Vedere webhook e cronologia | Tutti i membri del team |
| Creare, modificare, testare, attivare/disattivare | Amministratori e membri regolari |
| Eliminare | Solo amministratori |
- Attiva / Disattiva: sospendi le consegne senza perdere la configurazione (interruttore su ogni riga).
- Modifica: cambia in qualsiasi momento l'URL, la descrizione o gli eventi sottoscritti. Il segreto di firma non cambia mai.
- Ruotare il segreto: elimina il webhook e creane uno nuovo.
💡 Gli sviluppatori trovano il riferimento API completo (endpoint, schemi, dettagli della firma) nella documentazione API collegata dalla finestra dei webhook.