Features
Order notifications
Order confirmation, status changes, shipping, delivery, payment, refunds and returns.
Order notifications tell a customer what has happened to their order, confirmed, packed, shipped, out for delivery, delivered, paid, refunded, returned. They are the reason most stores install this in the first place: a customer who gets a shipping message on WhatsApp does not open a "where is my order" ticket.
The events
Twelve of the eighteen catalog events are order-related. Each has its own template, its own approval state and its own set of variables.
Order, shipping, payment and return events
| Field | Required | Type | Description |
|---|---|---|---|
| order_confirmation | No | UTILITY | Sent immediately after an order is placed. Template order_confirmation. |
| order_status | No | UTILITY | Any status change you map to it. This is the event for custom statuses. Template order_status_update. |
| order_cancelled | No | UTILITY | Order cancelled or failed. Template order_cancelled. |
| order_shipped | No | UTILITY | Dispatched, with a tracking number. Template order_shipped. |
| out_for_delivery | No | UTILITY | On the van today. Template out_for_delivery. |
| order_delivered | No | UTILITY | Marked delivered. Template order_delivered. |
| payment_received | No | UTILITY | Payment confirmed. Template payment_received. |
| invoice | No | UTILITY | Tax invoice issued. Template invoice. |
| refund_processed | No | UTILITY | Refund issued. Template refund_processed. |
| return_requested | No | UTILITY | Return request received. Template return_requested. |
| return_approved | No | UTILITY | Return approved. Template return_approved. |
| welcome | No | UTILITY | Sent once when a customer creates an account. Template welcome. |
What has to be true first
- A registered number
- Not just linked, registered on the Cloud API with a six-digit two-step PIN. An unregistered number rejects every send with Meta error
133010, however many templates are approved. See Connect your WhatsApp number. - The template approved
- Per event, per number. E-commerce Notifications shows the state of all eighteen at a glance and submits them in one click.
- The event switched on
- In WooCommerce and Shopify every event has its own toggle, and most start off. An approved template with the event switched off sends nothing.
- A phone number on the order
- The recipient is read from the order's billing phone by default. No phone, no message.
- Credits
- Order events are
UTILITY, the cheap category, but not free. See Credits and billing.
How to set it up
Get the templates approved
Open E-commerce Notifications in the dashboard. The headline reads "N ready to send / 18 total". Press Get all N verified to submit every outstanding template at once, or Get verified on a single card. Meta usually reviews within minutes to a few hours.Fix any blockers reported at the top
If the number cannot send at all, no access token, or not registered, a red panel says so above everything else. Approved templates below it will not deliver until that is fixed.Send a test
Expand an approved event's card and use the test row. It sends using the template's approved sample values, so you can confirm delivery without a real order.Wire up the store
Then connect WooCommerce, Shopify, or your own backend, see the tabs below.

The variables
Each event declares its variables in a fixed order, and that order is the {{1}}…{{n}} order of the approved template. Send them by name; the platform maps them to positions.
order_confirmation
| Field | Required | Type | Description |
|---|---|---|---|
| customerName | Yes | string | Customer name. Example: Alex |
| orderId | Yes | string | Human-readable order id. Example: #ORD-12345 |
| orderTotal | Yes | string | Order total, formatted. Example: 1,499.00 |
| trackingLink | Yes | string | Where the customer can track the order. Example: https://example.com/track/ORD-12345 |
order_status
| Field | Required | Type | Description |
|---|---|---|---|
| orderId | Yes | string | Human-readable order id. |
| orderStatus | Yes | string | The new status. Example: Packed |
| trackingLink | Yes | string | Order tracking link. |
order_shipped
| Field | Required | Type | Description |
|---|---|---|---|
| orderId | Yes | string | Human-readable order id. |
| awbCode | Yes | string | Carrier AWB / tracking number. Example: AWB123456789 |
| trackingLink | Yes | string | Carrier tracking link. |
The rest
| Field | Required | Type | Description |
|---|---|---|---|
| order_cancelled | No | variables | orderId, reason |
| out_for_delivery | No | variables | orderId, trackingLink |
| order_delivered | No | variables | orderId, reviewLink |
| payment_received | No | variables | orderId, amount |
| invoice | No | variables | customerName, orderId, invoiceNumber, amount, invoiceLink |
| refund_processed | No | variables | orderId, amount |
| return_requested | No | variables | orderId |
| return_approved | No | variables | orderId |
| welcome | No | variables | customerName, storeName |
Newlines and tabs inside a value are collapsed to a single space and runs of four or more spaces are shortened, because Meta rejects such parameters with error 132000. Values are then trimmed.
What the customer receives
These are the exact approved bodies.
Under each one is that body rendered with the catalog's own example values, as it arrives on the customer's phone, *text* is bold in WhatsApp, not asterisks.
Hi {{1}}, your order *{{2}}* is confirmed! ✅
Order total: Rs.{{3}}
Track your order here: {{4}}
We'll message you as soon as it ships. Thank you for shopping with us!Hi Alex, your order #ORD-12345 is confirmed! ✅
Order total: Rs.1,499.00
Track your order here: https://example.com/track/ORD-12345
We'll message you as soon as it ships. Thank you for shopping with us!
order_confirmation message, shown with its approved example values.📦 Update on your order *{{1}}*: the status is now *{{2}}*.
Track it here: {{3}}
Thanks for your patience!📦 Update on your order #ORD-12345: the status is now Packed.
Track it here: https://example.com/track/ORD-12345
Thanks for your patience!
order_status message, shown with its approved example values.🚚 Good news, your order *{{1}}* has shipped!
Tracking number: {{2}}
Track your shipment: {{3}}
It is on its way to you.🚚 Good news, your order #ORD-12345 has shipped!
Tracking number: AWB123456789
Track your shipment: https://example.com/track/AWB123456789
It is on its way to you.
order_shipped message, shown with its approved example values.🛵 Your order *{{1}}* is out for delivery and should arrive today.
Track it live: {{2}}
Please keep your phone reachable.🛵 Your order #ORD-12345 is out for delivery and should arrive today.
Track it live: https://example.com/track/ORD-12345
Please keep your phone reachable.
out_for_delivery message, shown with its approved example values.🎉 Your order *{{1}}* has been delivered. We hope you love it!
Tell us how we did: {{2}}
Thank you for shopping with us.🎉 Your order #ORD-12345 has been delivered. We hope you love it!
Tell us how we did: https://example.com/review/ORD-12345
Thank you for shopping with us.
order_delivered message, shown with its approved example values.Your order *{{1}}* has been cancelled. Reason: {{2}}.
Any payment already made will be refunded as per our refund policy. Contact us if you need help.Your order #ORD-12345 has been cancelled. Reason: Requested by customer.
Any payment already made will be refunded as per our refund policy. Contact us if you need help.
order_cancelled message, shown with its approved example values.💳 We've received your payment of Rs.{{2}} for order *{{1}}*.
Your order is now confirmed and being processed. Thank you!💳 We've received your payment of Rs.1,499.00 for order #ORD-12345.
Your order is now confirmed and being processed. Thank you!
payment_received message, shown with its approved example values.💰 A refund of Rs.{{2}} for your order *{{1}}* has been processed.
Please allow 5-7 business days for it to reflect in your account.💰 A refund of Rs.1,499.00 for your order #ORD-12345 has been processed.
Please allow 5-7 business days for it to reflect in your account.
refund_processed message, shown with its approved example values.The remaining bodies, invoice, return_requested, return_approved and welcome, are shown in full on each event's card in the dashboard, and in the Event catalog.
Wiring up a store
Every event is configured on WhatsApp → Events in wp-admin. Each card has an on/off toggle, a Triggers field, a Send to field (default {billing_phone}), a Delay (minutes) and a Template variables table where each row is labelled with its {{n}} position and its catalog variable name.
Values are merge-tag expressions. The defaults are already filled in, {order_number}, {order_total}, {customer_first_name}, {order_url}, {tracking_number}, {tracking_url} and so on. A full reference sits behind the Merge tag reference panel on the same screen.
Money tags render without the currency symbol on purpose, since the approved template already prints the currency word.
Which events are on out of the box: order_confirmation, order_status, order_cancelled, order_shipped and order_delivered. Everything else, including out_for_delivery, payment_received, invoice, return_requested and return_approved, starts switched off.
Custom order statuses
Stores add their own statuses, packed, rto, ready-for-pickup, and the plugin supports them without any code.
On WhatsApp → Events, each event card has a Triggers field holding a comma-separated list of order statuses. Type the slug in, without the wc- prefix. The screen prints an Available: line listing every status registered on your site, so you can copy the exact slug.
processing, on-hold, packed, ready-for-pickuporder_status is the event built for this: it sends the status itself as orderStatus, so one template covers every custom status you add. Its default triggers are processing and on-hold.
The other events' default triggers are: order_cancelled → cancelled, failed; order_shipped → shipped; out_for_delivery → out-for-delivery; order_delivered → completed, delivered; refund_processed → refunded; return_requested → return-requested; return_approved → return-approved. Several events also use pseudo-triggers that are not statuses at all, new_order, payment_complete and invoice_created.
Where the tracking number comes from
Every shipment-tracking plugin invented its own meta key, so the {tracking_number} and {tracking_url} tags check the common ones in turn and take the first non-empty result.
WooCommerce Shipment Tracking (the official one)
Read from_wc_shipment_tracking_items, which holds an array, the most recent entry is used, giving the number, the provider and the link. If that entry carries no link, the plugin's own formatter is called to build one.Single-value keys, in order
_tracking_number,_aftership_tracking_number,_shiprocket_awb,_awb_code,awb_code,_wc_shipment_tracking_number. These cover Advanced Shipment Tracking, AfterShip, Shiprocket, ClickPost and several India-focused logistics plugins.Tracking URLs, in order
_tracking_url,_aftership_tracking_url,_shiprocket_tracking_url,_wac_tracking_url. If none is set,{tracking_url}falls back to the customer's order page rather than sending an empty link.Anything else
A store on an exotic plugin can supply the values through thewac_order_trackingfilter instead of switching plugins.
Because these keys are written by the tracking plugin at the default hook priority, the notification hooks run at priority 20, late enough that the tracking number is already saved when the shipping message is built.
Invoice numbers
{invoice_number} follows the same pattern: _wcpdf_invoice_number, _bewpi_invoice_number, _wac_invoice_number, _invoice_number, falling back to the order number.
When it does not fire
- The template is not approved. 409, code
TEMPLATE_NOT_APPROVED. The single most common failure on a new account. - The number is not registered on the Cloud API. 502, Meta error
133010. Every event fails, not just this one. - The event is switched off. Nothing is attempted, and in WooCommerce nothing is even logged. The check runs before the log row is written.
- The order has no usable phone number. Logged as skipped with
No usable phone number for this customer. - The number is on the opt-out register. Logged as skipped with
Recipient has opted out of WhatsApp messages.An opt-out beats every consent mode and every category. See Contacts and opt-outs. - Consent mode is “required” and the customer never opted in. Skipped with
Consent mode is set to "explicit opt-in required" and this customer has not opted in. - The customer declined. Skipped with
Customer declined WhatsApp updates. - It has already been sent. The deduplication key, typically
<event>:<orderId>, ororder_status:<orderId>:<status>:<event>for a status change , is a unique index on the delivery log. A duplicate is refused withThis notification has already been sent.and leaves no second log row at all. All three of WooCommerce's new-order hooks share one key on purpose, so a checkout that fires more than one of them still sends a single message. - The plugin is not connected. No API key means
Growcord WhatsApp is not connected. Add an API key under WhatsApp → Settings. - The phone number could not be read as an international one. A national number is not guessed at; the send is refused.
- Credits ran out. 402. Nothing is sent and nothing is spent.
Cost
Every event on this page is UTILITY, the cheapest billable category. Under the shipped default rate card that is 1 credit to an Indian number and 6 elsewhere, against 8 and 18 for a marketing message. A skipped send costs nothing: no platform call is made at all. A send that fails is refunded automatically.
