Test di go-live della campagna Futura
Usa questo runbook prima di lanciare una campagna WhatsApp Futura. Il flusso dipende da definizioni di segmento tipizzate, uno snapshot materializzato dei destinatari, personalizzazione dei template, risposte a bottone normalizzate, gestione del consenso e follow-up manuale con personale dedicato per le risposte interessate.Il pacchetto di lancio durevole BORD-433/BORD-441 vive in
planning/campaigns/futura-launch-runbook.md, planning/campaigns/futura-dry-run-fixtures.json, planning/futura/futura-strategy-templates-compliance.md, e planning/campaigns/bord-431-campaign-journey-scope note.md.Ambito
Il flusso di campagna appena mergiato supporta:- definizioni di audience con targeting
all,tags, osegment; - filtri tipizzati su campi personalizzati per le audience di tipo segment;
- materializzazione dei destinatari in
campaign_recipientsprima del dispatch; - binding del template tramite nome del template approvato o ID template, locale e variabili del corpo;
- ID di risposta a bottone normalizzati per l’instradamento di campagna e journey;
- eventi di opt-out da bottone di campagna scritti nel registro dei consensi;
- azioni di route deterministiche per tag contatto, attributi contatto, conversazioni aperte e opt-out.
start_journey.
Contratto dei metadati di campagna
Le bozze di campagna Futura dovrebbero portare i metadati di campagna v1 insieme alle colonne di campagna legacy. I metadati sono il contratto di go-live che gli operatori rivedono prima della materializzazione.Checklist di preflight
1
Confermare la fonte dell'audience
Scegli
tags per la lista iniziale Futura o segment quando la campagna dipende da attributi del contatto. Evita all a meno che il workspace non abbia esplicitamente approvato un invio a lista completa.2
Validare i filtri di segmento tipizzati
Per le audience
segment, controlla ogni filtro prima della materializzazione. I campi supportati sono tags, name, phone e custom_fields. I campi personalizzati usano la sintassi key=value; i confronti gt e lt devono confrontare valori numerici o di data, sia dalle definizioni dei campi personalizzati sia da valori che vengono interpretati come numeri o date in stile ISO.3
Anteprima del conteggio del segmento
Visualizza in anteprima il segmento nell’app o tramite lo stesso percorso backend usato da
previewSegment. Conferma il conteggio e un campione di contatti rispetto al brief della campagna.4
Verificare il consenso prima dello snapshot
Il materializer salta i contatti il cui
consent_state è opted_out o il cui subscriber_status legacy è unsubscribed. Conferma il conteggio previsto degli opt-out con l’owner della campagna prima di procedere.5
Verificare il binding del template
Conferma che il template WhatsApp sia approvato in Meta e in Switchbord, che il
locale corrisponda al codice lingua approvato, che ogni variabile del corpo abbia una fonte più un fallback, che le value proposition nel corpo usino il grassetto WhatsApp, e che la quick reply di opt-out sia visibile come Stop promozioni o Non scrivermi piuttosto che STOP.6
Congelare le route e i limiti di sicurezza
Conferma che
responseRoutes usi solo gli ID di bottone supportati: futura_not_booked, futura_already_booked e marketing_opt_out. Conferma che le azioni di route non includano start_journey per il lancio MVP. Conferma che launchSafety.maxRecipients sia pari o inferiore alla dimensione di invio approvata.Materializzazione dei destinatari
La materializzazione trasforma la definizione dell’audience in righe durevoli dicampaign_recipients. Considera questo passaggio come lo snapshot dell’audience per l’invio.
Comportamento previsto:
- legge la
audienceDefinitiondella campagna dai metadati v1; - risolve le audience
all, tag o segment all’interno del workspace; - deduplica i contatti per ID;
- salta i contatti opted-out o unsubscribed;
- inserisce nuovi destinatari
queuedcon una chiave univocacampaign_id,contact_id; - aggiorna i metadati della campagna con
materialization.materializedCount,skippedOptOutCount,duplicateCountematerializedAt.
materializedCountcorrisponde al conteggio approvato dopo gli skip per consenso;skippedOptOutCountè spiegabile e diverso da zero solo quando previsto;- una seconda esecuzione di materializzazione segnala duplicati invece di creare destinatari duplicati;
- non sono state create righe
campaign_recipientsper contatti esterni al workspace; - non esistono righe per contatti di test noti come opted-out.
Controlli di dispatch e personalizzazione
Il dispatch della campagna elabora solo i destinatari in statoqueued mentre la campagna è running. Invia in batch e riaccoda campaign.dispatch finché non rimangono destinatari in coda.
Per ogni destinatario di test, verifica:
- esiste o viene creata una conversazione nel canale previsto;
- una riga
messagesin uscita è accodata consend_mode: templateeauthor_label: Campaign; payload.templateNameè il nome del template collegato (bound);payload.templateLocaleè presente quando è configurato un locale;payload.templateComponentsinclude i parametri del corpo nell’ordine dell’indice;contact.first_nameviene risolto prima dacontacts.metadata.first_name, poi dal primo token dicontacts.name, poi dal fallback configurato;- l’anteprima del corpo del messaggio renderizzato sostituisce
{{1}},{{2}}e i placeholder successivi in modo coerente con i componenti del template; - i destinatari opted-out incontrati durante il dispatch vengono segnati come falliti con
error_code: skipped_opt_oute non vengono inviati.
La materializzazione dei destinatari salta in anticipo gli opt-out noti, ma il dispatch riverifica il consenso, così i contatti che fanno opt-out tra la materializzazione e l’invio vengono comunque bloccati.
Normalizzazione delle risposte a bottone
L’elaborazione dei webhook in entrata normalizza entrambi i formati di bottone WhatsApp in un singolo ID di bottone prima della gestione della route:- bottoni di risposta legacy:
message.button.payload; - bottoni interattivi:
message.interactive.button_reply.id; - risposte a lista interattiva:
message.interactive.list_reply.id.
Rifiuta definizioni di route che usano etichette dei bottoni, titoli tradotti, spazi o varianti di maiuscole/minuscole come chiavi. Le route devono usare ID normalizzati, non testo di visualizzazione.
Test di opt-out del consenso
Per il bottonemarketing_opt_out:
- Invia un messaggio di campagna di test a un contatto seed che ha dato il consenso.
- Rispondi toccando il bottone di opt-out, non digitando una parola chiave STOP.
- Conferma che venga scritta una riga
consent_eventsconevent_type: opted_out,source: campaign_button,actor: system, e metadati contenenti ilbuttonIde l’ID del messaggio del provider. - Conferma che il
subscriber_statusdel contatto venga aggiornato aunsubscribede che il contatto non sia più eleggibile per successive materializzazioni di campagna. - Conferma che i tentativi di dispatch successivi saltino il contatto prima di creare un invio Meta.
Follow-up manuale invece di journey avviate dalla campagna
L’esecuzione della risposta di campagna BORD-431start_journey è scope-notata (esclusa) dal lancio MVP. Un’azione di route con type: "start_journey" è accettata dallo schema di dominio ma non viene eseguita come percorso di attach/avvio da campagna a journey. Gli operatori non devono fare affidamento su di essa per il follow-up del lancio Futura.
Usa questo percorso di follow-up manuale:
futura_not_bookedtagga il contatto, registrafutura_response=not_booked, e apre/instrada la conversazione verso le vendite;- un operatore umano rivede la conversazione e invia manualmente la prossima risposta approvata;
futura_already_bookedtagga o segna il contatto come già prenotato e non richiede alcuna journey automatica;marketing_opt_outregistra l’opt-out del consenso e non deve mai attivare un follow-up di marketing.
Checklist operativa di go-live
Prima del lancio in produzione:- I metadati di campagna validano contro lo schema v1.
- L’anteprima del segmento o il conteggio dei tag corrisponde all’audience approvata.
- I filtri tipizzati su campi personalizzati sono stati testati con almeno un contatto seed corrispondente e uno non corrispondente.
- I conteggi della materializzazione dei destinatari sono stati registrati nelle note di lancio.
- Il nome del template approvato, il locale e i fallback delle variabili del corpo sono stati verificati.
- I payload dei componenti del template sono stati ispezionati per almeno due contatti seed.
- Gli ID dei bottoni sono stati testati da WhatsApp, non solo da payload di webhook simulati (mock).
-
marketing_opt_outha creato un evento nel registro dei consensi di tipocampaign_button. - La materializzazione e il dispatch post-opt-out hanno entrambi saltato il contatto seed.
- È stato assegnato personale per il follow-up manuale di
futura_not_bookede delle eventuali risposte opzionalifutura_already_booked. - I metadati delle route di produzione non contengono azioni
start_journey. - I job outbox
campaign.dispatchemessage.dispatchsi sono svuotati senza fallimenti inaspettati. - I conteggi di delivery, letto, fallito e saltato sono stati confrontati con le metriche di dettaglio della campagna.
- L’owner dell’incidente e il punto di decisione per rollback/pausa sono documentati.
Criteri di rollback e pausa
Metti in pausa la campagna e ferma l’elaborazione della coda se accade una di queste condizioni:- la materializzazione include contatti fuori dall’audience approvata;
- i contatti opted-out ricevono messaggi di campagna;
- le risposte a bottone vengono registrate come etichette di visualizzazione invece di ID normalizzati;
- la pianificazione del lancio dipende dall’avvio automatico da campagna a journey prima che BORD-431 sia implementato;
- Meta restituisce errori di policy o template sostenuti nel tempo per il template Futura;
- i fallimenti di delivery superano la soglia concordata dall’owner della campagna.