Perché conta: un recapito che non risponde non produce un errore. Produce silenzio. L’ospite ci prova, non ottiene risposta e non ti dice nulla — lo scopri dalla recensione. Tutti i guasti trovati durante la prima implementazione erano di questo tipo: attivi, verdi in dashboard, e completamente muti.
Il principio
- Un numero solo, ovunque. Stesso numero per chat WhatsApp, SMS e chiamate: è il numero frontend. Nessun secondo recapito ospite. Il numero backend su cui vive il voice agent non è un secondo recapito: l’ospite non lo vede mai, e riceve le chiamate per inoltro dal frontend (Numero backend e numero frontend).
- Detto, non solo presente. Il numero va pronunciato e ripetuto: benvenuto, pre-arrivo, giorno del check-in, durante il soggiorno.
- Ogni chiamata persa genera un’azione, non un buco: alert al team più risposta automatica all’ospite.
Prerequisiti
Prima di iniziare devi avere:- Il numero definitivo già collegato come sender WhatsApp e come sender SMS di default del workspace.
- Il numero definitivo come numero pubblico ospite (il frontend), con l’inoltro delle chiamate verso il numero backend dove risponde il VoiceAI. Non è un’opzione, è lo standard: il voice agent resta sempre sul backend, così un cambio di numero pubblico non tocca l’agente vocale.
- Un canale Slack dove il team riceve le escalation.
whatsapp e sms, fermati: tutto il resto poggia su questo.
Stai cambiando il numero frontend? Lato voce cambia solo l’inoltro, dal numero nuovo verso lo stesso backend: il voice agent, le sue istruzioni e il suo fallback non si toccano. Questa pagina è il lato ospite: portare il numero nuovo ovunque c’era il vecchio.
Ordine di esecuzione
L’ordine non è arbitrario. Prima si mette in sicurezza ciò che è già rotto, poi si aggiunge il nuovo.1
Censisci ogni recapito che raggiunge l'ospite
Non fidarti della memoria né della dashboard. Estrai e cerca il numero vecchio in tutte queste superfici:
Fai il grep su un dump locale, non a occhio in dashboard. Su Dubai questa passata ha trovato 162 nodi KB, 41 guardrail e 15 workflow: nessuno di questi elenchi è ispezionabile a mano.
2
Ripara i sender morti prima di aggiungere qualsiasi cosa
Uno step
SEND_MESSAGE che punta a un sender WhatsApp non più collegato non fallisce in modo visibile: il workflow resta ACTIVE, enabled: true, e il messaggio non parte. È la categoria peggiore di guasto.Per ogni step trovato al passo 1, sostituisci provider con il nuovo sender (whatsapp:+<numero>).Controlla anche runOnData: se vale {"type": "direct", "contactId": "..."} il messaggio va sempre a quel contatto, mai all’ospite del trigger. Il valore corretto per un messaggio all’ospite è {"type": "trigger"}.3
Riscrivi il nodo KB del contatto ospite
Deve esistere un solo nodo che dichiara il numero, con scope workspace (
entity_ids: []), perché è un fatto valido per tutti i listing. Se il workspace ospita listing di un’altra città o paese con un numero diverso, l’eccezione va scritta dentro lo stesso nodo, non in un nodo parallelo: due nodi sullo stesso tema confondono la ricerca semantica.Il nodo deve contenere quattro sezioni:- Il numero unico e i canali che copre.
- La frase standard da dire all’ospite, con i momenti in cui ripeterla.
- L’elenco esplicito dei numeri che non vanno mai dati (vecchio numero, numero backend del voice agent, cellulari del team).
- Le eccezioni per listing di altre aree.
4
Aggiorna guardrail e skill dell'agente
Il nodo KB dice qual è il numero. Le guardrail dicono cosa deve fare l’agente. Servono entrambe.Trasforma la guardrail sui contatti da permissiva a prescrittiva: non “può condividere il numero” ma “deve darlo, chiaramente e più di una volta”. Aggiungi nella stessa guardrail il divieto esplicito sui numeri ritirati.Rileggi tutte le skill: quelle che invitano l’ospite a spostarsi su WhatsApp contengono spesso il numero scritto a mano.
5
Fai dire il numero nei messaggi, non solo scriverlo nella KB
Nei punti di contatto lungo il soggiorno il numero va detto a voce alta:
- Step
SEND_AI_MESSAGEeAGENT_INJECTION_MESSAGING: appendi alle istruzioni una riga obbligatoria del tipo “chiudi sempre con: Per qualsiasi cosa scrivici o chiamaci qui: +XX XXX XXX XXXX — rispondiamo 24/7”, specificando di tradurre la frase ma non il numero. - Step
AGENT_INJECTION_PHONEe voice agent: scrivi il numero in lettere, cifra per cifra (es. “tre, nove, uno, …”), perché la sintesi vocale non lo legga come un numero intero.
6
Configura il gruppo di chiamata
Il gruppo di chiamata è ciò che fa squillare le persone reali quando l’AI non basta.Usa
simultaneous: squillano tutti insieme, è la strategia che massimizza la probabilità di risposta. longest_idle distribuisce il carico ma allunga i tempi.Gli member_user_ids sono i campi id (non member_id) di GET /v1/workspaces/{ws}/users.7
Crea il workflow chiamata persa
Trigger
CALL_MISSED, due step in catena:SEND_SLACK_MESSAGEal canale escalation, con nome, numero del chiamante, numero chiamato, sommario, link alla conversazione e l’SLA di richiamata.SEND_MESSAGEall’ospite dal numero unico.
inboxTypeId: "global" e incomingPreference: "incoming": "guest" scarterebbe le chiamate da chi non è ancora mappato come ospite, cioè proprio quelle che non vuoi perdere.Imposta skipUnavailableChannel: true: le chiamate con numero nascosto non hanno un recapito e lo step va saltato, non fatto fallire.8
Popola il fallback del voice agent
Se l’agente vocale non sa risolvere o l’ospite chiede una persona, il trasferimento deve avere una destinazione:
escalation_enabled: trueescalation_type: "static"fallback_phone_number: il cellulare del referente on-ground
schedule. schedule: null significa sempre attivo: è quello che vuoi. Uno schedule con finestre orarie manda in vuoto tutto ciò che arriva fuori orario. Se l’inoltro dal frontend è attivo solo in certe fasce, lo schedule deve coprire almeno quelle stesse ore.Come si verifica
Non dichiarare fatto senza aver rieseguito la ricerca. Quattro controlli, tutti da eseguire davvero:- Nessun residuo. Riesegui il dump del passo 1 e cerca il numero vecchio. Gli unici risultati ammessi sono le regole negative che hai scritto tu (“non dare mai questo numero”) e l’eventuale caller ID in uscita.
-
Recupero semantico. Interroga la KB con la domanda di un ospite vero:
Il nodo del numero unico deve essere il primo risultato con un punteggio alto (su Dubai:
0.906). Se non lo è, il nodo è scritto male o ce n’è un altro che gli fa concorrenza. -
Rilettura dopo ogni scrittura. Ogni
PUT /v1/workflows/{id}crea una nuova versione con nuovi id di step: gli id che avevi in mano prima della scrittura non valgono più. Rileggi il workflow dal server e conta le occorrenze del numero nuovo e di quello vecchio. - Prova dei canali. Chiamata e WhatsApp al numero frontend, ed escalation, da un telefono del team: è la verifica finale dei canali. La configurazione letta dice che il percorso esiste; solo la prova dice che arriva a qualcuno.
GET /v1/workflows/{id}/executions.
Errori che abbiamo già fatto
- Fidarsi dello stato del workflow.
ACTIVE+enabled: truenon dice nulla sul fatto che il messaggio parta. Su Dubai due workflow in produzione puntavano a un sender WhatsApp scollegato. runOnDatacablato. Se il destinatario di uno step è un contatto fisso invece di quello della prenotazione, il workflow manda il messaggio sempre alla stessa persona, con dentro i dati di ospiti diversi. Non produce nessun errore e nessun alert: lo vedi solo aprendo le esecuzioni. Controlla il destinatario di ogni step che invia.- Nome host cablato nel template. Le variabili dei template con un nome di persona scritto a mano restano lì anche quando la persona non lavora più con noi. Controllale a ogni giro.
- Lasciare un numero ritirato come caller ID in uscita. Se il concierge chiama da un numero diverso da quello unico, l’ospite richiama quel numero. Se non ha né voice agent né inoltro, la chiamata si perde in silenzio. Se per qualsiasi ragione il caller ID resta diverso, aggancia comunque quel numero al gruppo di chiamata e assicurati che il workflow chiamata persa lo copra.
Replicare su Italia e sugli studenti
La procedura è identica; cambiano solo tre cose.
Per gli studenti, i passi 3, 4, 5, 7 e 8 sono automatizzabili in fase di provisioning: sono tutte chiamate API con lo stesso payload, parametrizzato sul numero e sul canale Slack dello studente. Il passo 6 richiede oggi un passaggio in dashboard per recuperare l’id del numero.