Funis e disparadores
Un funil é un grafo. Unha execución é unha fila. Unha espera é un tempo.
Ese é o modelo enteiro, e cada propiedade difícil que ten este produto sae desas tres frases. Editar un funil en vivo é seguro grazas a elas. Un reintento non pode enviar por duplicado grazas a elas. Unha persoa que se dá de baixa o martes non escoita nada o xoves grazas a elas.
O que ocorre realmente cando se executa
Publicar un funil escribe unha versión inmutable. Alguén entra, e aparece unha fila: unha execución, para este contacto, fixada a esa versión, que contén o nodo actual, unha hora de espertar e o seu propio contexto.
Un worker arrenda as execucións cuxa hora de espertar xa pasou, reclamándoas con SKIP LOCKED para que dous workers non poidan coller a mesma. Executa nodos ata chegar a unha espera ou a un terminal, e despois escribe a seguinte hora de espertar e solta.
Un nodo é unha función pura da execución, do contacto e do nodo — e os seus efectos comprométense na mesma transacción que o avance da propia execución. Esa única propiedade é o que fai seguro un reintento. Un worker morto no medio segundo entre "enviar" e "avanzar" deixa ambos ou ningún, nunca só un.
E como a aplicación fornece o tempo en vez da base de datos, unha fila escrita agora vence agora. Unha columna de programación que usa por defecto o reloxo da base de datos aínda non vence no instante en que se escribe, e perde o mesmo tick que a creou — un erro que non parece nada ata que unha mensaxe chega unha hora tarde.
- 1Arrendamento
wake_at <= now(),FOR UPDATE SKIP LOCKED. Unha cola sen arrendamentos envía por duplicado por defecto. - 2ExecuciónNodos en orde ata unha espera ou un terminal. Cada un escribe un paso: o que decidiu, o que emitiu.
- 3ConfirmarEfectos e avance, nunha transacción. Este é todo o truco.
- 4RepousoEscríbese o seguinte
wake_at. Aínda non existen filas posteriores, e non fai falta ningunha.
Unha execución por contacto e por versión
Catorce disparadores
O que pode iniciar unha execución
Algunhas destas son cousas que fas ti. A maioría son cousas que fai —ou non fai— o teu cliente, e a ausencia dunha acción é tan boa disparadora como a acción mesma.
Chegan
form_submit, list_join, contact_created, tag_added e segment_enter. Un segmento é un predicado en vivo, así que "entra no segmento" cobre cada "pasou a ser" que poidas expresar — tres pedidos, noventa días en silencio, gasta máis dun limiar.
Fan algo
page_visit desde o fragmento do sitio, message_opened, link_clicked, booking_made e payment_made. Que se abra unha mensaxe é en si un evento no contacto, así que un funil pode esperar unha reacción á última cousa que enviou.
O tempo, ou ti
date_field cun desfase — un aniversario, unha renovación, "un ano desde", sete días antes ou tres días despois. schedule para o recorrente. manual para o anuncio que envías porque decidíchelo ti.
A túa propia aplicación
api_event é un evento personalizado que publicas desde o teu propio código co teu propio token. Calquera cousa que saiba o teu produto convértese en disparador: activouse, convidou a un colega, alcanzou o límite, cancelou, exportou. Este é o que converte unha ferramenta de correo en parte do teu produto.
Reentrada, decidida unha vez
Un funil é reentrante ou non o é, e a base de datos impóneo: unha execución por contacto e por funil a menos que dixeras outra cousa. O mesmo disparador que se activa dúas veces no mesmo segundo non pode producir dúas execucións por accidente.
Condicións de entrada
Un disparador actívase e a especificación de entrada decide se este contacto en concreto é elixible — un predicado de segmento diante da porta. Máis barato que un nodo de condición no primeiro paso, e mantén o grafo centrado no que ocorre en vez de en quen ten permiso para entrar.

Catorce cousas poden iniciarlo. Dezaseis cousas poden ocorrer despois.
Dezaseis accións e sete nodos de fluxo
O que pode facer un funil, e como decide
Enviar algo
send_email, send_sms, send_push, send_letter — catro canles, un grafo — ademais de notify_team cando a persoa á que hai que avisar traballa contigo.
Cambiar o contacto
add_tag, remove_tag, add_to_list, remove_from_list, set_field. Marcar a alguén sobre a marcha é o que fai sinxelo o segmento do seguinte funil.
Alcanzar o exterior
http_request a calquera cousa que queiras, create_payment contra a túa propia conta conectada, e book_slot contra un recurso de reservas. O pagador segue sendo teu; ninguén se converte en cliente noso.
Moverse entre funis
enter_funnel e exit_funnel. Constrúe unha secuencia de benvida e chámaa desde catro sitios, en vez de manter catro copias que diverxen en marzo.
Xerar no momento do envío
ai_generate enche as variables de fusión por contacto, contabilízase contra a túa cota e gárdase na caché por hash de creatividade e atributo de contacto — se non, pagarías por destinatario en cada envío.
Esperar, ramificar, dividir, unir
wait acepta unha duración, unha data e hora, un día da semana con hora, ou un campo de data cun desprazamento. condition é un predicado de segmento con un si e un non. split é A/B/n con pesos. join volve xuntar as ramas.
goal — o que importa
Un obxectivo remata a execución para calquera que o alcance. Reservou, comprou, respondeu: o resto da secuencia cancélase especificamente para esa persoa. Ninguén recibe «echámoste de menos» ao día seguinte de volver, e este é o nodo que o evita.
throttle e quiet_hours
O throttle regula unha ráfaga para que unha caixa de correo con límite baixo de taxa non se sature ata quedar suspendida. As horas de silencio retéñen a mensaxe ata unha hora civilizada — aplícanse na capa de mensaxe, non se copian en cada rama do grafo.
Comprobado antes de poder executarse
O validador rexeita o mesmo para ti e para a IA
Un grafo compróbase antes de poder publicarse, e a comprobación non é orientativa. É o mesmo camiño de código tanto se unha persoa debuxou o funil como se o xerou un modelo, e esa é a única razón pola que os funis xerados son dignos de confianza.
Exactamente unha entrada
Dous nodos de entrada son unha ambigüidade que ninguén nota ata que a metade equivocada dunha lista recibe a secuencia equivocada.
Todos os nodos accesibles
Unha rama orfa é ou ben un erro ou ben unha mensaxe que cres que sae e non sae. Ambas as cousas merecen que te avisen.
Todo ciclo debe conter unha espera
Un bucle sen espera dentro é un bucle infinito cun envío no medio. Esta regra é a diferenza entre un funil e un incidente.
Cada envío ten a súa creatividade
Un nodo send_email sen creatividade nin asunto non pode publicarse. A mensaxe co asunto correcto e un corpo baleiro é un fallo real; rexeítase aquí.
Toda variable é coñecida
As variables de fusión validáanse ao publicar. {{frist_name}} é un erro tipográfico que ves mentres editas, non un «Ola ,» chegando a corenta mil caixas de entrada.
Despois simúlao
Fai unha proba en seco cun contacto real por todo o grafo e le o camiño seguido e cada mensaxe que se enviaría, co seu día. Nada sae fóra.
Os casos incómodos
Sete cousas que rompen un motor ingenuo
Cada unha destas é unha proba cun reloxo determinista detrás, porque cada unha rompe unha implementación que parece perfectamente correcta ata que se atopa coa realidade.
- 1Un funil que se repite en bucle sobre si mesmoLexítimo, común e correcto — sempre que o ciclo conteña unha espera, o que o validador esixe.
- 2Alguén dá de baixa a medio camiñoA supresión compróbase no envío, non ao encolar. Comprobar ao encolar envía correo ás persoas que se foron durante a espera.
- 3Edítase o funil con dez mil persoas dentroSeguen percorrendo a versión pola que entraron, ata o final. Os novos entrantes percorren a nova.
- 4O mesmo disparador actívase dúas veces nun segundoUnha execución, porque a unicidade é un índice e non unha comprobación seguida dunha inserción.
- 5Elimínase un contacto a medio camiñoA execución remata. Unha supresión que deixa unha secuencia aínda dirixida a alguén non é unha supresión.
- 6Unha espera abrangue un cambio de horario de verán"Tres días ás nove da mañá" significa as nove da mañá a ambos lados do cambio de hora.
- 7Un worker morre entre o envío e o avanceOs efectos e o avance son unha soa transacción. Ou aconteceron os dous, ou non aconteceu ningún.
Reloxo deterministaCada test rompe unha implementación plausible
As campañas son a outra metade
Un funil reacciona. Unha campaña é a emisión puntual: unha audiencia, unha programación, un limitador e un envío. É unha cousa de forma distinta e mantíñase deliberadamente separada en vez de finxir que é un funil cun só nodo.
Dúas regras fan que sexa seguro. Unha audiencia materialízase unha vez e négase a executarse dúas — resolvela de novo engadiría silenciosamente a todos os que se uniron desde que comezou o envío, e o índice de deduplicación ocultaríao ao impedir as duplicidades que el mesmo creou. E os contadores recalcúlanse a partir dos eventos de entrega, nunca se incrementan no sitio, así que un webhook reintentado non pode inflar un informe.
Cal usar: se acontece por algo que fixo a persoa, é un funil. Se acontece por algo que ti decidiches un martes, é unha campaña. Unha cantidade sorprendente de automatización de marketing vai mal por forzar a segunda na forma da primeira.