Set up a WhatsApp automation in WACRM and read its run log
WACRM Workspace's Automations screen lets you turn an order, a fulfilment, an abandoned cart, an inbound message or a booking reminder into an action — a label, a ticket, a proposed agent action, or a template send. This tutorial covers the real screen, the run log that shows what each firing actually did, and the same calls through the API.
By Huy Nguyen (David), Founder & CEO of Netbase JSC Updated
What you'll learn
- What you need before you start
- Create an automation in Workspace
- Turn a rule on or off
- Read the run log
- The same thing through the API
- What works today vs. what’s not there yet
An automation in WACRM is a rule: when something happens — a new order, an order marked fulfilled, an abandoned cart, an inbound message, or a booking reminder — it runs one or more actions against the contact that event is about. This tutorial walks the real Automations screen, the 5 triggers and 4 actions that exist today, how to turn a rule on or off, how to read its run log, and the same thing through the API.
What you need before you start
- A WACRM Workspace account with at least one project.
- For the New order, Order fulfilled and Cart abandoned triggers: a connected store — these fire from real store activity, not from a demo. Whether your plan includes a store connection is not listed on the pricing page beyond “Store connector (early access)” on the Advanced plan; check your plan in Settings if you’re unsure.
- For the Send a template action: at least one approved template, since the action only lets you pick from approved templates.
- For the API steps only:
curl(or any HTTP client that can set a header), and an API key from Developer / API & MCP.
Create an automation in Workspace
- Open Automations in Workspace.
- Click New automation.
- Fill in a Name, then pick a Trigger. If you pick Booking reminder, a Reminder timing field appears — choose 24 hours before or 2 hours before; the rule only runs for that one timing, never the other.
- Under Actions, click Add action for each action you want this rule to run when it fires. Pick an Action type and fill in that type’s fields (see the table below). Leaving Actions empty still saves a rule — it fires and gets recorded in the run log, it just doesn’t do anything.
- Click Create automation.
The 5 triggers
| Trigger (label in Workspace) | Fires when |
|---|---|
| New order | A new order is created |
| Order fulfilled | An order’s status moves into a shipped/fulfilled state |
| Cart abandoned | An abandoned-cart signal comes in for a cart |
| Inbound message | A new inbound WhatsApp or SMS message arrives |
| Booking reminder | A booking reaches its 24-hour or 2-hour reminder window (pick which one in Reminder timing) |
New order and Order fulfilled typically back order-confirmation and status-update sends, the kind of message WhatsApp classifies as a Utility conversation, not Marketing.
The 4 actions
| Action type (label in Workspace) | Fields | What it does |
|---|---|---|
| Add a label | Label — pick an existing label | Attaches that label to the event’s contact |
| Create a ticket | Ticket subject | Opens a support ticket on the event’s contact |
| Propose an agent action | Tool name, Payload (JSON object) | Adds a row to the agent-actions approval queue — always needs approval, never auto-approved, even if auto-send is on |
| Send a template | Approved template — pick from your approved templates, Variables (JSON, optional) | Sends that template to the event’s contact through the same path your other outbound templates already use |
An action with no contact to work with (no contact resolved from the triggering event) is skipped, not failed — Add a label and Create a ticket both need one. Propose an agent action is also skipped while the workspace’s AI is paused. Send a template checks contact, AI pause, consent and the template’s approval status, in that order, before it sends anything — the same Approved status Meta’s own template creation flow in WhatsApp Manager requires before a template can be used at all. See “Read the run log” below for what each of those looks like when a rule doesn’t send.
Turn a rule on or off
Each row in the automations list has an Enabled switch, shown as On or Off. Flipping it saves immediately; if the save fails, the switch reverts to its previous state and an inline error appears — nothing changes silently. Disabling a rule stops it from firing on new events; it doesn’t touch runs it already recorded.
To remove a rule entirely, use the row’s Delete action. A confirmation dialog asks you to confirm: “<name>” will be permanently removed. This cannot be undone.
Read the run log
Each row has a Last runs column with a View last runs toggle. Opening it (only when you click it — the table never fetches runs for every rule just from loading the page) fetches the rule’s 5 most recent runs and shows each one’s status:
| Status | Meaning |
|---|---|
| Pending | Claimed but not finished yet (or, rarely, a run whose process died before finishing — see below) |
| OK | Every action ran |
| Skipped | An action didn’t run for a known reason (no contact, AI paused, no consent, etc.) |
| Failed | An action threw an unexpected error, or a Send a template action’s send itself failed |
A Skipped or Failed run also shows a reason, in plain language: No contact on this event, Contact not found, Label not found, AI is paused for this workspace, Contact hasn’t opted in, Template not found, Template not approved, Send failed, Unknown action type, or Error while running this action. A Send a template action whose send fails for any reason — not just a denied consent check — is always recorded Failed with reason Send failed, never Skipped, so a real delivery problem is never shown the same way as an expected “contact hasn’t opted in” skip.
A run that crashes
A run is claimed the moment its trigger fires and finalized once every action has run. If the process dies in
between — a crash, a restart — the run is left Pending and isn’t retried immediately. A scheduled check (today,
every 15 minutes) looks for pending runs older than 15 minutes and resumes them from where they left off: any
action already recorded in that run isn’t re-run, so a template that already sent is never sent a second time —
the same idempotent retry-safety a resumed run
relies on. A run gets up to 3 attempts in total; once it’s exhausted them it’s marked Failed, with a reason the run log
doesn’t yet have a translated label for — you’ll see the raw value requeue_exhausted instead of a sentence.
The same thing through the API
Automations are also a Core API resource, under /v1/crm-projects/{project}/automations. Reads use the
agent:propose scope, writes use agent:approve — tick both under Restrict what this key can do (advanced) →
WhatsApp CRM scopes when you create a key in Developer / API & MCP (agent:approve needs a Secret key).
| Method | Path | Scope |
|---|---|---|
| GET | /v1/crm-projects/{project}/automations | agent:propose |
| POST | /v1/crm-projects/{project}/automations | agent:approve |
| GET | /v1/crm-projects/{project}/automations/{automation} | agent:propose |
| PATCH | /v1/crm-projects/{project}/automations/{automation} | agent:approve |
| DELETE | /v1/crm-projects/{project}/automations/{automation} | agent:approve |
| GET | /v1/crm-projects/{project}/automations/{automation}/runs | agent:propose |
Create a rule with an action
curl -s -X POST "https://api.wacrm.ai/v1/crm-projects/your-project-uuid/automations" \
-H "Authorization: Bearer sk_live_your_scoped_key" \
-H "Content-Type: application/json" \
-d '{
"name": "Tag new orders",
"trigger": "order_created",
"enabled": true,
"config": { "actions": [{ "type": "add_label", "label_id": "your-label-uuid" }] }
}' {
"data": {
"id": "0e2b1c9a-...-automation-uuid",
"name": "Tag new orders",
"trigger": "order_created",
"config": { "actions": [{ "type": "add_label", "label_id": "your-label-uuid" }] },
"enabled": true,
"created_at": "2026-11-08T09:00:00+00:00",
"updated_at": "2026-11-08T09:00:00+00:00"
}
} An unrecognized trigger answers 422 invalid_trigger; a config that doesn’t match what that trigger (or that
action type) requires answers 422 invalid_config — e.g. booking_reminder without a kind of 24h/2h, or an
add_label action whose label_id isn’t one of your own project’s labels.
List a rule’s runs
curl -s "https://api.wacrm.ai/v1/crm-projects/your-project-uuid/automations/your-automation-uuid/runs?limit=5" \
-H "Authorization: Bearer sk_live_your_scoped_key" {
"data": [
{ "event_key": "order:9f2a...", "status": "ok", "reason": null },
{ "event_key": "order:7c10...", "status": "skipped", "reason": "no_contact" }
]
} Newest first, same fields the Last runs panel itself reads, limit 1-100 (default 20). A project id your key
doesn’t own, or an automation id from another project, both answer 404 not_found — never 403, so you can’t tell
the two apart from the response. A key missing the required scope answers 403 insufficient_scope.
What works today vs. what’s not there yet
| What you want to do | Works today? |
|---|---|
| Create a rule with a trigger and up to 4 action types | Yes — Automations → New automation |
| Build a rule with a visual flow builder | Not yet — Pro’s pricing page lists “Flow builder (early access)”; Workspace only has the New automation dialog |
| Fire New order / Order fulfilled / Cart abandoned | Needs a connected store (Store connector is early access on the Advanced plan) |
| Send a WhatsApp template from a rule | Yes, but only an approved template to a contact with consent — Workspace only lets you pick an approved template, and Core still checks consent at send time |
| See why a firing did nothing | Yes — open Last runs on the rule for each run’s status and reason |
| Edit the actions on an already-saved rule | Not from the screen — only the Enabled switch is editable there. PATCH /v1/crm-projects/{project}/automations/{automation} with a new config.actions works too, or delete and recreate |
| Recover automatically from a run that crashed mid-flight | Yes — a stuck pending run is resumed on the next scheduled check, up to 3 attempts |
| Call the same actions through the API | Yes — mint a key with agent:propose/agent:approve |
Ready to put this into practice? Request early access to get a Workspace, or have WACRM’s team set up your project for you with Quick Setup.
Talk to an expert
A person from the WACRM team replies.
Ask David a question about “WhatsApp Automations: Triggers and Actions”.
Replies within one working day, usually sooner on WhatsApp.
Frequently asked questions
Is there a visual flow builder for automations?
Not yet. WACRM's pricing page lists "Flow builder (early access)" as a Pro-plan feature, but the Automations screen in Workspace today only has the New automation dialog — a name, a trigger, and a flat list of actions. There is no drag-and-drop canvas to build multi-step flows.
Do the order and cart triggers work without a connected store?
No. New order, Order fulfilled and Cart abandoned all fire from your store's order and cart activity, so they need a connected store first. WACRM's pricing page lists "Store connector (early access)" and "Order automation (early access)" under the Advanced plan — check your plan in Settings if you're not sure whether yours includes it.
Why would a Send a template action never actually send?
The engine checks several things before sending, in order, and records whichever one stops it as the run's reason: no contact on the triggering event, the workspace's AI paused, the contact hasn't opted in, the template not found, or the template not approved. Only a rule whose contact has consent and whose template is approved actually sends.
What happens to a run that crashes partway through?
It isn't lost. A claimed run that never finishes stays pending, and a scheduled check resumes it later without re-running whichever actions it already completed. After repeated failures it's marked failed instead of retried forever — see "A run that crashes" below for the exact numbers.
Can I change the actions on a rule I already saved?
Not from the screen today — the only thing you can change there after creation is the Enabled switch. The name, trigger and actions all change through the API instead: PATCH /v1/crm-projects/{project}/automations/{automation} accepts any subset of name, trigger, config (which holds the actions array) and enabled, so you can edit config.actions directly without deleting and recreating the rule.
Want this set up for you?
Quick Setup connects your number with coexistence in 48 hours, done by a person.