WooCommerce WhatsApp Order Notifications: The Hook-by-Hook Setup
How to send WooCommerce order notifications on WhatsApp: which order hooks to listen on, why billing phone numbers break the send, and which notifications reach US customers.
WooCommerce sends WhatsApp order notifications by listening on a PHP action hook and posting an approved template to Meta's Cloud API. The hook is woocommerce_order_status_changed. The template has to be approved by Meta before you can send anything, and the phone number on the order almost certainly needs reformatting before Meta will accept it. Those three facts account for nearly every failed WooCommerce WhatsApp setup.
This guide walks the whole path, in the order you will actually hit it.
Why WooCommerce is different from Shopify here
Shopify pushes webhooks out to the internet. You give it an HTTPS endpoint and it posts JSON to you. WooCommerce does not work that way by default, because WooCommerce is a WordPress plugin running on your own server. It fires PHP action hooks inside your own process. Nothing leaves the building unless your code makes it leave.
That has one nice consequence and one nasty one. The nice one: you have the full order object in memory, so you never have to call back for details. The nasty one: your notification only fires if WordPress is actually executing, and WooCommerce's scheduled actions lean on WP-Cron, which historically fires on page views rather than on a real clock. On a low-traffic store, a delayed message can sit for hours waiting for someone to load a page. If timing matters, replace WP-Cron with a system cron entry. This is the single most common cause of "my WhatsApp notification arrived four hours late."
The hooks that matter
WooCommerce fires an action every time an order changes state. There are two useful shapes.
The general one is woocommerce_order_status_changed, which hands you the order ID, the status the order left, and the status it entered. Listen here if you want one function handling every transition, with a switch statement picking the template.
The per-status shortcuts are woocommerce_order_status_processing, woocommerce_order_status_completed, woocommerce_order_status_on-hold, woocommerce_order_status_cancelled, and so on. Listen here if you want one small function per message. There is also woocommerce_new_order, which fires when the order first lands, before payment has necessarily cleared.
A practical mapping for a US store:
woocommerce_new_orderbecomes "we got your order"woocommerce_order_status_processingbecomes "payment received, we are packing it"woocommerce_order_status_completedbecomes "shipped, here is your tracking number"woocommerce_order_status_on-holdbecomes "something needs your attention"woocommerce_order_status_cancelledandrefundedbecome the corresponding confirmations
Note what is missing from that list: abandoned cart. WooCommerce has no core concept of an abandoned cart and fires no hook for one. Every cart recovery plugin invents its own tracking on the checkout session and schedules its own reminder. Hold that thought, because it matters enormously for US stores.
The phone number problem
This is the failure that makes people give up and blame the plugin.
WooCommerce stores the billing phone as free text. There is no validation and no format enforcement. American customers type it however they think of it: (555) 010-1234, or 555-010-1234, or 555.010.1234, or 5550101234, and a stubborn few will type "call me at work."
Meta's Cloud API accepts exactly one format: E.164, meaning a plus sign, the country code, and the national number with nothing else. That is +15550101234. Hand it any of the strings above and the send fails.
So your integration needs a normalization step before it ever calls the API. Strip everything that is not a digit. If the result is ten digits and your store ships domestically, prepend the country code. If it is eleven digits starting with 1, prepend the plus. If it is anything else, do not guess. Log it, skip the send, and leave a note on the order, because a message sent to a mangled number is worse than no message: it either fails silently or it reaches a stranger.
When you evaluate a WooCommerce WhatsApp plugin, this is the question to ask before you ask about price. How do you normalize the billing phone? A plugin without a real answer will deliver perhaps half your notifications and you will spend a week thinking WhatsApp is broken.
Templates, and the category that decides everything
WhatsApp will not let a business open a conversation with free-form text. You write the message once with numbered placeholders, submit it, and Meta reviews it. Approval usually lands within a few hours. A WhatsApp Business Account can hold up to 250 templates, which is far more than a store needs.
When Meta approves the template it also assigns it a category, and the category it assigns is not necessarily the one you requested. Category governs two things: what the message costs, and whether it gets delivered at all.
Order and shipping updates are utility. Login codes are authentication. Anything promotional is marketing. The line is thinner than people expect. A shipping notification that ends with "and here's 15% off your next order" is not a shipping notification anymore. Meta will reclassify it as marketing, and for a US store that reclassification silently kills the message.
Keep the transactional templates surgically clean. Put the promotion somewhere else.
Which WooCommerce notifications actually reach a US customer
Since April 1, 2025, Meta has not delivered marketing-category template messages to United States phone numbers. The send fails with error 131049 on the Cloud API, or error 63049 if you route through Twilio. Meta has announced no resume date.
Everything in the transactional lifecycle is utility, so it delivers normally: order received, processing, shipped, on hold, cancelled, refunded, plus any one-time passcode. The abandoned cart reminder that sits at the top of every WooCommerce WhatsApp plugin's feature list is marketing, so it does not deliver. Neither does the restock announcement or the Black Friday broadcast.
The plugins are not lying about this so much as failing to mention it. Most were built for merchants in India, Brazil, Indonesia, and the Gulf, where WhatsApp marketing templates deliver fine and cart recovery on WhatsApp genuinely produces revenue. The plugin does exactly what it says there. Install it on a store in Denver and half the feature list quietly does nothing, while the dashboard still reports the messages as sent.
What a US store can do instead is work inside the windows. When a customer replies to any notification, a 24-hour customer service window opens, and inside it you can send free-form text, photos, and PDFs with no template and no message charge. That is where returns, sizing questions, and delivery problems get handled. And a click-to-WhatsApp ad opens a 72-hour window in which every message in both directions is free, which is the one compliant promotional channel available to a US merchant.
Reading the delivery receipt
Meta posts status callbacks back to your webhook: sent, delivered, read, or failed with an error code. Write them into the order notes. It costs an hour to build and it pays for itself the first time a customer calls about a package, because your support agent can see whether the shipping message was delivered and read, or whether it bounced.
The error codes worth recognizing:
- 131049 is the US marketing block. Your template is categorized marketing and the recipient is American. Nothing about the plugin will fix this.
- 131026 means the recipient's number is not on WhatsApp, or cannot receive the message. Common with landlines pulled from a billing field.
- 131047 means the 24-hour service window has closed and you tried to send free-form text. Send a template instead.
- Rate limit errors mean you exceeded your messaging tier, which starts at 250 unique recipients per rolling 24 hours for a new business portfolio.
Plugin, platform, or your own code
If order notifications are all you want, buy a plugin and stop reading. The official WooCommerce marketplace carries Notifications with WhatsApp, published by Array.codes, listed at €88 for a 1-year plan, and the WordPress directory has free and freemium options with narrower feature sets. Check the current listing before you buy, and note that the price is billed in euros even though your store sells in dollars.
Write your own hook if you have custom order statuses, unusual routing logic, or enough volume that a license fee looks silly next to an afternoon of work. The API call itself is a single POST.
Move to a platform when the messages need to fire regardless of whether anyone is loading pages on your site, when support replies need a shared inbox rather than one person's phone, or when marketing wants to segment the customer list instead of messaging all of it. That is the point where our WooCommerce WhatsApp integration earns its keep, and the same wiring on Shopify is covered in the Shopify WhatsApp integration guide.
One last operational note for anyone running a store at volume: the WhatsApp notification is the customer-facing half of your fulfillment loop, and the supplier-facing half tends to stay stuck in email. If restocking currently means digging a purchase order out of a thread, moving that to a system that tracks POs properly will save you more hours than the notification ever will.
Frequently asked questions
How do I send WooCommerce order notifications on WhatsApp?
Hook into woocommerce_new_order or woocommerce_order_status_changed, read the billing phone from the order and normalize it to E.164 format, then post an approved utility template to Meta's Cloud API with the order number and total as variables. Meta returns a delivery receipt, which you should write into the order notes.
Does WooCommerce have a built-in WhatsApp integration?
No. WooCommerce ships no WhatsApp channel of any kind. You connect one through a WordPress plugin, a hosted platform, or your own code calling Meta's Cloud API. Every route requires a WhatsApp Business Account and a phone number that is not currently active in the WhatsApp or WhatsApp Business app.
Why are my WooCommerce WhatsApp messages not delivering?
Three causes account for almost all of it. The billing phone was never normalized to E.164, so Meta rejected it. The template was classified as marketing rather than utility. Or the recipient is a US number and the template is marketing, which fails with error 131049. Check the error code on Meta's delivery callback before blaming the plugin.
Can I send WooCommerce abandoned cart messages on WhatsApp?
Not to US customers. WooCommerce has no core abandoned cart hook, so plugins build their own tracking, and the reminder they send is a marketing-category template. Meta has not delivered marketing templates to United States phone numbers since April 1, 2025. Outside the US it works, and inside the US you can recover carts within an open service window instead.
Which WhatsApp plugin is best for WooCommerce?
For order notifications alone, the official WooCommerce marketplace extension is the safest choice because it is maintained against WooCommerce releases. For campaigns, scheduling, and a shared inbox, a hosted platform on the Cloud API does considerably more. Ask any candidate how it normalizes billing phone numbers before you compare prices.
Do I need the WhatsApp Business API for WooCommerce?
Yes, for anything automated. The free WhatsApp Business phone app has no public API, so no plugin can send through it. You need a WhatsApp Business Account, and the phone number you register to it leaves the WhatsApp app permanently, so register a number you are prepared to move.