Workflow triggers
The 34 events a workflow can start from — what each one actually watches, what it exposes to conditions and messages, and where it quietly does nothing.
Getting here
Automate → Workflows, open or create a workflow, then click the trigger card at the top of the canvas to pick or change it.
Before you start
- An owner, admin or agent can pick a trigger and save the workflow as a draft. Publishing — the thing that makes it run on live conversations — is an owner or admin action.
- Building and running workflows depends on your plan; see pricing.
- A trigger that reads from an ad platform or another integration (Click-to-Chat Ads, TikTok Messaging Ads) needs that connection in place before the workflow can be published — the workflow can still be built and tested without it.
How it works
- A workflow has exactly one trigger. To react to a second kind of event, build a second workflow, or have this one hand off to another with Trigger Another Workflow.
- Most triggers carry their own scope — an ad id, a tag, a channel list — so a workflow only starts for the slice of events it names. Message Received can also be narrowed this way, with its own Channels picker; picking at least one channel, or adding a Trigger Condition, is what saving it as Published requires (see Test and publish).
- Every trigger's own Trigger Conditions (separate from a Condition step further into the flow — see Conditions and variables) are checked after the trigger's own scope and before the workflow runs: by default every condition must pass, or set Match any condition so one is enough.
- Most triggers fire the moment the underlying event happens — a message, a form submission, a booking, a lifecycle change. Six are read on a recurring scan instead: Deal Stage Changed, Event Reminder, Read, No Reply and Booking Reminder about once a minute, Contact Inactive and Contact Date Reached about every ten minutes — each trigger's own entry says which, when it matters to how quickly it fires.
- More than one published, enabled workflow can share the same trigger type; a matching event runs every one of them that qualifies, independently.
- A trigger will not re-run the SAME workflow on the SAME conversation inside a rolling 10-minute window of its own last run there — a second message, or a second unrelated event of that trigger's type, a moment later does not start a second run. Several triggers avoid this because they name each event with their own identity instead: a call, an order event, a deal-stage move, a tracking.my milestone, a booking reminder offset, a crossed video threshold, a Read, No Reply silence and each Shortcut press each get their own run regardless of timing. A link click runs once per link per conversation. A tag or field change is named too, so different tags or fields each start a run, but the same tag added (or removed) again, or the same field changed again, inside one 10-minute block runs once. Contact Inactive and the date-based triggers use an entirely separate once-per-episode system of their own, outside this cooldown altogether. The rest — mostly the inbound-message-shaped triggers, plus Form Submitted, Lifecycle Updated, Booking Created, Booking Status Changed, Event Reminder, Event Registration Changed, Incoming Webhook, Conversation Closed and Payment Slip Received — share the plain per-conversation cooldown described here.
When it fails
- A trigger event for a workspace with no published, enabled workflow of that type simply does nothing — nothing is queued for later, and nothing is logged as a miss.
- A trigger whose target conversation cannot be resolved (no matching contact, no conversation to run on) is skipped for that event — see each trigger's own entry for what it needs to resolve one.
- Publishing Message Received with no channel chosen and no Trigger Condition is refused; the message names a condition to add. See Test and publish.
Limits
- This article covers the 34 trigger types the picker offers. A step's own outcome partway through a flow (a question answered, a template delivered) is not a trigger of its own — read it with a condition placed after that step.
- A scan-based trigger is not instant: read each entry's own cadence before building something that assumes it fires the moment the underlying event happens.
- The trigger's own Trigger Conditions only see what that trigger exposes plus the contact/channel/conversation fields available everywhere — a field another trigger exposes is not there to read.
Message Received
message_received
Starts the workflow when a customer sends a message on one of your connected channels. Only a message the customer wrote counts: a reply from a teammate, the AI agent or another workflow never starts it, so a workflow that sends a message cannot start itself.
The same workflow runs at most once per conversation in any 10-minute stretch. A customer who sends five messages in a row starts it once; a message that arrives after that stretch has passed starts it again.
Message Received is the last inbound trigger to be offered a message. If an ad, New Contact, Conversation Opened, Instagram story or payment-slip workflow has already replied to the customer or queued a reply, or an Ask a Question step was waiting and took the message as its answer, Message Received does not run for that message.
For a one-time welcome use Conversation Opened instead. Here, narrow the trigger with Trigger Conditions or switch on Trigger once per contact, or a returning customer is greeted again.
- Channels
- Which connected numbers, pages or accounts the workflow listens on.
- Default: All channels
- Limits: Choose Only these channels to restrict it; the list shows your connected channels.
- Trigger Conditions
- Rules a message must pass before the workflow starts, such as a word in the message text or a tag on the contact.
- Default: no conditions — every matching message starts the workflow
- Limits: Checked before the workflow takes its turn on the conversation, so a message that fails the rules does not use that turn up; the next message is checked afresh.
- Trigger once per contact
- Never starts again for a contact this workflow has already run for, in any of their conversations.
- Default: off
- Limits: Found under Advanced Settings. Any earlier run counts, including one whose steps failed.
- It does not start for a message Inchat can only show as a placeholder (an unsupported message type), for a blocked contact, or a second time for a message Inchat has already saved — a webhook delivered twice starts the workflow once.
- Where the AI is paused, or a teammate has taken over through Inchat, only workflows made entirely of record-keeping steps run — tags, assignment, tasks, contact fields, status and the like. Where a teammate has replied through Meta's own Page Inbox instead, no AUTOMATIC workflow runs at all on that conversation, not even a record-keeping one — an agent can still run a Shortcut by hand, which is a separate, manual path.
Conversation Opened
conversation_created
Starts the workflow when a customer writes and has no open conversation on that channel, so Inchat opens a new one. It is the right trigger for a welcome message or an opening menu.
That happens on a customer's very first message, and again on the first message after their previous conversation was closed, so a returning customer can start it a second time. To greet only people who have never written before, use New Contact.
It is offered the message after Click-to-Chat Ads and New Contact. If a workflow on either has already replied to the customer or queued a reply, Conversation Opened does not run for that message.
On Messenger, a returning person who opens their thread from an ad or a link without sending anything can also open a conversation, and this trigger runs then too.
- Channels
- Which connected numbers, pages or accounts the workflow listens on.
- Default: All channels
- Limits: Choose Only these channels to restrict it.
- How the customer arrived
- Limits the workflow to conversations that began a certain way. Clicked an ad is a click-to-chat ad, Clicked a post is the message button of a boosted or organic post, and Came in directly is everything else — a typed number, a link or a QR code.
- Default: all three ticked
- Limits: At least one stays ticked, and ticking all three is the same as no restriction. A Click-to-Chat Ads workflow that answers first still takes the conversation.
- Trigger once per contact
- Never starts again for a contact this workflow has already run for, in any of their conversations.
- Default: off
- Limits: Found under Advanced Settings. Switch it on when only the first conversation should get the welcome.
- It starts only from something the customer sends or, on Messenger, opens. A conversation a teammate starts from the Inbox, or one a workflow starts, does not start it.
- A customer whose conversation is still open does not start it again; their later messages go to Message Received.
Comment Received
comment_received
Starts the workflow when someone comments on a Facebook or Instagram post, Reel or ad on your connected accounts. You can narrow it to particular posts and to comments that contain particular words.
The workflow's steps run only when the commenter already has an open conversation with you on that channel. A commenter who has never messaged you has no conversation for the steps to run in.
In that case the one step that still runs is Private Reply to Comment: its message is sent as the comment's private reply, and its optional public reply text is also posted under the comment, but the workflow's other steps do not run. Meta allows only one private reply per comment, so the channel's own fixed comment reply is not sent when a matching workflow owns it.
On Instagram the commenter's comment identity usually doubles as their messaging identity, so people who have messaged you before are recognised; on Facebook the two usually differ, so a Facebook commenter is rarely matched to an existing conversation.
- Only when the comment says
- Words, separated by commas; one is enough. They match whole words, ignoring case, so
pricematches “Price?” but not “priceless”. A word written without spaces, such as a Chinese, Japanese or Thai word, matches anywhere in the comment. - Default: empty — every comment
- Limits: Up to 30 words.
- Only under these posts
- Posts, Reels or ads, chosen with Pick from recent posts or pasted by id. Choosing a post also covers an Instagram ad made from it, and a Facebook post id matches with or without the page prefix.
- Default: any post, Reel or ad on the connected accounts
- Limits: Up to 20 posts. Together with the words above, both must match.
- Channels
- Which connected pages or accounts the workflow listens on.
- Default: All channels
- A commenter whose conversation with you is closed counts as having no conversation.
- The same workflow runs at most once per conversation in any 10-minute stretch, so a second comment from the same person on another post inside it does not start it again.
- A comment the Facebook Page itself makes, including the public reply a workflow posted, never starts it.
Instagram Story Reply
story_reply
Starts the workflow when someone replies to one of your Instagram stories. The reply arrives as a message, and the workflow can read its text and which story it answers.
Story Reply is offered the message before Message Received. If a Story Reply workflow replies to the customer or queues a reply, Message Received is skipped for that message; if no Story Reply workflow matches, or the ones that matched send nothing, Message Received still runs on it.
A welcome does not hold it back: on a customer's first message, a New Contact or Conversation Opened workflow runs first and this trigger still runs after it, so the customer can receive both.
- Channels
- Which connected Instagram accounts the workflow listens on.
- Default: All channels
- Instagram only; Messenger never sends story replies.
- The same workflow runs at most once per conversation in any 10-minute stretch.
- Like every inbound trigger, it does not run for a blocked contact. Where the AI is paused, or a teammate has taken over through Inchat, only workflows made of record-keeping steps run; where a teammate replied out-of-band through Meta's own Page Inbox, no automatic workflow runs at all (an agent can still run a Shortcut by hand).
Instagram Story Mention
story_mention
Starts the workflow when someone mentions your Instagram account in their own story — a good moment to thank them or send a code.
A mention arrives as a message, so the workflow runs on that person's conversation with you and can read the link to the story. Unlike a reply, a mention carries no story id.
It works like Story Reply: it is offered the message before Message Received, and if a Story Mention workflow replies or queues a reply, Message Received is skipped for that message.
- Channels
- Which connected Instagram accounts the workflow listens on.
- Default: All channels
- Instagram only.
- The same workflow runs at most once per conversation in any 10-minute stretch.
- Instagram stories expire, and the link is expected to stop working once the story does — use it in the moment rather than saving it.
New Contact
contact_created
Starts the workflow the first time a person writes on a channel and Inchat has no contact for them yet. It is the trigger for offers meant only for first-time customers.
It runs after Click-to-Chat Ads and before Conversation Opened. If an ad workflow has already replied to the customer or queued a reply, New Contact does not run for that message; and if New Contact replies, Conversation Opened stays quiet.
Contacts are per channel: the same person writing for the first time on a second connected channel is a new contact there, unless the two are already merged or linked as one person.
A contact you imported who then writes to you on WhatsApp for the first time does not start it: Inchat matches their number to the imported row and treats them as an existing contact.
- Channels
- Which connected numbers, pages or accounts the workflow listens on.
- Default: All channels
- How the customer arrived
- Limits the workflow to people who arrived a certain way: Clicked an ad, Clicked a post, or Came in directly.
- Default: all three ticked
- Limits: At least one stays ticked.
- It starts only from a message the customer sends. A contact you add by hand or import does not start it.
- An imported contact is treated as existing only on WhatsApp, and only when exactly one imported contact has that exact number; if two do, Inchat creates a new contact and this trigger starts.
Click-to-Chat Ads
ad_referral
Starts the workflow when a customer arrives from a click-to-chat ad. The ad's details travel with the customer's message, so the workflow starts when that message arrives, not at the moment of the click.
It is offered the message first. If an ad workflow replies or queues a reply, New Contact, Conversation Opened and Message Received stay quiet for that message, so the customer gets the ad's welcome and not a generic one as well.
It also runs for a returning customer who arrives from another ad, and on Messenger when a returning person opens the thread from an ad without sending anything. The conversation's first-touch attribution stays with the first ad.
- Which ads
- All ads starts the workflow from any ad. Selected ads starts it only when the chat comes from one you ticked.
- Default: All ads
- Limits: Up to 200 ads. Picking Selected ads and ticking none behaves like All ads.
- Ad account
- With Meta Ads connected under Settings → Integrations, pick an ad account and tick ads from its campaign, ad set and ad list. Without it, the list shows only ads that have already started a conversation with you.
- Limits: Ads are matched on their ad id alone, so a selection can span several ad accounts. An ad that has not started a conversation yet appears only when Meta Ads is connected.
- Channels
- Which connected numbers or pages the workflow listens on.
- Default: All channels
- It needs a connected WhatsApp, Messenger or Instagram channel. Without one the drawer shows No Meta Business account connected and the workflow cannot be published.
- Only a chat that carries an ad reference starts it. Someone who typed your number, or came from a link with no ad id, does not.
- A click on the message button of a boosted or organic post carries a post id in the same place as an ad id and also starts it; How the customer arrived on Conversation Opened tells the two apart.
- The drawer offers no Trigger Conditions for this trigger, because the ad is the entry. Conditions saved on an older workflow still apply, and the drawer says so with a way to remove them.
- The same workflow runs at most once per conversation in any 10-minute stretch.
- A TikTok chat never starts it; that is TikTok Messaging Ads.
TikTok Messaging Ads
tiktok_ad_referral
Starts the workflow when a chat begins from a TikTok Messaging Ad, and can be limited to particular ads. It needs a TikTok ads account connected under Settings → Integrations: until then the drawer shows No TikTok ads account connected and the workflow cannot be published.
The trigger also needs TikTok chats to reach Inchat, and that channel is not available yet: TikTok Business Messaging is listed as coming soon and Inchat does not yet receive its messages. Until it opens, a workflow on this trigger has no chat to start it.
It is built the same way as Click-to-Chat Ads for TikTok chats: it needs a real ad id on the chat, and Click-to-Chat Ads never starts for a TikTok chat.
- Which ads
- All ads starts the workflow from any ad. Selected ads starts it only when the chat comes from one you ticked.
- Default: All ads
- Limits: Up to 200 ads. Picking Selected ads and ticking none behaves like All ads.
- Advertiser
- With TikTok ads connected, pick an advertiser and tick ads from its campaign, ad group and ad list. Otherwise the list shows only ads that have already started a TikTok conversation with you.
- Not available until TikTok Business Messaging is: today Inchat has no way to receive those chats, so nothing starts this trigger.
- The drawer offers no Trigger Conditions for this trigger, because the ad is the entry.
Contact Inactive
conversation_inactive
Starts the workflow when a customer on WhatsApp has not written for the number of days you set. The days are counted from the customer's last message, and the workflow runs once for each silence: it can run again after the customer writes and then goes quiet again.
Inchat checks about every ten minutes, so a conversation is picked up on the first check after its silence reaches the number of days, later when many conversations come due at once.
The silence is always at least a day, so free-form messages are normally outside WhatsApp's 24-hour window and the workflow should send an approved template with Send WhatsApp Template. This trigger's day-count only ever moves for a message, or for a call the CUSTOMER placed that went unanswered — that still counts as them reaching out and pushes the count back the same way a message would. An answered call, from either side, does not move this count (whatever it does to the reply window), and a call your business places that the customer never picks up (no_answer) has no effect on this trigger at all.
- Days of silence
- How many whole days without a customer message before the workflow starts.
- Default: 3
- Limits: From 1 to 365 days; saving is refused outside that range.
- WhatsApp only. A Messenger or Instagram conversation never starts it, however long it has been quiet.
- Closed conversations are skipped, and so is a conversation where the customer never sent a message.
- There is no Channels picker and no Trigger once per contact switch for this trigger. To limit it to one number, add a Trigger Conditions rule on the channel.
- Trigger Conditions are checked after the silence has been claimed. If the rules do not match when Inchat reaches the conversation, that silence is used up and the workflow does not try it again until the customer writes and goes quiet again.
- A conversation a teammate holds, or where the AI is paused, is not claimed when the workflow would message the customer, and is looked at again on later checks. A contact with no phone number, or a channel with no number id, is skipped the same way.
Read, No Reply
read_no_reply
Starts the workflow when a customer has read your last message and has not replied within the minutes you set, counted from the read receipt. The message must be one the customer can have read: an internal note, a failed send and a message still being sent do not count.
It runs once per silence. After it fires it does not fire again until the customer writes, so a nudge the workflow sends does not restart the clock. For a second touch, add a Wait step in the same workflow.
It fires only while the 24-hour window is open, so an ordinary message is allowed. Inchat checks about once a minute and starts the workflow from your Minutes since they read it setting up to 30 minutes past that read receipt, rather than firing hours late. It is your latest message that counts: if a check is missed past the grace period but you then send another message and the customer reads that one too, the minutes are counted from that newer read receipt, on the same underlying silence.
Read receipts come from WhatsApp, Messenger and Instagram. A WhatsApp customer who has switched read receipts off never starts it.
- Minutes since they read it
- How long after the read receipt, with no reply, the workflow starts.
- Default: 120
- Limits: From 15 to 1380 minutes; saving is refused outside that range.
- Only the customer's latest silence counts. If they wrote after your last message it does not fire, and a reaction to your message does not end the silence. If a later message of yours is what they read, the window for that silence reopens rather than being used up unread.
- Closed conversations, snoozed conversations and blocked contacts are skipped.
- Where the AI is paused, or a teammate has taken over through Inchat, only workflows made entirely of record-keeping steps run; where a teammate replied out-of-band through Meta's own Page Inbox, no automatic workflow runs at all (an agent can still run a Shortcut by hand).
- When many conversations come due at once they are started in batches each minute, and one still waiting when its grace runs out is skipped.
- Trigger Conditions are checked before the silence is claimed, so a message that fails the rules does not use the silence up.
Lifecycle Updated
lifecycle_updated
Starts the workflow when a contact's lifecycle stage is changed one contact at a time by a person or through the public API — from the conversation header, the inbox list, the contact page or the mobile app. A change made by a workflow's Update Lifecycle step, an import, or a bulk stage change from the Contacts list does not start it, so one workflow cannot set off another through this trigger.
It runs on a conversation, so the contact needs an open one: the conversation the change was made from, or otherwise their most recent open conversation. A contact with no open conversation changes stage and starts nothing.
The workflow can read the new stage and the previous stage, which lets it tell a move forward from a move back. Nothing starts when the stage is set to the one the contact already has.
- Which stage changes
- All stages starts the workflow when a contact moves to any stage. Selected stages starts it only when the contact moves to one of the stages you pick.
- Default: All stages
- Limits: The choice looks at the stage the contact moves to, not the one they leave.
- Also when a contact's stage is cleared
- Whether removing a contact's stage counts as a change.
- Default: ticked
- Limits: While ticked, a cleared stage starts the workflow even when Selected stages is on. Untick it to ignore a cleared stage.
- The same workflow runs at most once per conversation in any 10-minute stretch, so two stage changes in quick succession start it once.
- It has no Channels picker: the workflow runs on whichever conversation the change is tied to.
Deal Stage Changed
opportunity_stage_changed
Starts the workflow when a deal moves to another pipeline stage, or is created in one — whether a person moved it on the board, a Move Deal to Stage step did, the AI agent did, or anything else changed the stage. A deal that was already won or lost and moves into another won or lost stage does not count; reopening one does.
Inchat notices moves about once a minute, so the workflow starts within a minute or so. A move found more than 60 minutes late is dropped instead of firing late.
It runs on the deal's conversation — the one the deal came from, or otherwise the contact's most recent — so a deal whose contact has no conversation starts nothing.
The workflow can read the deal's new and previous stage, pipeline, value and currency, whether the new stage is open, won or lost, the objection the AI agent recorded on the deal, and who moved it: AI Agent, Workflow, A person or A rule or import.
- Trigger Conditions
- Rules on the deal — the new stage, its pipeline, its outcome, its value or who moved it. Without one, the workflow runs on every move in every pipeline.
- Default: no conditions — every move in every pipeline starts the workflow
- A deal moved by workflows or rules more than 6 times in an hour stops starting the workflow for the rest of that hour, so a flow that moves the stage it listens to cannot loop. People and the AI agent moving a deal are not counted.
- A workspace also has an hourly ceiling on stage-move runs, and a bulk edit that moves many deals at once is worked through a few at a time each minute; moves past the ceiling are refused.
- Each move runs at most once, even if Inchat sees it twice, and the 10-minute stretch that limits other inbound triggers does not apply: two different moves of one deal in a minute each start the workflow.
- Who moved the deal is what the mover said: a move made by anything that does not say shows as A rule or import.
Form Submitted
form_submitted
Fires when a visitor submits one of your published forms from its own link.
Under Form, pick one form to watch only that one, or leave Any form to catch a submission on every form.
The answers arrive as submission.<field key>, one condition field per form question.
- The workflow runs only when the submission ends up on a WhatsApp conversation. That needs a phone question on the form and the workspace's oldest active WhatsApp channel; the visitor's existing open conversation on THAT number is used if there is one, or a new one is opened there — an open conversation the visitor already has on a different connected number is not reused. A submission with no phone number, or in a workspace with no active WhatsApp channel, is saved but no workflow runs.
- A conversation opened for a first-time visitor has no inbound message from them yet, so WhatsApp's 24-hour session window is not open — a plain Send a Message step is refused there and the confirmation needs an approved template instead.
- The workflow starts after the visitor's submission has already succeeded, so a slow or broken workflow never makes their submit fail.
Booking Created
booking_created
Fires once when an appointment is booked — on your booking page, by a teammate, or by the AI agent confirming one on a call. Confirmations, preparation instructions and directions belong here.
The booking exposes its start time and status. booking.start_at_local is already written out in the event type's own timezone, so a message can quote it as it is.
- The workflow runs only when the booking is tied to a conversation. A booking made on the public page opens one on the workspace's first active WhatsApp channel; with no active WhatsApp channel the booking is saved and no workflow runs.
- A conversation opened this way for a first-time booker has no inbound message from them yet, so WhatsApp's 24-hour session window is not open — a plain Send a Message step is refused there and the confirmation needs an approved template instead.
Booking Status Changed
booking_status_changed
Fires when a confirmed booking is marked completed, no-show or cancelled, and when the customer moves it to a new time from their own booking link. booking.status is free text, not a dropdown, and holds the stored spelling — completed, no_show or canceled (one L) — not the label shown here; a no-show is where a rebooking flow belongs.
booking.previous_status says what kind of change it was: confirmed for a completed, no-show or cancelled booking, rescheduled when only the time moved. A rescheduled booking arrives with booking.status still confirmed and booking.start_at holding the new time.
A booking can be moved by a teammate on the Bookings page, by a Mark Booking (no-show / completed) step, by the customer through their booking link, or by the customer tapping cancel on the confirmation card the AI sends after booking them on a call.
- Only a booking that is still confirmed can move, and only the first change wins if two people act on it at once.
- It does not fire when a booking is first made. That moment is Booking Created.
- A rescheduled booking fires it only when the customer reschedules from their booking link. A teammate cannot reschedule a booking, so there is no such move to react to.
- The workflow runs only for a booking tied to a conversation.
Call Ended
call_ended
Fires once a call on WhatsApp or Messenger is over, for every call that has a conversation, answered or not — including a call your business placed that the customer never picked up.
call.status reads ended, transferred, missed, rejected, ringing, no_answer or failed, and call.handled_by says whether the AI or a person took it. An outbound call the customer never picks up ends as no_answer; missed is an inbound call nobody on your side answered. A call nobody spoke on has no transcript, so it carries no call.summary or call.action_items — only a call somebody spoke on gets those. call.outcome is set either way; call.duration_s can be empty when no duration was reported.
channel.type tells a WhatsApp call from a Messenger one.
- A call the customer places to your WhatsApp number opens the 24-hour window, answered or not, and so does one of your calls that they accept. A call of yours that ends no_answer does not.
- A Messenger call does not open any window. Answer it the way you answer any Messenger thread.
Order Placed
order_created
Meant to fire when a connected online store reports a new order that has not been paid yet — the payment-chase trigger. The order's number, status, payment status, total, currency and tracking would be exposed under order.*.
- Nothing fires this trigger today. The online-store integration it depends on is not available on this deployment yet, and Inseller's own order feed never dispatches it — Inseller only reaches Order Shipped.
Order Paid
order_paid
Meant to fire when a connected online store reports that an order has been paid — thank-yous, delivery expectations and review requests.
- Nothing fires this trigger today, for the same reason as Order Placed: the online-store integration it depends on is not available on this deployment yet, and Inseller's own order feed never dispatches it.
Order Shipped
order_fulfilled
Fires today when Inseller reports an order shipped; a connected online store would reach it too, once that integration is available. The tracking number, courier and tracking link are exposed under order.* for the steps that follow.
It is the only one of the four order triggers Inseller reaches.
- Inseller's shipped event starts it only for an order Inchat already links to a conversation — one raised from an Inchat conversation, or one whose earlier Inseller payment event named a conversation. A shipped event for any other order is dropped: nothing is saved and nothing runs.
- Shipment Status Changed is the trigger for courier progress after this point.
Order Cancelled
order_cancelled
Meant to fire when a connected online store reports a cancelled order — a win-back message, or a question about why.
- Nothing fires this trigger today, for the same reason as Order Placed: the online-store integration it depends on is not available on this deployment yet, and Inseller's own order feed never dispatches it.
Shipment Status Changed
shipment_status_changed
Fires when a parcel tracked through tracking.my reaches a milestone. Under Milestones, tick Shipped, Out for delivery, Delivered and Delivery problem for the ones you want, or tick none to hear about all four.
Each milestone fires once per shipment. Delivery problem covers a failed delivery attempt, an exception and an expired tracking, and a failed attempt counts only after the courier has picked the parcel up.
shipment.window reads open or closed depending on whether the customer's 24-hour window is open at that moment, so one workflow can send a plain message when it is and an approved template when it is not.
- The parcel's phone number must match one contact, and that contact must have a conversation. A parcel whose phone number matches contacts holding more than one different number is not guessed at. A matched contact with no conversation yet does not get its earlier milestones announced retroactively once one opens — the conversation is looked up again on any later tracking.my event, milestone or not, and whichever milestone(s) that new event carries are announced then; one event can carry more than one (an out-for-delivery scan claims both Shipped and Out for delivery together if Shipped had not already fired).
- While the workspace is suspended, shipments and their milestones are still recorded, but no workflow runs and nothing is sent.
Event Reminder
event_reminder_due
Fires for each registrant whose reminder has come due. The moments are the reminder times set on the event, each a number of minutes before it starts, and the schedule is checked every minute.
Reminders start only once the event is published. Only registrants whose status is still registered are reminded.
This trigger sends nothing itself: the workflow holds the words. event.name, event.starts_at and reminder.offset_min say which event and which reminder it is.
Inchat does not check the WhatsApp window before it fires. A reminder due well before the event usually lands with the window closed and needs an approved template, but one set for shortly before the event can land inside an open window, so branch on the window instead of assuming.
- A registrant with no conversation attached is skipped and their reminder is retired unsent, not retried.
- If several reminder times fall due at once after downtime, only the nearest one fires and the others are skipped.
- It carries no episode of its own, so it shares the ordinary 10-minute cooldown with any other run of the same workflow on that conversation — a second reminder due on the same registrant inside that window can be swallowed by it, though it is still marked sent.
Event Registration Changed
registration_status_changed
Fires when a registrant's attendance is recorded and their status actually changes to attended, no-show or cancelled. Attendance is recorded by a teammate on the event's page, or by a Record Attendance step in a workflow.
registration.status, registration.previous_status and registration.minutes_attended are exposed. The minutes are a number that was entered along with the attendance, not one Inchat measures, so a condition on them is only as good as whatever recorded them.
- Changing only the minutes, with the status left as it was, does not fire the trigger again.
- Putting a registrant back to registered does not fire it.
- A registrant with no conversation attached does not fire it when a teammate records attendance from the event page.
Incoming Webhook
inbound_webhook
Saving this trigger gives the workflow its own web address. A POST to that address can only start this one workflow — not any other workflow that also uses Incoming Webhook — and it does nothing while the workflow is a draft.
Whatever JSON the sender posts is available to later steps as payload.<field>. In the trigger's settings you can also name up to ten of those values under Named values so a step can quote them as webhook.<name>, and point Find the contact by at the JSON path that holds a phone number, email or Inchat contact id.
The workflow can only run on a conversation Inchat already has. If the post includes a conversationId, contactId, phone or email that does not match anyone in the workspace — or none at all when no Find the contact by path is set — nothing runs.
- Find the contact by
- The JSON path holding the phone number, email or Inchat contact id used to find the conversation to run on.
- Limits: Optional — omit it and send
conversationId,contactId,phoneoremailat the top level of the JSON instead. It cannot point at a conversation id path. - Named values
- Up to ten named JSON paths from the posted body, exposed to later steps as
webhook.<name>. - Limits: Optional — leave the list empty and read
payload.<field>directly instead.
- It never creates a contact or a conversation — only finds one that already exists in this workspace, so the very first message from someone new cannot be the thing this trigger reacts to.
- A wrong or unrecognised web address gets a 404. A malformed request is also rejected, not quietly accepted: a body that is not JSON or not a JSON object, an invalid
email, aconversationId/contactIdthat is not a valid id, or aphonethat is not a 3–32-character string all get a 400; too many requests get a 429; a database error gets a 503. Phone matching is an exact string comparison, so0123456789does not match+60123456789. - A post that starts the workflow gets a 200. Two other cases get a 202, so the sender does not retry a post that will never match: a well-formed post that matches nobody, and one addressed to a workflow that is not published.
Video Watched
video_progress
Fires when a viewer newly crosses the 25, 50, 75 or 100% mark of a video Inchat hosts and tracks, on the highest mark that ping crosses — going straight from 20% to 80% fires only the 75% mark, not 25 and 50 as well.
Progress is a high-water mark per contact and video, kept forever: it only ever goes up, so a second, later viewing that stops at 30% does not un-fire a mark an earlier viewing already reached, and does not fire again on marks already crossed.
The video plays on an Inchat form page: have a workflow step send a link to that page ending in ?v={{contact.viewer_token}}, so the link is keyed to that contact and conversation. Opened without the token, nothing is tracked; a token that carries no conversation records progress but starts nothing.
- It does not read watch progress on a video hosted anywhere outside Inchat's own player.
- It can fire up to four times per contact and video — once for each of 25/50/75/100% — never more than once for the same threshold.
Booking Reminder
booking_reminder_due
Fires when an appointment's reminder offset comes due, for an appointment type that has a reminder template set. If no workflow on this trigger replies, Inchat still sends that template as its own fixed reminder — adding a workflow here replaces that wording rather than adding a second reminder.
A reminder is usually outside WhatsApp's 24-hour session window, so a workflow's own reply here is almost always an approved template rather than plain text.
- An appointment type with no reminder template set sends no reminder at all, whatever its offsets — this trigger does not fire and nothing is sent, silently. Set a template on the appointment type first.
- It does not let you set the offset itself from this trigger — how far ahead a reminder fires is configured on the appointment type it belongs to, not on the workflow.
Link Clicked
link_clicked
Fires the first time someone taps a link that a workflow step sent them, as long as link tracking was on for that message. A second, later click on the same link a flow already reacted to does not fire it again.
Automatic link-preview fetches (the ones chat apps make to build a preview card) do not count as a click.
- It is an intent signal, not proof the page loaded or that the customer read what's on it — the customer's device made the request, nothing more.
Conversation Closed
conversation_closed
Fires when a teammate closes a conversation from the web Inbox. It does not distinguish why they closed it.
- It fires only from the web Inbox's own Close action. A workflow's own Open / Close Conversation step, a close from the mobile app, the AI agent closing a thread, and a CSAT survey closing the thread it opened for itself all close the conversation without starting this trigger — so a workflow cannot use it to react to its own close, or to a close made anywhere other than the web Inbox.
- It carries no episode of its own, so it shares the ordinary 10-minute cooldown: closing, reopening and closing the same conversation again inside that window runs the workflow once, not twice.
Shortcut
shortcut
Nothing starts this on its own — an agent picks it by name from the Inbox on an open conversation. It is the trigger to use for something a human decides to run, like sending a quote pack.
A shortcut can define its own small form first (text, a list of choices, a checkbox, an email, a number, a URL, a date or a time); the agent fills it in before the workflow starts, and its answers reach the workflow as shortcut.<key>.
A required field blocks the agent from starting the workflow until it is filled in correctly — an email field that is not a valid email, for one, is refused rather than passed through.
- It is not a bulk action — one agent, one conversation, one run per click.
Manual Trigger
manual
Nothing in the product starts this on its own: it runs only when something explicitly hands a conversation to it — another workflow's Trigger Another Workflow step, an operator manually enrolling a conversation, or an API call.
Manual is a naming convention for a flow meant to be entered this way, not a requirement the product enforces: a Trigger Another Workflow step or a manual enrolment can hand a conversation to any published workflow, whatever trigger type it was built with.
- How much of the workflow's own top-level conditions apply depends on how it is entered. Trigger Another Workflow and a bulk enrolment skip every condition outright. Enrolling one conversation by hand from the Inbox, or through the public API, checks only the conditions that describe a standing fact about the contact, the channel or the conversation — anything that would need the triggering message is left unchecked — and even that check can be waived with Enrol anyway.
Contact Tag Updated
contact_tag_updated
Fires when a person adds or removes a tag on one contact at a time — from the contacts page, the sidebar, the mobile app or the public API. A bulk tag add from the Contacts list does not fire it. Leave the tag list empty and it fires on every tag change on every contact, which is rarely what an operator wants.
The filter can name several tags at once (matched case-insensitively, any one of them qualifies) and can be narrowed to only additions or only removals; leaving the direction unset matches either.
- It watches the CONTACT's tags, not the conversation's — Tag Conversation / Untag Conversation changes do not fire it.
- It is a person's own edit, not the workflow engine's: Tag Contact and Untag Contact steps never fire it, so one workflow cannot set off a chain of others by tagging through them. A contact with no conversation fires nothing.
Contact Field Updated
contact_field_updated
Fires when a person changes a contact field's value. A custom field fires it from any of the web contacts page, the sidebar, the mobile app or the public API. Name, phone and email fire it only from the web contacts page or sidebar — a change to one of those three from the mobile app or the public API does not fire it. Leave the field unset and it fires on any field's edit; naming one limits it to that field only.
- It exposes both sides of the change as
fieldValue(New value) andfieldPreviousValue(Previous value).contact.attributes.<key>also carries the current value, but only for a custom field — name, phone and email live in their own contact fields, not underattributes. - It is a person's own edit, not the workflow engine's: a Save to Contact Field step never fires it. A contact with no conversation fires nothing.
Contact Date Reached
contact_date_reached
Fires when the calendar reaches a date stored in one of the contact's own date fields, shifted by the offset you set — a negative offset fires before the stored date, a positive one after, and zero fires on the day itself.
Switching on Every year on that day (birthdays, anniversaries) ignores the stored year and matches the same month and day every year; left off, the date fires once, in the exact year it names.
It checks contacts against each date-triggered workflow roughly every ten minutes, and only once the time of day you set has passed in the time zone you chose. Publishing a workflow after that time has already passed today still fires it for a contact whose date matches today, on a next check — it does not wait for the date to come round again.
- It fires at most once per contact per calendar day for a given field — a second date-triggered workflow on the same field still gets its own run, but the same workflow does not repeat that day.
- A blocked contact, or one with no existing conversation, is skipped: the trigger needs a thread and a channel to act on, and this sweep does not create one.
- One workflow runs at most 100 contacts per check; when more than that match on the same tick, the rest run on the next check, about ten minutes later.
Payment Slip Received
payment_slip_received
Fires when the customer sends a photo that reads as a bank transfer, e-wallet or DuitNow receipt, with the amount, currency, bank, reference and payee already read off the image.
It fires before Message Received on that same photo. If a workflow on this trigger actually replies, Message Received stays quiet on it; if none does, Message Received still runs afterward as normal.
- Channels
- Which connected channels the workflow listens on.
- Default: All channels
- The read amount and reference come from reading the image, not from a bank record — treat them as a strong hint to confirm, not a settled payment, before anything that promises to ship or unlock something valuable.
Related
- Workflows: how a flow runs — A workflow is one trigger, optional conditions and an ordered list of steps; only a published workflow runs, and this article explains how a run starts, forks, pauses, fails and stops.
- Conditions and variables — How a condition decides whether a workflow starts or which path a contact takes, and how a {{variable}} is filled into the text a workflow sends.
- Test and publish a workflow — Plan a workflow's path against a pretend conversation without sending anything, then publish it — and know what Publish refuses, what it only warns about, and what it locks.
- Build a workflow with AI — Describe a flow in plain words and the assistant drafts it for you to review: the draft sits in the side panel until you put it on the canvas, nothing is saved until you press Save, and nothing runs on customers until the workflow is published.
Reading this with an AI assistant? Plain Markdown version.