> ## Documentation Index
> Fetch the complete documentation index at: https://docs.senderz.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Flows & automation

> Triggered, multi-channel automations that react to store and contact events forever.

A **flow** is an automation that reacts to an event and runs a sequence of steps — messages, wait timers and branches — for every contact that triggers it. Flows reuse the send pipeline, so they never re-implement suppression, consent, caps, quiet hours, DKIM or the SMS wallet.

## Anatomy of a flow

<CardGroup cols={2}>
  <Card title="Trigger node" icon="bolt">
    One entry node with one or more triggers. A contact enters when any of
    them fires.
  </Card>

  <Card title="Message nodes" icon="paper-plane">
    Email, SMS, push and voice. Each can set its own sender name/address and
    template.
  </Card>

  <Card title="Wait timers" icon="hourglass">
    Delay before the next step.
  </Card>

  <Card title="Conditions" icon="code-branch">
    Branch on the segment filter — first edge is "yes", second is "no".
  </Card>
</CardGroup>

## Triggers

Every trigger in the catalog has a live producer — there are no decorative triggers. Highlights:

| Category   | Triggers                                                                                                                                                   |
| ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Contact    | `contact_created`, `contact_updated`, `list_joined`                                                                                                        |
| Store      | `abandoned_cart`, `checkout_started`, `product_viewed`, `order_placed`, `order_paid`, `order_fulfilled`, `order_cancelled`, `order_refunded`, `shipment_*` |
| Engagement | `email_opened`, `email_clicked`, `email_bounced`, `email_complained`, `sms_delivered`, `sms_failed`                                                        |
| Opt-out    | `email_unsubscribed`, `sms_unsubscribed`                                                                                                                   |
| Custom     | `custom_event` (from the [event ingest API](/en/api-reference/events))                                                                                     |

<Note>
  A flow can have **multiple triggers** on its single entry node. Bulk CSV
  import deliberately does not enrol contacts into flows.
</Note>

## Audience & exit rules

* **Audience** (entry gate) — a custom filter plus saved segments, combined with AND. A contact enters only if it matches. Empty means everyone.
* **Exit rules** — evaluated every tick. Custom filter + segments combined with OR, plus three toggles: unsubscribed, spam complaint, and "after 30 days in flow".

## Per-recipient event data in templates

Flow email and SMS templates can use per-enrollment merge tags from the triggering event — `{{amount}}`, `{{currency}}`, `{{orderId}}`, `{{recoveryUrl}}`, `{{sourceName}}` and any custom-event property. Identity and compliance tags (`{{firstName}}`, `{{unsubscribeUrl}}`) are reserved and can't be shadowed by event data.

<Info>
  `{{amount}}` is a major currency unit (e.g. `249.90`), taken straight from
  the event.
</Info>

## Execution model

The engine advances one node per tick. Idempotency is claimed before any send, so a re-tick can't double-send. Cyclic graphs are bounded by a max-step cap. Paused flows halt with no auto-resume.

A key safety behaviour: placing an order **force-exits** cart-recovery flows, so a customer who buys stops receiving abandoned-cart reminders.

## Best practices

<AccordionGroup>
  <Accordion title="Set an exit condition" icon="door-open">
    Add "order placed" or a purchase segment to your abandonment flows so
    converters leave immediately.
  </Accordion>

  <Accordion title="Respect the channel" icon="scale-balanced">
    SMS and voice steps to Israeli numbers honour quiet hours — a wait timer
    landing at 02:00 will defer, not send.
  </Accordion>

  <Accordion title="Use conditions, not many flows" icon="code-branch">
    Branch inside one flow rather than duplicating flows per segment.
  </Accordion>
</AccordionGroup>
