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

# Triggers

> Every event that can start an automation, which triggers are tied to a single channel, and how DMLY decides which automation runs.

A trigger is the event that starts an automation. Every automation has exactly one — a message
arriving, a tag being applied, a date coming round, an invoice being paid. Everything else in
the automation is what happens next.

Triggers work the same way in both builders. In the [flow builder](/automation/flow-builder) the
trigger is the first node on the canvas; in a quick automation it is the first thing the form
asks for.

## Read this first: triggers are not all available everywhere

An automation belongs to one [channel](/channels/overview). That decides which triggers you can
pick:

* **Channel triggers** only appear on automations built on that channel. A **Story reply**
  trigger exists only on Instagram; **Cart order received** only on WhatsApp. There is no way to
  put an Instagram trigger on a WhatsApp automation — build a second automation on the second
  channel.
* **Comment triggers only exist on channels that have comments** — Facebook, Instagram and
  TikTok. WhatsApp, Telegram, SMS and Live Chat are message-only, so nothing on those channels
  reacts to a comment. Choosing a comment trigger is also what makes the **Comment actions**
  steps (reply, like, hide, delete) appear in the builder's step palette.
* **Everything else fires on the event, not on the channel.** Contact events, dates, bookings and
  money events don't care which channel the automation sits on. When such an automation sends a
  message, it goes out on the channel the contact was last active on.

When you create a flow, DMLY pre-fills the trigger for most channels — WhatsApp gets **WhatsApp
message**, Telegram gets **Telegram message**, Google Business gets **Google review**. On SMS and
TikTok it doesn't: the node reads **Choose a trigger** and you pick one yourself.

## Channel triggers

### WhatsApp

| Trigger                   | Fires when                                             |
| ------------------------- | ------------------------------------------------------ |
| **WhatsApp message**      | A contact sends a message to your number.              |
| **Customer didn't reply** | A contact doesn't reply to your last message.          |
| **Cart order received**   | A contact sends an order from your WhatsApp catalogue. |
| **Incoming call**         | A contact calls your WhatsApp number.                  |
| **Missed call**           | A call comes in and nobody answers.                    |
| **Call completed**        | A call ends normally.                                  |
| **Call declined**         | A call is rejected.                                    |
| **WhatsApp URL**          | —                                                      |

<Note>
  **Cart order received** is hidden only if your connected WhatsApp number reports that its cart
  is switched off. Otherwise it stays available — an order message can't reach you any other way.
</Note>

### Facebook

| Trigger               | Fires when                            |
| --------------------- | ------------------------------------- |
| **Messenger message** | Someone messages your Page.           |
| **Facebook comments** | Someone comments on your Page's post. |

### Instagram

| Trigger                   | Fires when                               |
| ------------------------- | ---------------------------------------- |
| **Instagram message**     | Someone sends you a DM.                  |
| **Post or Reel comments** | Someone comments on your post or Reel.   |
| **Story reply**           | Someone replies to your story.           |
| **Story mentions**        | Someone mentions you in their story.     |
| **Live comments**         | Someone comments during your live video. |

<Warning>
  **Post or Reel comments** and **Live comments** are not actually separate at runtime. Every
  Instagram comment — on a post, a Reel, or a live video — is matched against both triggers, so a
  **Live comments** automation also answers ordinary post comments and vice versa. Build one of the
  two, not one of each, or the contact gets both replies.
</Warning>

### Telegram, SMS, Live Chat, TikTok and Google Business

| Trigger               | Channel         | Fires when                               |
| --------------------- | --------------- | ---------------------------------------- |
| **Telegram message**  | Telegram        | A contact messages your bot.             |
| **SMS message**       | SMS             | A contact texts your number.             |
| **Live Chat message** | Live Chat       | A visitor sends a message in the widget. |
| **TikTok message**    | TikTok          | Someone sends you a DM.                  |
| **Video comments**    | TikTok          | Someone comments on your video.          |
| **Google review**     | Google Business | A new review lands on your profile.      |

<Note>
  SMS is text-only. An SMS automation can send a message and ask for a reply — no images, no
  buttons — so the builder only offers the steps SMS can actually deliver.
</Note>

## Triggers that work on any channel

These don't belong to a channel. They fire on the event itself.

### Scheduled date

**Scheduled date** fires when a date and time you set arrives — one-off or recurring — and runs
for an audience you choose rather than for one contact who just messaged you.

Use it for a Monday morning reminder, a monthly check-in, or a seasonal offer. If what you want is
a one-off message to a list, a [broadcast](/broadcasts/overview) is the simpler tool; reach for
**Scheduled date** when the message needs branching, a delay, or steps that depend on the contact.

### Birthday / key date

**Birthday / key date** fires when a contact's birthday or another key date arrives. The date
comes from the contact record, so this only reaches contacts who actually have that date filled
in — see [custom fields](/contacts/custom-fields).

### Conversation closed

**Conversation closed** fires when a conversation is marked done or resolved in the
[inbox](/inbox/overview). It's the natural place for a follow-up: a satisfaction question, a
review request, or a tag that feeds a later [segment](/contacts/tags-and-segments).

### Contact events

| Trigger                         | Fires when                                                               |
| ------------------------------- | ------------------------------------------------------------------------ |
| **Contact converted to client** | A contact becomes a client.                                              |
| **Lifecycle stage changed**     | A contact moves to another [lifecycle stage](/contacts/pipeline-stages). |
| **Review request sent**         | A review request goes out to a contact.                                  |

<Warning>
  The trigger picker's Contact tab also lists **New contact**, **Tag applied**, **Tag removed** and
  **Field changed**. Nothing in DMLY raises those events yet: an automation built on one of them
  publishes without complaint and then never runs. Use the triggers in the table above instead.
</Warning>

### Sales, money and bookings

The rest of the list covers the things your business does, and all of it is channel-independent:

<Columns cols={2}>
  <Card title="Store" icon="cart-shopping">
    Shopify and WooCommerce events — **Order placed** through to **Customer milestone**.
  </Card>

  <Card title="Payments" icon="credit-card">
    A payment succeeds, fails, or is refunded.
  </Card>

  <Card title="Invoices, orders and subscriptions" icon="file-invoice">
    Invoice, order and subscription events from the finance module.
  </Card>

  <Card title="Appointments and classes" icon="calendar-check" href="/appointments/overview">
    Bookings and class events — booked, rescheduled, cancelled, no-show.
  </Card>

  <Card title="Offerings and credits" icon="tags">
    Credits issued, used or running low; a coupon redeemed; stock low or back in stock.
  </Card>
</Columns>

## Keywords

Message triggers can be narrowed with keywords, on both builders. This is trigger setup, not a
different kind of bot — there is no separate "keyword bot".

* **With no keywords, the automation replies to every message on that channel.** That's the
  default, and it's the single most common cause of a bot answering when you didn't want it to.
* Matching ignores capitals, and any one keyword matching is enough.
* In the flow builder you also choose how the keyword has to match: **Any message (no keyword
  filter)**, **Message contains a keyword**, **Message is an exact match**, or **Message starts
  with a keyword**. Quick automations have no such choice — a quick automation with keywords always
  matches on *contains*.

<Note>
  **Telegram message** is the exception: the flow builder hides the keyword box on it entirely, so
  a Telegram flow built there answers every message.
</Note>

<Tip>
  Give every catch-all automation on a channel a hard look. One is usually right — a greeter or an
  AI reply. Two is almost always a mistake.
</Tip>

## When more than one automation matches

There is no priority order between automations. **Every** active automation on the channel whose
trigger and keywords match the message will start, and the contact gets every one of those
replies.

DMLY guards against the obvious version of this at publish time: if another automation on the same
channel already answers the same trigger and either both reply to everything or they share a
keyword, publishing is blocked and the message names the other automation.

<Note>
  That check only compares against automations that are **Active** at the moment you publish.
  Switching a **Paused** automation back on doesn't re-run it — so after reactivating one, check
  that nothing else on the channel already answers the same trigger.
</Note>

## Why a trigger didn't fire

<Accordion title="The automation isn't live">
  A trigger is only considered when the automation is **Active** *and* has a published version.
  Saving a draft changes nothing for your customers — see
  [publishing bots](/automation/publishing-bots). Publishing also opens a fresh draft, so what you
  edit next is the *next* version; the live one keeps running until you publish again.
</Accordion>

<Accordion title="The contact is mid-conversation with another flow">
  If the contact is already waiting on a question from any flow, their next message answers *that*
  question instead of starting something new. Only after that message fails to resolve does DMLY
  look for a matching trigger.
</Accordion>

<Accordion title="The bot is paused for that contact">
  When a conversation has been handed to a human, triggers stop starting flows for that contact and
  any flow already running freezes rather than fails — it picks up where it left off once the bot
  is resumed.
</Accordion>

<Accordion title="The contact opted out">
  A contact who texts `stop` (or `unsubscribe`, `cancel`, `quit`, and similar) is opted out, tagged
  **Unsubscribe**, and every running flow for them is cancelled. `start` opts them back in.
</Accordion>

<Accordion title="It already ran for that contact">
  An automation can only have one activation in progress per contact at a time, and a flow set to
  run only once per contact never starts a second time for them.
</Accordion>

<Accordion title="Nothing is arriving on the channel at all">
  If no message reaches the [inbox](/inbox/overview) either, the problem is the channel, not the
  trigger — see [no inbound messages](/channels/no-inbound-messages) and
  [automation not triggering](/troubleshooting/automation-not-triggering).
</Accordion>

## Warnings the builder shows on a trigger

The builder flags a few trigger choices that reliably cause trouble. They're advice, not blocks —
you can still publish.

* **A workspace notification already fires on this event — clients may receive a duplicate.
  Review Notification settings.** Appears on appointment, invoice and payment triggers that DMLY
  already sends its own notification for. Either turn that notification off or don't repeat it here.
* **Store-triggered contacts are usually outside the 24h window — start with a WhatsApp Template
  (or a Checkout Link with a template fallback).** A store event says nothing about when the
  contact last messaged you, and a plain WhatsApp message won't reach them if it's been more than
  a day. See [WhatsApp rules and limits](/channels/whatsapp-limits).
* Stock triggers such as back-in-stock have no single recipient, so the builder asks you to name a
  tag whose contacts should be notified.

## Next

<Columns cols={2}>
  <Card title="Flow builder" icon="diagram-project" href="/automation/flow-builder">
    Build what happens after the trigger.
  </Card>

  <Card title="Templates" icon="wand-magic-sparkles" href="/automation/templates">
    Start from a ready-made automation with its trigger already set.
  </Card>

  <Card title="Publishing bots" icon="rocket" href="/automation/publishing-bots">
    Drafts, versions, and going live.
  </Card>

  <Card title="Common mistakes" icon="triangle-exclamation" href="/automation/common-mistakes">
    The traps that catch most new automations.
  </Card>
</Columns>
