> ## 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.

# Flow triggers

> What starts an automation: the trigger setup panel, the full trigger catalogue, date-based triggers, trigger filters and re-entry rules.

A **trigger** is the thing a contact does that starts an automation. Every automation has exactly one trigger card at the top of the canvas, and that card can hold several triggers at once.

Every trigger Senderz offers has a real source behind it. There are no placeholder triggers in the picker that quietly never fire.

## Set up the trigger before you build anything

Picking a trigger does not arm the automation. It opens a draft that you configure and then save.

<Steps>
  <Step title="Pick a trigger">
    A new automation shows **Select a trigger to start** on the canvas, with
    the note **Steps unlock after the trigger is set**. The left panel has a
    **Triggers** section with the hint **Profiles enter the flow when this
    happens**.
  </Step>

  <Step title="Configure it in the panel">
    Choosing a trigger opens **Set up trigger** on the right. Work down the
    panel: the trigger list, how often someone can enter, whether this is a
    transactional automation, trigger filters, and profile filters.
  </Step>

  <Step title="Save">
    Nothing counts until you press **Save**. Until you do, the action palette,
    the **+** on each connector and drag-and-drop are all locked.
  </Step>

  <Step title="Build the rest">
    With the trigger saved the palette unlocks and you can add steps.
  </Step>
</Steps>

Clicking the trigger card at any time reopens the same panel. **Change trigger** asks you to confirm first, because it clears the current setup and you pick a new trigger and save again before adding more actions.

<Note>
  Starting from a recommended flow or from an AI proposal skips the lock. Both
  arrive with the trigger already set up, so the palette is unlocked as soon as
  the canvas opens. You can still open **Set up trigger** and change anything.
</Note>

### What is in the panel

| Section                      | What it does                                                                                                      |
| ---------------------------- | ----------------------------------------------------------------------------------------------------------------- |
| Trigger                      | The list of triggers, each with its own settings. **Add trigger** appends another.                                |
| How often can someone enter? | The three re-entry modes, described below.                                                                        |
| Transactional automation     | Marks the whole automation as operational mail rather than marketing.                                             |
| Trigger filters              | **Only when** conditions on the triggering event's own properties.                                                |
| Profile filters              | Who is allowed in at all. This is the automation's audience, and it lives here rather than in the step inspector. |

<Warning>
  **Transactional automation** changes who your messages can legally reach. Its messages go to
  contacts who never opted in to marketing, carry no unsubscribe link, and
  ignore quiet hours, Shabbat and frequency caps. Only use it for order
  updates, receipts and shipping notices. Only a workspace owner or admin can
  turn it on, and Senderz asks you to confirm. Sending advertising this way
  breaks Israeli anti-spam law. See [Israeli
  compliance](/en/compliance/israel).
</Warning>

## Several triggers on one automation

A trigger card can hold more than one trigger. They are combined with OR: a contact enters when **any** of them fires. The panel says so plainly with **Contacts enter when any trigger fires**.

Each trigger in the list keeps its own settings. A custom event carries its own event name, a list trigger carries its own list, a date trigger carries its own date setup, and each one has its own **Only when** conditions.

<Warning>
  Listing the same event twice does not give you two independent copies of it.
  The duplicate is dropped along with its conditions. Keep one entry per event
  and put all of that event's conditions on it.
</Warning>

## The trigger catalogue

The picker has a **Recommended** tab and an **All triggers** tab with a search box. All triggers is grouped into ten categories.

### Profile

| Trigger         | What fires it                                                                                                          |
| --------------- | ---------------------------------------------------------------------------------------------------------------------- |
| Created profile | A new contact is created, from the contacts screen, a storefront popup or form, a store sync, or the event ingest API. |
| Updated profile | A contact's details change, whether you edit them in Senderz or a connected store sends an update.                     |

There is no separate "tag added" trigger. Adding a tag is a change to the contact, so it arrives as **Updated profile**.

### Date based

| Trigger    | What fires it                                                                  |
| ---------- | ------------------------------------------------------------------------------ |
| Date based | A date on the contact's own profile, such as a birthday or signup anniversary. |

This one works differently from every other trigger. See [Date-based triggers](#date-based-triggers) below.

### Lists and subscriptions

| Trigger                 | What fires it                                                                                                                                 |
| ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| Added to list           | A contact is added to a list you choose.                                                                                                      |
| Unsubscribed from email | A contact opts out of email, through the one-click unsubscribe header, the preference center, or an opt-out reported by the sending provider. |
| Unsubscribed from SMS   | A contact replies STOP or opts out of SMS.                                                                                                    |

The two opt-out triggers live in this category rather than a category of their own, so search for "unsubscribed" if you cannot find them.

**Added to list** has a list picker. Leave it empty and the trigger fires on any list join. Pick a list and it only fires for sign-ups that record which list was joined, which today means a Senderz storefront popup.

### Site and browsing

| Trigger        | What fires it                           |
| -------------- | --------------------------------------- |
| Viewed product | A contact views a product on the store. |

This comes from the Senderz tracking that runs on your storefront, which the Shopify app and the WordPress plugin install for you. It only fires once Senderz can tell who the visitor is, which normally means they have already signed up through a popup or clicked a tracked link.

### Orders and checkout

| Trigger            | What fires it                           |
| ------------------ | --------------------------------------- |
| Added to cart      | A contact adds a product to their cart. |
| Checkout started   | A contact starts checkout.              |
| Placed order       | A contact completes an order.           |
| Paid order         | Payment for an order is confirmed.      |
| Fulfilled order    | An order is fulfilled by the store.     |
| Order cancelled    | An order is cancelled.                  |
| Order refunded     | An order is refunded.                   |
| Shipment confirmed | A shipment is confirmed with tracking.  |
| Out for delivery   | A shipment is out for delivery.         |
| Shipment delivered | A shipment is delivered to the contact. |

These come from your connected store. Which of them your store actually sends depends on the platform. See [Shopify](/en/integrations/shopify) and [WooCommerce](/en/integrations/woocommerce).

<Tip>
  Build an abandoned-cart automation on **Added to cart**. There is no trigger
  called "abandoned cart". The trigger fires when the product goes into the
  cart, and the wait step after it is what turns that into abandonment. Placing
  an order removes the contact from cart-recovery automations automatically, so
  buyers stop receiving reminders.
</Tip>

### Reviews

| Trigger                      | What fires it                                      |
| ---------------------------- | -------------------------------------------------- |
| Review request ready         | A reviews app says it is time to ask for a review. |
| Submitted a review           | A contact submits a product review.                |
| Asked or answered a question | A contact asks or answers a product question.      |

These need a reviews app connected. Senderz supports Loox, Judge.me and Yotpo Reviews.

### Loyalty and referrals

| Trigger               | What fires it                                |
| --------------------- | -------------------------------------------- |
| Earned loyalty points | A contact earns loyalty points.              |
| Points expiring soon  | A contact's points are about to expire.      |
| Loyalty tier changed  | A contact moves to a different loyalty tier. |
| Redeemed a reward     | A contact redeems points for a reward.       |
| Referral activity     | A referral is shared, claimed, or completed. |

These need a loyalty app connected. Senderz supports Rivo and Yotpo Loyalty.

### Email engagement

| Trigger              | What fires it                        |
| -------------------- | ------------------------------------ |
| Opened email         | A contact opens an email.            |
| Clicked email        | A contact clicks a link in an email. |
| Bounced email        | An email to the contact bounces.     |
| Marked email as spam | A contact marks an email as spam.    |

### SMS engagement

| Trigger               | What fires it                       |
| --------------------- | ----------------------------------- |
| Delivered SMS         | An SMS is delivered to the contact. |
| Failed to deliver SMS | An SMS fails to reach the contact.  |

### Other

| Trigger      | What fires it                                   |
| ------------ | ----------------------------------------------- |
| Custom event | A custom event you send from your store or app. |

Choosing this adds a **Custom event name** field. Type the same name you send from your integration, for example `quiz_completed`. Only that event starts the automation. See [Event ingest](/en/api-reference/events).

## Date-based triggers

**Date based** is the only trigger that is not started by something happening. Nothing pushes it. Senderz scans your contacts once an hour and enrols anyone whose date is coming up. That is what makes birthdays, renewal reminders and "eight hours before the webinar" possible.

Because it is a scan, it only looks at **live** automations. A date automation left in draft enrols nobody, and no one is caught up retroactively when you publish it.

### Setting one up

<ParamField path="Date field" type="required">
  **Created (signup date)** or any date field on the contact. Custom date
  fields you have defined in your account appear here, searchable.
</ParamField>

<ParamField path="When to send" type="required">
  An amount, a unit of minutes, hours, days, weeks or months, and **before** or
  **after**. Set the amount to `0` and it sends on the date itself.
</ParamField>

<ParamField path="Fire at" type="required">
  **A fixed time of day**, or **The time stored in the date field**. The second
  option uses each contact's own stored time, so the offset counts from their
  exact event time.
</ParamField>

<ParamField path="Send time" type="required">
  The hour and minute, in each contact's local timezone. When **Fire at** is
  set to the field's own time, this is only used as a fallback for contacts
  whose date has no time on it.
</ParamField>

<ParamField path="Repeat" type="required">
  **Once (never repeat)**, **Every month**, or **Every year**.
</ParamField>

### How the timing actually behaves

* **Minutes and hours shift the exact moment.** "8 hours before" a webinar that starts at 19:00 fires at 11:00 on the same day. It can legitimately cross midnight into the day before.
* **Days, weeks and months shift the calendar date and keep the time.** "3 days before" a date lands three days earlier at your chosen send time, and stays correct across daylight-saving changes.
* **Send times are local to the contact.** A 09:00 birthday email reaches each person at 09:00 where they are. Contacts with no timezone on file are treated as Israel time.
* **Short months are clamped.** A yearly repeat on 29 February fires on 28 February in non-leap years. A monthly repeat on the 31st fires on the last day of shorter months.
* **A repeating date can enrol the same contact again next time round.** A yearly birthday automation re-enrols each year even if the re-entry mode is set to enter only once, because each year is a separate occurrence.

<Note>
  Only date fields are offered. If the field you want is not in the list, add
  it as a date-type contact field first, then come back. See
  [Contacts](/en/audience/contacts).
</Note>

## Trigger filters: conditions on the event itself

**Trigger filters** narrow the trigger by looking at the event that just happened. In the panel they read as **Only when**. This is how you build "only orders over 500" or "only 1 to 3 star reviews" without touching who the contact is.

Add them per trigger. All conditions on one trigger must match for the contact to enter.

| Event type            | Conditions offered                                                                        |
| --------------------- | ----------------------------------------------------------------------------------------- |
| Order and cart events | Order amount, Currency, Source                                                            |
| Review events         | Rating, Has photo, Has video, Published, Verified buyer, Product, Question or answer, App |
| Loyalty events        | Points, Tier, Reason, Reminder stage, Referral type, App                                  |

Number conditions offer equals, does not equal, greater than, less than, at least, at most and between. Text conditions offer is, is not, is one of, is not one of and contains.

Senderz also offers any extra properties it has recorded for that event in your workspace, so an event that carries more detail gives you more to filter on. If an event carries nothing you can filter on, the panel says **Trigger filters are not available for this event yet** instead of showing you an empty picker.

<Tip>
  To treat happy and unhappy reviewers differently, build two automations on
  **Submitted a review**, one filtered to a rating of 4 or more and one to 3 or
  less. A conditional split later in the automation will not work for this: a
  split checks the contact, not the event that started the run, so it cannot
  see the rating.
</Tip>

### Trigger filters are not profile filters

These two sit in the same panel and answer different questions.

<CardGroup cols={2}>
  <Card title="Trigger filters" icon="bolt">
    About the **event**. Was this order over 500? Was this review 5 stars? Only
    checked at the moment the event arrives, because the event is a moment in
    time and does not exist afterwards.
  </Card>

  <Card title="Profile filters" icon="filter">
    About the **person**. Are they a VIP? Are they subscribed to SMS? Are they
    in Israel? Checked when they enter, and checked again before each step that
    does something.
  </Card>
</CardGroup>

Profile filters use the same building blocks as a segment: contact properties, consent, metrics, list membership, predictive scores, country and more. See [Segments](/en/audience/segments). Leaving them empty means everyone who fires the trigger can enter.

## How often the same person can enter

**How often can someone enter?** has three options. The default is the first one.

<AccordionGroup>
  <Accordion title="Enter only once" icon="lock">
    A profile can enter this automation a single time, ever. Correct for a
    welcome series. It is also the reason a mistake is expensive: if the
    automation went live with nothing to send, the contacts it already enrolled
    cannot be enrolled again after you fix it.
  </Accordion>

  <Accordion title="Enter every time the trigger fires" icon="rotate">
    A profile re-enters each time the trigger happens again. Correct for
    order confirmations, shipping updates and cart reminders, where every
    occurrence deserves its own run.
  </Accordion>

  <Accordion title="Enter again after a set time" icon="clock">
    A profile can re-enter, but only after the window you set has passed since
    their last entry. Enter a number and choose hours, days or weeks. The
    default is 24 hours and the minimum is 1. Use this for a cart reminder you
    do not want firing several times a day.
  </Accordion>
</AccordionGroup>

<Note>
  A contact who is **currently part-way through** the automation never
  re-enters, whichever mode you pick. Re-entry only applies once they have
  finished or exited.
</Note>

## What does and does not enrol

<AccordionGroup>
  <Accordion title="Only live automations enrol" icon="circle-play">
    A draft or paused automation enrols nobody. Events that happen while it is
    paused are not queued up and replayed when you resume. If you want people
    who qualified earlier, use **Add past profiles** after publishing.
  </Accordion>

  <Accordion title="The same event cannot enrol twice" icon="shield-halved">
    Enrolment is idempotent per event. If a store sends the same order webhook
    twice, or a delivery is retried, the contact is enrolled once.
  </Accordion>

  <Accordion title="Bulk import does not enrol" icon="file-import">
    Importing contacts from CSV, Excel or Google Sheets deliberately does not
    start any automation, no matter how many contacts it creates or updates.
    Uploading a 40,000-row list will not fire a welcome series at all of them.
    See [Importing contacts](/en/audience/import).
  </Accordion>

  <Accordion title="A contact still has to pass the gates" icon="filter">
    Firing the trigger gets someone considered, not delivered to. Profile
    filters decide whether they enter at all, and every message then goes
    through consent, suppression, frequency caps and, for SMS and push, the
    Israeli quiet hours and Shabbat window. See [Quiet hours and
    Shabbat](/en/compliance/quiet-hours).
  </Accordion>

  <Accordion title="There is no calendar-schedule trigger" icon="calendar-xmark">
    Nothing fires for your whole audience at a fixed date and time. **Date
    based** is anchored to a date on each contact's own profile. For a one-time
    dated send, use a [campaign](/en/messaging/campaigns) instead.
  </Accordion>
</AccordionGroup>

## Publishing

An automation cannot be published without at least one trigger. If you see a message that a trigger is required, open the trigger card, make sure at least one trigger is listed, and press **Save** in the setup panel before publishing again.

Return to [Automations](/en/messaging/flows) for the rest of the build.
