Guide · For businesses
How to automate WhatsApp order notifications from WooCommerce (confirmation, shipped, delivered)
A step-by-step set-up that sends an approved WhatsApp template when a WooCommerce order is placed and when its status changes, with the exact field mapping, phone-number fixes and the traps to avoid.
By Broadchat teamPublished 8 min read
In short
WooCommerce can call a URL whenever an order is created or updated. Point a WooCommerce webhook at a Broadchat workflow's Custom Webhook URL, clean the billing phone number into 91XXXXXXXXXX format, route by order status, and send an approved utility template for each stage. Store the last status you notified on the contact so repeated 'order updated' events do not send duplicates, and only message customers who agreed at checkout.
Key takeaways
- WooCommerce's own webhooks (WooCommerce → Settings → Advanced → Webhooks) are the trigger; no plugin is required.
- Use one workflow for Order created and another for Order updated, with a router that sends a template only for the statuses you care about.
- Checkout phone numbers rarely include the country code; the formula 91slice(parseNumber(...);-10) fixes Indian numbers.
- Order updated fires on many edits, so save the last notified status on the contact and skip repeats.
- Order and shipping messages are utility templates; keep them free of offers or Meta may recategorise them as marketing.
Send WhatsApp order notifications from WooCommerce
Time needed: 1 h 30 min. You will need: WordPress admin access to your WooCommerce store, Broadchat panel with Automations and a connected WhatsApp number.
Get the order templates approved
Create utility templates for order confirmation, shipped (with a tracking URL button) and delivered in CRM → WhatsApp Templates, with realistic sample values, and wait for approval.
Create the workflow and webhook URL
In Automations → Workflow create a workflow, add the Custom Webhook trigger, generate the hook and copy the Webhook URL.
Add the webhook in WooCommerce
In WooCommerce → Settings → Advanced → Webhooks click Add webhook, set Status Active, Topic Order created, paste the URL as Delivery URL and save.
Capture a real order
Click Capture Incoming Webhook in the workflow, place a test order with your own number, then Show Received Data to see billing, number and total fields.
Clean the number and send the confirmation
Add Send Template Message (V2) with WhatsApp Number 91slice(parseNumber({{1.billing.phone}});-10) and map name, order number and total to the template variables.
Add status updates without duplicates
Create a second workflow for the Order updated topic, route by {{1.status}}, compare with a last_notified_status custom field and send the matching template only once.
Go live and monitor
Activate both workflows, place real test orders through each status, and check the run history and WooCommerce's webhook delivery log.
How the pieces fit
WooCommerce WhatsApp order notifications need three things: an event from the store, something that turns it into a WhatsApp message, and an approved template. WooCommerce supplies the event through its built-in webhooks: when an order is created or updated, it POSTs the order as JSON to a URL you choose. A Broadchat workflow receives it, cleans the data and sends a template from your WhatsApp number.
Broadchat's WooCommerce integration syncs products and creates orders from WhatsApp chats, but it does not receive orders placed on your website. That is what this guide adds. Shopify stores follow the same webhook pattern; see the Shopify integration for what is native there.
Step 1: get the order templates approved
Business-initiated messages need approved templates. Create three Utility templates in CRM → WhatsApp Templates for Rangoli Home, an online home-decor store:
| Template | Body | Button |
|---|---|---|
| order_confirmed | Hi {{1}}, thank you for your order {{2}} of {{3}} at Rangoli Home. We will message you here when it ships. | none |
| order_shipped | Hi {{1}}, your Rangoli Home order {{2}} has been shipped with {{3}}. Track it with the button below. | URL: Track order, https://rangolihome.in/track/{{1}} |
| order_delivered | Hi {{1}}, your order {{2}} has been delivered. Reply here if anything is not right and we will help. | none |
Submit them with realistic samples (Priya, #48213, ₹2,349). Utility templates must not promote anything; "Use code WELCOME10 on your next order" turns a confirmation into marketing. Meta's review can take up to 24 hours. The order update templates have more approved-style variants.
Step 2: create the workflow and webhook URL
- Open Automations → Workflow and click Create Workflow; rename it "Woo: order created".
- Click Add Trigger, choose Webhook → Custom Webhook, enter a Webhook Title and click + Generate Hook.
- Copy the Webhook URL (
https://<your panel domain>/api/automations/hook/<token>). Treat it like a password.
Step 3: add the webhook in WooCommerce
- In WordPress, open WooCommerce → Settings → Advanced → Webhooks and click Add webhook.
- Name: Broadchat order created. Status: Active. Topic: Order created.
- Delivery URL: the Webhook URL from step 2. API version: the latest WP REST API version offered.
- Click Save webhook.
On save, WooCommerce sends a small "ping" containing only webhook_id. The Custom Webhook accepts it (it takes JSON and form-encoded bodies), but it is not an order, so do not map fields from it.
Step 4: capture a real order
In the workflow, click Capture Incoming Webhook, then place a test order on your store with your own mobile number (a cash-on-delivery order you cancel later is fine). When the data arrives, click Show Received Data. The fields you will use most:
| WooCommerce field | Mapping | Example |
|---|---|---|
| Customer first name | {{1.billing.first_name}} | Priya |
| Phone | {{1.billing.phone}} | 98290 12345 |
| Order number | {{1.number}} | 48213 |
| Total and currency | {{1.total}}, {{1.currency}} | 2349.00, INR |
| Status | {{1.status}} | processing |
| Payment method | {{1.payment_method_title}} | Cash on delivery |
Step 5: clean the number and send the confirmation
Checkout phone fields are typed by customers, so you will see 9829012345, 09829012345 and +91 98290 12345. WhatsApp needs digits with the country code. Add CRM → Send Template Message (V2) and map:
| Field | Value |
|---|---|
| Select Channel / Select Template | your number / order_confirmed |
| WhatsApp Number | 91slice(parseNumber({{1.billing.phone}});-10) |
| Variable 1 | {{1.billing.first_name}} |
| Variable 2 | #{{1.number}} |
| Variable 3 | ₹{{1.total}} |
parseNumber keeps only digits, slice(…;-10) keeps the last ten, and 91 adds India's country code. If you also ship abroad, put a Basic Router before the send with a filter on {{1.billing.country}} is IN for this formula, and map the international path as parseNumber({{1.billing.phone}}) after making the phone field require a country code.
Before the send, you can also add CRM → Create / Update Contact (same number formula, Name {{1.billing.first_name}} {{1.billing.last_name}}) and Assign Tags to Contact (Creates Tag if Tag not exist) with customer and src-woocommerce, so buyers appear in CRM → Contact for later segments. For cash-on-delivery orders, a confirm-or-cancel flow reduces returns; see COD order confirmation.
Step 6: add status updates without duplicates
Create a second workflow, "Woo: order updated", with its own Custom Webhook, and a second WooCommerce webhook with Topic Order updated. WooCommerce fires this topic on many edits (a note, an address correction, a status change), so the workflow must decide when to message:
- CRM → Create / Update Contact with the cleaned number, so the contact exists.
- CRM → Get Single Custom Field of a Contact for a Super Field
last_notified_status(create it first in CRM → Super Field). - Basic Router with one path per status you notify, each with two filter conditions joined by AND:
{{1.status}}is completed (or your shipped status), AND the field value from step 2 is not completed. - On each path: Send Template Message (V2) with the matching template, then CRM → Update a Custom Field setting
last_notified_statusto the new status.
Plain WooCommerce has no separate "shipped" status; many stores use a shipment-tracking plugin or a custom status, and the tracking number and courier are stored as order meta. Look in the captured sample for where your plugin puts them, and map the courier name and tracking id into order_shipped. If the last-notified check is skipped, a customer can receive the same "delivered" message several times when staff edit the order, which is a fast way to collect blocks.
Step 7: go live and monitor
Switch both workflows to Active (an inactive workflow answers WooCommerce with 409, which WooCommerce logs as a failed delivery). Place one order and move it through each status. Then check:
- the workflow History: each run, each step's input and output, and errors such as "Enter the receiver WhatsApp number with country code";
- WooCommerce's webhook log (the webhook's edit page and WooCommerce → Status → Logs), which shows response codes; WooCommerce disables a webhook after repeated delivery failures, so fix errors quickly;
- the channel's messaging wallet, because template sends fail when the balance is too low.
| Problem | Likely cause | Fix |
|---|---|---|
| No run appears | Webhook disabled in WooCommerce or wrong URL | Re-enable it; paste the current Webhook URL |
| Run fails at the send | Template not approved for the selected channel, or variable count mismatch | Re-pick the template; map every variable |
| Same message twice | Order updated fired twice and no last-notified check | Add steps 2-4 of the status workflow |
| Wrong person messaged | Number without country code taken as another country | Use the number formula and the country router |
What it costs
Every order notification is a utility template, charged per delivered message even if the customer chatted with you that day: ₹0.115 per utility message to India (Meta rate card effective 1 Oct 2026, excl. GST). A store sending three updates per order pays three utility messages per order to Meta, plus your platform plan. Each workflow step also counts as a task. See WhatsApp API pricing and use the pricing calculator for your volumes.
For how workflows, triggers and webhooks work in general, read the WhatsApp automation workflows guide; for template rules, the WhatsApp message templates guide. Agencies that build WooCommerce stores can add WhatsApp notifications as a recurring service under their own brand with the white-label platform.
Sources
- Webhooks — WooCommerce, checked 12 October 2026
- WooCommerce REST API: orders — WooCommerce, checked 12 October 2026
- Template categorization — Meta for Developers, checked 12 October 2026
- Pricing on the WhatsApp Business Platform — Meta for Developers, checked 12 October 2026
Broadchat team · Product and partner success team
The people who build and support Broadchat, the white-label WhatsApp Business API platform. We write from what we see while onboarding partners and their clients on the official WhatsApp Cloud API, and we check every article against Meta's current documentation.
Last updated:
Frequently asked questions
Do I need a WooCommerce WhatsApp plugin?
No. WooCommerce's built-in webhooks can call a Broadchat workflow's Custom Webhook URL when an order is created or updated, and the workflow sends an approved WhatsApp template. A checkout-field plugin is useful only to add a WhatsApp consent checkbox.
Why do customers get the same order update twice?
WooCommerce's Order updated topic fires on many edits, not only status changes. Save the last status you notified in a contact custom field and send only when the new status differs, as described in this guide.
Are WhatsApp order notifications charged?
Yes. They are utility templates, charged per delivered message by Meta, including when sent inside an open 24-hour window since 1 Oct 2026. Keep them free of promotions so they stay in the utility category.
Can I send the tracking link in the WhatsApp message?
Yes. Use a utility template with a URL button whose link ends in a variable, such as your tracking page plus the order number, and map the order number or tracking id into that button variable in the send step.