WooCommerce order notifications with a sound you can't miss
WooCommerce emails you about new orders, and that email lands in the same inbox as everything else. WooCommerce also has webhooks built in – no plugin required – and pointing one at your phone takes about two minutes.
WooCommerce has webhooks built in
This surprises a lot of shop owners who go looking for a notification plugin first. Webhooks are part of core WooCommerce, under WooCommerce → Settings → Advanced → Webhooks. Select Add webhook and you get a short form:
- Name – a label for you. Leave it blank and it gets a timestamped default.
- Status – Active delivers, Paused stops temporarily, Disabled means it was stopped because of failures.
- Topic – the triggering event. Coupon, customer, order and product events are available, plus Action for arbitrary WordPress hooks. Extensions can add more.
- Action Event – only shown when Topic is Action; here you name a hook such as
woocommerce_add_to_cart. - Delivery URL – where the payload goes.
- Secret – used to hash each delivery; the hash travels in the request headers. Left blank, it defaults to the current API user's consumer secret.
Saving a webhook as Active sends a ping to the delivery URL straight away, so you'll know immediately whether it works.
Point it at your phone
A Webhooky endpoint is a URL that accepts any HTTP POST and turns it into a push notification. That's exactly what WooCommerce wants in the Delivery URL field:
- In the Webhooky app, create an endpoint. Call it Shop order, set the message to something like “New order in the shop”, pick the
cash_registerorka_chingsound, copy the URL. - In WordPress, go to WooCommerce → Settings → Advanced → Webhooks → Add webhook.
- Set Status to Active, pick the Order created topic, paste your URL into Delivery URL and save.
WooCommerce POSTs the full order as JSON. Webhooky doesn't need to read it – because the body has no title or message field, it falls back to the title, text and sound you configured. Your phone rings with a cash register the moment an order comes in, on every device you're signed in on.
One detail that matters more here than elsewhere
WooCommerce treats any response other than 2xx, 301 or 302 as a failure, and after more than five consecutive failures it disables the webhook automatically. That's a genuinely nasty failure mode: your order notifications stop, quietly, and nothing tells you. (The threshold can be changed with the woocommerce_max_webhook_delivery_failures filter, but most people never touch it.)
This is why Webhooky always answers 200 – including when you've used up the free tier's 100 notifications. You get a separate alert telling you the limit is reached, but WooCommerce keeps seeing a healthy endpoint and never disables the webhook. If you ever point a Woo webhook at something that returns 402 or 500 when it's unhappy, check its status in the Webhooks list after a few days.
Which topics are worth their own endpoint
Create one endpoint per topic and give each its own sound – that's what makes this better than email:
- Order created – the cash register. The one everybody wants.
- Order updated – useful if you care about status changes, noisy if you don't.
- Customer created – a quieter sound; nice for knowing the shop is growing.
- Product updated – worth it if several people edit the catalogue and you want to notice.
- Action →
woocommerce_low_stock– restock before a product goes out of stock.
If you want the order number and the total
The notification above says "an order arrived". For "#1482 · €74.90" something has to read the payload, which means a small handler in between. WooCommerce sends the whole order object, so there's nothing to fetch – just reshape and forward:
export async function onWooOrder(req, res) {
res.sendStatus(200); // ack first - five failures disables the hook
const order = req.body;
await fetch(process.env.WEBHOOKY_URL, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
title: "🛒 New order",
message: `#${order.number} · ${order.total} ${order.currency}`,
sound: "cash_register",
}),
});
}
Acknowledge before you do the work, for the same reason as above – a slow handler counts as a failed delivery, and five of those turn the webhook off.
No code at all? Zapier, Make or IFTTT
If you'd rather not touch the Advanced settings, every major automation tool has a WooCommerce trigger. Build the trigger on a new order, add a Webhooks → POST action pointing at your Webhooky URL, and map the order number and total into the message. You get the details without writing anything; the trade-off is that these poll on a schedule, so expect minutes rather than seconds.
Why not just use the order emails?
Most shop owners run both. Email is the record; a push with its own sound is the alert. The difference shows up on a Saturday afternoon when you're not at the desk – an email is one of forty, a cash register is unmistakable. Each endpoint also keeps its own history, so you can scroll back through what came in and when, and there's no account to create: install the app, make an endpoint, paste the URL.
Frequently asked questions
Does WooCommerce have webhooks without a plugin?
Yes. Webhooks are part of core WooCommerce, under WooCommerce → Settings → Advanced → Webhooks. No extension is needed for order, customer, coupon and product topics.
How do I get a push notification for a new WooCommerce order?
Add a webhook with the Order created topic and set its Delivery URL to a URL that notifies you. A Webhooky endpoint turns that POST into a push with your own sound and needs no server or plugin.
Why did my WooCommerce webhook stop working?
WooCommerce counts any response other than 2xx, 301 or 302 as a failure and disables a webhook automatically after more than five consecutive failures. Check its Status in the Webhooks list – if it says Disabled, that's why.
Can I get a sound for new WooCommerce orders?
Not from the order emails, but yes via a webhook. Point the Order created topic at a notification endpoint that supports sounds and assign a cash register to it; Webhooky has 40 sounds to choose from, set per endpoint or per message.