Starting a WhatsApp flow from your own system
One small piece needs a developer. Everything after it you build yourself on the canvas.
An External Event trigger starts a WhatsApp flow when your own software posts an event to us — a delivery slot needing booking, a subscription about to renew, a repair finished. It is the escape hatch for everything Shopify's seven store events do not cover.
This is the one place in the builder where a developer is genuinely needed, and it is worth being precise about how little they have to do: they post one message to one web address. Everything after that — the questions, the branches, the messages — you build yourself.
What your developer needs
- Your account API key, from Settings.
- The address to post to:
/api/external/event. - An event name they choose and you both agree on — for example
delivery_slot_request. - The customer's phone number, plus any fields you want available in the flow.
That is the whole developer task. Any field they include arrives in the flow as
{{event.field_name}}, so a payload carrying an order number and a
customer name makes both usable in your messages.
Always name the event. A rule with a blank event name fires on every external event your system sends, which turns one flow into a catch-all that messages people about the wrong thing. Set a specific name on both sides.
The thing that surprises people: you need a template
A flow started by your own system lands on a chat the customer may never have written to, so the 24-hour window is shut. Meta only allows approved templates outside it.
Practically this means the first message of an external-event flow must be a template, and if that first message asks a question, the question step has to be sent as a template too — with quick-reply buttons whose titles match your flow's options exactly.
It also means the first message is charged. But there is a compensation worth designing around: the customer's tap opens the 24-hour window, so everything after it is free text at no cost.
A complete example: delivery slot booking
Your system asks, the customer chooses, your system hears back
Free text — the window is open.
Install the delivery-slot flow
Needs a contact field, an approved three-button template, and your endpoint.
Add this automation to my account It installs as a draft. Nothing is switched on and no customer is messaged until you press Publish.Button labels must match exactly
When a question is sent as a template, the template's quick-reply buttons are what the customer taps — so each option in your flow must match a button title character for character. "Morning" and "Morning slot" are different strings, and a mismatch means the tap resolves to nothing and the flow stalls.
Check this before publishing. It is the single most common reason an external-event flow appears to work and then goes quiet.
Sending data back
The Call External API step posts the customer's answer to your system. Two things worth knowing:
- Use GET to look something up and POST to send something. To do both — check availability, then book — chain a GET into a POST.
- Wire the failure branch. An endpoint that is down should produce a human handover, not silence.
What this unlocks that Shopify events do not
| Use case | Why a store event won't do it |
|---|---|
| Delivery slot booking | Scheduling lives in your warehouse system |
| Subscription renewal reminder | No renewal event exists |
| Repair or service ready for collection | Not an ecommerce event at all |
| Appointment confirmation | Your booking system owns the date |
| Back-office approval decisions | Happens inside your own tools |
The general rule: if the moment that should start the conversation happens inside software you control, this is the trigger for it.
What it still cannot do
An external event starts a flow now. It does not schedule one for later — there is no per-contact scheduled send, so "message this customer on the 14th" has to be your system posting the event on the 14th. That is usually a one-line change on their side and it keeps the timing where the data lives.
And no amount of API access moves Meta's rules. The first message still needs an approved template, the recipient still has to be reachable on WhatsApp, and marketing content still cannot be delivered to a US number. The API changes what starts a flow, not what a flow is allowed to send.
Testing it
Have your developer post one test event with your own phone number before you publish. It is the only way to exercise the path, and it proves three things at once: the key works, the event name matches, and the template renders with real values. See testing an automation safely.
Frequently asked questions
Can my own software start a WhatsApp automation?
Yes, using the External Event trigger. Your system posts an event with your account API key to /api/external/event, and any fields it includes are available in the flow as {{event.field_name}}.
Why does an API-triggered flow need an approved template?
Because it lands on a chat the customer may never have written to, so the 24-hour window is closed and Meta only allows approved templates outside it. The customer's tap then opens the window, making everything afterwards free.
Why does my template question go quiet after the customer taps?
The option labels in your flow must match the template's quick-reply button titles character for character. A mismatch means the tap resolves to nothing.
Can an external event schedule a message for a future date?
No. It starts a flow immediately. There is no per-contact scheduled send, so your system has to post the event at the moment you want the message sent.