Funnel e trigger
Un funnel è un grafo. Un'esecuzione è una riga. Un'attesa è un tempo.
Questo è l'intero modello, e ogni proprietà difficile di questo prodotto nasce da queste tre frasi. Modificare un funnel attivo è sicuro grazie a loro. Un retry non può inviare due volte grazie a loro. Chi si disiscrive martedì non riceve nulla giovedì grazie a loro.
Cosa succede davvero quando viene eseguito
La pubblicazione di un funnel scrive una versione immutabile. Qualcuno entra, e appare una riga: un'esecuzione, per questo contatto, agganciata a quella versione, con il nodo corrente, un orario di risveglio e il proprio contesto.
Un worker prende in leasing le esecuzioni il cui orario di risveglio è passato, rivendicandole con SKIP LOCKED così due worker non possono prendere la stessa. Esegue i nodi finché non raggiunge un'attesa o un terminale, poi scrive il prossimo orario di risveglio e rilascia.
Un nodo è una funzione pura dell'esecuzione, del contatto e del nodo — e i suoi effetti vengono commessi nella stessa transazione dell'avanzamento dell'esecuzione. Questa singola proprietà è ciò che rende sicuro un retry. Un worker ucciso nel mezzo secondo tra "invia" e "avanza" lascia o entrambe le cose o nessuna, mai una sola.
E poiché l'app fornisce il tempo invece del database, una riga scritta ora è dovuta ora. Una colonna di pianificazione che usa l'orologio del database non è ancora dovuta nell'istante in cui viene scritta, e perde proprio il tick che l'ha creata — un bug che non sembra nulla finché un messaggio non arriva con un'ora di ritardo.
- 1Leasing
wake_at <= now(),FOR UPDATE SKIP LOCKED. Una coda senza leasing invia due volte per impostazione predefinita. - 2EsecuzioneNodi in ordine finché un'attesa o un terminale. Ognuno scrive un passo: cosa ha deciso, cosa ha emesso.
- 3CommitEffetti e avanzamento, una sola transazione. Questo è tutto il trucco.
- 4SonnoScritto il prossimo
wake_at. Le righe a valle non esistono ancora, e non è necessario che esistano.
Un'esecuzione per contatto per versione
Quattordici trigger
Cosa può avviare un'esecuzione
Alcuni di questi sono cose che fai tu. La maggior parte sono cose che il tuo cliente fa, o non fa — e l'assenza di un'azione è un trigger altrettanto valido dell'azione stessa.
Arrivano
form_submit, list_join, contact_created, tag_added e segment_enter. Un segmento è un predicato live, quindi "entra nel segmento" copre ogni "è diventato" che puoi esprimere — tre ordini, novanta giorni di silenzio, spese oltre una soglia.
Fanno qualcosa
page_visit dallo snippet del sito, message_opened, link_clicked, booking_made e payment_made. L'apertura di un messaggio è essa stessa un evento sul contatto, quindi un funnel può attendere una reazione all'ultima cosa che ha inviato.
Il tempo, o tu
date_field con un offset — un compleanno, un rinnovo, "un anno da", sette giorni prima o tre giorni dopo. schedule per quello ricorrente. manual per l'annuncio che invii perché hai deciso tu.
La tua stessa applicazione
api_event è un evento personalizzato che pubblichi dal tuo codice con il tuo token. Qualsiasi cosa il tuo prodotto sappia diventa un trigger: attivato, ha invitato un collega, ha raggiunto il limite, ha annullato, ha esportato. Questo è quello che trasforma uno strumento di mailing in una parte del tuo prodotto.
Rientro, deciso una volta
Un funnel è rientrante o non lo è, e il database lo impone: una sola esecuzione per contatto per funnel, a meno che tu non abbia detto altro. Lo stesso trigger che scatta due volte nello stesso secondo non può produrre due esecuzioni per sbaglio.
Condizioni di ingresso
Un trigger scatta e la specifica di ingresso decide se questo particolare contatto è idoneo — un predicato di segmento davanti alla porta. Più economico di un nodo condizione sul primo passo, e mantiene il grafico focalizzato su cosa succede anziché su chi può entrare.

Quattordici cose possono avviarlo. Sedici cose possono succedere dopo.
Sedici azioni e sette nodi di flusso
Cosa può fare un funnel, e come decide
Invia qualcosa
send_email, send_sms, send_push, send_letter — quattro canali, un solo grafico — più notify_team quando la persona da avvisare lavora per te.
Modifica il contatto
add_tag, remove_tag, add_to_list, remove_from_list, set_field. Contrassegnare qualcuno lungo la strada è ciò che rende semplice il segmento del prossimo funnel.
Raggiungi l'esterno
http_request verso qualsiasi cosa ti serva, create_payment sul tuo account collegato, e book_slot su una risorsa di prenotazione. Il pagatore resta tuo; nessuno diventa nostro cliente.
Spostati tra funnel
enter_funnel e exit_funnel. Costruisci una sola sequenza di benvenuto e richiamala da quattro punti, invece di mantenere quattro copie che divergono entro marzo.
Genera al momento dell'invio
ai_generate compila le variabili di merge per contatto, misurata sulla tua quota e memorizzata nella cache per hash del creativo e degli attributi del contatto — altrimenti pagheresti per destinatario a ogni singolo invio.
Attendi, dirama, dividi, unisci
wait accetta una durata, una data-ora, un giorno della settimana con orario, o un campo data con offset. condition è un predicato di segmento con un sì e un no. split è A/B/n con pesi. join riunisce i rami.
goal — quello che conta
Un goal termina l'esecuzione per chiunque lo raggiunga. Ha prenotato, ha comprato, ha risposto: il resto della sequenza viene annullato specificamente per lui. Nessuno riceve "ci manchi" il giorno dopo essere tornato, e questo è il nodo che lo impedisce.
throttle e quiet_hours
Throttle regola un picco di invii così che una casella con un limite di frequenza basso non venga martellata fino alla sospensione. Quiet hours trattengono un messaggio fino a un'ora civile — applicate a livello di messaggio, non copiate in ogni ramo del grafico.
Verificato prima di poter essere eseguito
Il validatore rifiuta le stesse cose per te e per l'IA
Un grafico viene verificato prima di poter essere pubblicato, e la verifica non è consultiva. È lo stesso percorso di codice sia che una persona abbia disegnato il funnel sia che un modello l'abbia generato, ed è l'unica ragione per cui i funnel generati sono affidabili.
Esattamente un ingresso
Due nodi di ingresso sono un'ambiguità che nessuno nota finché la metà sbagliata di una lista non riceve la sequenza sbagliata.
Ogni nodo raggiungibile
Un ramo orfano è o un errore o un messaggio che credi in partenza e non parte. Entrambi meritano che te lo dicano.
Un ciclo deve contenere un'attesa
Un loop senza attesa è un loop infinito con un invio in mezzo. Questa regola è la differenza tra un funnel e un incidente.
Ogni invio ha il suo creativo
Un nodo send_email senza creativo e oggetto non può essere pubblicato. Il messaggio con l'oggetto giusto e il corpo vuoto è una modalità di errore reale; viene rifiutato qui.
Ogni variabile è nota
Le variabili di merge vengono validate alla pubblicazione. {{frist_name}} è un refuso che vedi mentre modifichi, non un "Ciao ," che arriva in quarantamila caselle di posta.
Poi simulalo
Esegui una prova a secco di un contatto reale attraverso l'intero grafico e leggi il percorso seguito e ogni messaggio che verrebbe inviato, con il suo giorno. Nulla esce fuori.
I casi scomodi
Sette cose che rompono un motore ingenuo
Ognuno di questi è un test con un orologio deterministico dietro, perché ognuno rompe un'implementazione che sembra perfettamente corretta finché non incontra la realtà.
- 1Una funnel che si ricollega a se stessaLegittimo, comune e corretto — purché il ciclo contenga un'attesa, che il validatore esige.
- 2Qualcuno si disiscrive a metà percorsoLa soppressione viene verificata all'invio, non all'accodamento. Verificarla all'accodamento invia email a chi se n'è andato durante l'attesa.
- 3La funnel viene modificata con diecimila persone dentroLoro continuano a percorrere la versione su cui sono entrati, fino alla fine. I nuovi entrati percorrono la nuova.
- 4Lo stesso trigger scatta due volte in un secondoUna sola esecuzione, perché l'unicità è un indice e non un controllo seguito da un inserimento.
- 5Un contatto viene eliminato a metà esecuzioneL'esecuzione termina. Una cancellazione che lascia una sequenza ancora indirizzata a qualcuno non è una cancellazione.
- 6Un'attesa attraversa un cambio di ora legale"Tre giorni alle nove del mattino" significa le nove del mattino su entrambi i lati del cambio di ora.
- 7Un worker viene ucciso tra l'invio e l'avanzamentoEffetti e avanzamento sono un'unica transazione. O sono avvenuti entrambi o nessuno dei due.
Orologio deterministicoOgni test rompe un'implementazione plausibile
Le campagne sono l'altra metà
Una funnel reagisce. Una campagna è l'invio una tantum: un pubblico, una pianificazione, una limitazione di velocità e un invio. È una cosa di forma diversa ed è tenuta deliberatamente separata, invece di fingere di essere una funnel con un solo nodo.
Due regole la rendono sicura. Un pubblico viene materializzato una sola volta e rifiuta di essere eseguito due volte — risolverlo di nuovo aggiungerebbe silenziosamente tutti coloro che si sono uniti da quando l'invio è iniziato, e l'indice di deduplica lo nasconderebbe impedendo i duplicati che esso stesso ha creato. E i contatori sono ricalcolati dagli eventi di consegna, mai incrementati sul posto, così un webhook ritentato non può gonfiare un report.
Quale usare: se accade per via di qualcosa fatto dal contatto, è una funnel. Se accade per via di una decisione tua, è una campagna. Gran parte dell'automazione marketing sbaglia proprio qui.