Trigger reference
Every workflow trigger available in Enscale, what fires it, and what data it gives your flow.
A trigger is the event that starts a workflow. Every workflow has exactly one.
This page lists all triggers available in the builder's trigger picker, grouped by where the event comes from. For each one you get what fires it, and the payload your flow can read through {{trigger.*}}.
Triggers are raw events, not recipes
Enscale deliberately gives you raw Shopify events rather than pre-baked ones. There is no "abandoned checkout" or "order delivered" trigger — you build those from a raw trigger plus a Condition node, which means you control the exact rule instead of guessing at ours.
The recipes below show how. See Node reference for the nodes involved.
Shopify triggers
These fire from Shopify webhooks. The payload is the raw Shopify webhook body, so anything Shopify sends is readable via {{trigger.*}}.
| Trigger | Fires when |
|---|---|
| Checkout Created | A shopper starts a checkout. |
| Checkout Updated | An existing checkout changes. |
| Cart Created | A new cart is created. |
| Cart Updated | A cart is updated. |
| Order Created | A new order is created. |
| Order Paid | Order payment is captured. |
| Order Updated | Any change to an order. |
| Order Cancelled | An order is cancelled. |
| Order Fulfilled | An order is fully fulfilled (shipped). |
| Order Partially Fulfilled | Part of an order is fulfilled. |
| Order Edited | An order's line items are edited. |
| Fulfillment Created | A fulfillment is created for an order. |
| Fulfillment Updated | A fulfillment changes (including delivery). |
| Draft Order Created | A draft order is created. |
| Draft Order Updated | A draft order is updated. |
| Customer Created | A new customer record is created. |
| Customer Updated | A customer's details change. |
| Customer Account Enabled | A customer activates their account. |
| Customer Account Disabled | A store admin disables a customer account. |
| Marketing Consent Updated | A customer's SMS marketing consent changes. |
| Back In Stock | An out-of-stock product becomes available again. |
Building the flows people expect
Four common automations that used to be their own triggers. Each is now a raw trigger plus one condition.
Abandoned checkout
Start from Checkout Created, then add a Wait node and a Condition:
Trigger: Checkout Created
→ Wait 1 hour
→ Condition: {{trigger.completed_at}} is empty
→ Yes: send recovery messageThe condition is what makes it "abandoned" — a checkout with a completed_at value became an order, so it should not receive a recovery message.
If a shopper starts a checkout without a phone number, Enscale can't message them yet. When they later enter a phone, Shopify sends a checkouts/update, and Enscale runs your Checkout Created flow at that point instead. Create and update share one dedup key, so the flow never runs twice for the same checkout.
Cash on delivery (COD) confirmation
Trigger: Order Created
→ Condition: {{trigger.payment_gateway_names}} contains "Cash on Delivery (COD)"
→ Yes: send COD confirmation templateOrder delivered
Delivery is a fulfillment state, not an order state:
Trigger: Fulfillment Updated
→ Condition: {{trigger.shipment_status}} equals "delivered"
→ Yes: send delivery confirmation, review request, or reorder reminderRefunds and COD-to-prepaid conversion
Trigger: Order Updated
→ Condition: {{trigger.financial_status}} equals "refunded" (or "paid")Payload notes
A few Shopify payloads are narrower than people expect:
- Order Edited sends an edit summary, not the order. Read
{{trigger.order_edit.*}}, and use a Fetch Order node with{{trigger.order_edit.order_id}}if you need the full order. - Marketing Consent Updated carries only the customer id, phone, and
{{trigger.sms_marketing_consent.state}}— no name, no email. - Fetch Order Checkout queries orders, not abandoned checkouts. It can't resolve a checkout token, so don't pair it with checkout triggers.
Instagram triggers
| Trigger | Fires when |
|---|---|
| Instagram Comment | Someone comments on your Instagram post. |
| Instagram DM Received | A customer sends a new DM. |
| Story Mention | Your account is mentioned in an Instagram story. |
See Instagram comment automation for comment-to-DM patterns and rate-limit safeguards.
Instagram Comment to DM is retired
The old Instagram Comment to DM trigger no longer appears in the picker — it did the same thing as Instagram Comment followed by a Reply-to-Comment and Send-DM action pair. Workflows saved with the old trigger keep running unchanged; rebuild them on Instagram Comment when you next edit them.
Ad-click triggers
These fire when an inbound message carries an ad referral, which lets you treat ad-sourced conversations differently from organic ones. All three expose {{trigger.ad.*}} so you can branch on the ad headline or id.
| Trigger | Fires when |
|---|---|
| WhatsApp Ad Click (CTWA) | A customer messages you after tapping a Click-to-WhatsApp ad. |
| Instagram Ad Click | A customer DMs you after tapping an Instagram ad. |
| Facebook Ad Click (CTM) | A customer messages your Page after tapping a Click-to-Messenger ad. |
Ad tracking is available on all paid plans. These triggers also feed Meta Conversions API attribution — see Revenue attribution.
Conversation triggers
These fire from activity in your inbox.
| Trigger | Fires when |
|---|---|
| New Conversation | A new inbound conversation starts. |
| Conversation Opened | A resolved conversation is reopened. |
| Conversation Out of Hours | A new conversation starts outside your business hours. |
| Conversation Resolved | A conversation is marked resolved or closed. |
| Keyword Received | An inbound message matches a keyword you configure. |
| Campaign Response | A contact replies to a campaign message. |
| AI Handed to Human | An AI agent hands a conversation to a human. |
Keyword Received takes a keyword and a match mode in the trigger config — use it for PRICE, AGENT, OFFER, and similar shortcuts.
AI Handed to Human exposes {{trigger.handover.reason}}, which is useful for alerting a specific team or tagging the conversation urgent.
Contact and consent triggers
| Trigger | Fires when |
|---|---|
| Contact Added | A new contact is added to your list. |
| Tag Added | A specific tag is added to a contact. |
| Popup Subscriber | A contact subscribes through a popup campaign. |
| Back-in-stock Subscribed | A shopper joins a product back-in-stock waitlist. |
| WhatsApp Opt-Out (STOP) | A contact opts out of WhatsApp. |
| Review Submitted | A customer submits a product review. |
WhatsApp Opt-Out fires whether the opt-out came from a STOP keyword, an AI agent, or a staff action. The contact can no longer be messaged on WhatsApp, so use this trigger to tag, re-segment, or alert staff — not to send a farewell message.
Review Submitted exposes {{trigger.review.rating}}. Branch on it to send a thank-you for positive reviews and route negative ones to service recovery.
The 24-hour service window
This rule affects which triggers can send which kind of message, and it catches people out.
Free-form messages (the Service Message node) can only be delivered inside a channel's open 24-hour customer-service window. Approved Template Message nodes can be sent any time.
A window is open when:
- The trigger is a conversation trigger — the customer just messaged you, so the window is already open.
- Or a template message earlier in the same flow opened one and the customer replied.
Practically: a flow triggered by Order Fulfilled cannot open with a free-form message, because no customer message opened a window. Start it with an approved template instead. The builder flags this before you publish.
Trigger availability
Every trigger listed here is available on every plan, including Free. What differs by plan is your monthly workflow run allowance — see Plans and limits.
Next steps
- Node reference — every node you can put after a trigger.
- Variables — how
{{trigger.*}}and other paths resolve. - Workflows — building and publishing a flow.