Fixed prices, paid once·Written replies within one working day
CheckoutLoom.

Marketing and retentionWin shoppers back

View all marketing →

Support and order careAnswer faster

View all support →

Product contentBetter listings

View all product content →

Inventory and pricingPrices and suppliers

View all inventory →

Finance and riskMoney and disputes

View all finance →

Shopify and WooStore-specific

View all services →

Dropshipping and EtsyMarketplaces and print

View all services →

Explore everything

Pick a way in. Every page has a fixed price and a delivery window.

All services88 automations for storesAll platformsShopify, WooCommerce and moreAll integrations82 tools we connectRequest a quote →

ShopifyStore platform

View all Shopify →

WooCommerceStore platform

View all WooCommerce →

BigCommerceStore platform

View all BigCommerce →

WixStore platform

View all Wix →

AmazonMarketplace

View all Amazon →

EtsyMarketplace

View all Etsy →

eBayMarketplace

View all eBay →

Your platform

Automation built for the store or marketplace you already sell on.

Store platforms8 platformsMarketplaces11 marketplacesAll who we serve363 pagesRequest a quote →

DropshippersSeller type

View all dropshippers →

DTC brandsSeller type

View all dtc brands →

Handmade sellersSeller type

View all handmade sellers →

Subscription boxesSeller type

View all →

B2B and wholesaleSeller type

View all b2b and wholesale →

AgenciesSeller type

View all agencies →

PrintfulPrint-on-demand

View all Printful →

Your kind of store

Pages written for how each type of seller actually works.

Seller types14 types of sellerPrint-on-demand9 platformsPopular audiences20 moreRequest a quote →

Email and SMSKlaviyo, Mailchimp and more

View all email and sms →

Support and chatGorgias, Zendesk and more

View all →

Payments and accountingStripe, QuickBooks and more

View all →

Shipping and suppliersShipStation, DSers and more

View all →

Reviews, ads and creativeJudge.me, Meta Ads and more

View all →

Automation and dataZapier, Make, Sheets

View all →

Marketplace and feed toolsGoogle Merchant, Helium 10

View all →

Works with your tools

We build inside the apps you already pay for.

All integrations82 toolsEmail and SMSKlaviyo, MailchimpPaymentsStripe, QuickBooksRequest a quote →

How-to guidesStep by step

View all 63 how-to guides →

Templates and checklistsCopy and use

View all 68 templates →

ComparisonsTools and options

View all 44 comparisons →

Cost and ROIWhat it costs

View all 34 cost pages →

GuidesLong reads

View all 14 guides →

Compliance and riskRules in plain words

View all →

Glossary and statisticsTerms and numbers

View all 17 →

Learn before you buy

Guides, templates and honest comparisons, free to use.

Resources hub256+ free resourcesBlogPractical articlesStatisticsSourced numbersRequest a quote →
Checkout Loom blog

WooCommerce webhooks: setup, security, delivery and why they sometimes stop firing

How WooCommerce webhooks work, how to create and secure them, what happens when delivery fails and how to build automations that survive duplicates and outages.

  • 8 minute read
  • Written for store owners
  • Sources named
ShopifyZapierKlaviyoStripeMakeYour store

WooCommerce sits on WordPress, which means many of your automations ultimately depend on one thing: being told promptly when something happens. A new order should reach the warehouse, a refund should reach accounting and a stock change should reach the marketplace. The mechanism WooCommerce offers for that is the webhook, and it is useful and fussier than it looks.

This guide explains how webhooks work in WooCommerce, how to set them up and secure them, what delivery looks like, why they sometimes stop firing and how to design the receiving side. It complements Shopify webhooks explained, since the principles carry over, and duplicate orders and idempotency. Check WooCommerce’s documentation for current options, as versions differ.

What a webhook is

A webhook is a message from one system to another, sent when an event occurs. Instead of your automation asking WooCommerce every minute whether anything changed, WooCommerce sends the details the moment it happens. The message is an HTTP POST to a URL you supply, carrying the resource as JSON and headers that identify the event and carry a signature.

ApproachHow it worksProsCons
WebhookWooCommerce pushes the event to your URLFast, efficient, event-drivenDelivery can fail or repeat; endpoint must be available
Polling the REST APIYou ask for changes on a scheduleSimple and under your controlDelay, more load, easy to miss changes between runs
Hooks in custom codeA plugin reacts inside WordPressNo network hopNeeds development and maintenance
BothWebhook for speed, scheduled check for safetyResilientSlightly more to build

Available topics

WooCommerce provides topics for common resources: orders, products, customers and coupons, each with created, updated, deleted and restored events, and you can add custom action topics. Choose the narrowest topic that serves the purpose. An “order updated” webhook fires on many changes, including status transitions, notes and edits, so your handler needs to ignore ones that do not matter.

TopicUse it forWatch for
Order createdSending new orders to fulfilment or accountingMay fire before payment completes, depending on gateway and status
Order updatedStatus changes, refunds, editsFires often; compare status before acting
Order deletedCleaning external recordsTrashing versus permanent deletion
Product updatedSyncing catalogue changes to feeds and marketplacesStock changes may not trigger it in all cases
Customer createdSyncing contactsConsent and privacy rules
Coupon eventsSyncing discount codesRarely needed

Create a webhook

  1. In the WordPress admin, open WooCommerce settings, Advanced, then Webhooks, and add a webhook.
  2. Give it a clear name, such as “Orders to fulfilment (production)”.
  3. Set the status to Active. Choose the topic.
  4. Enter the delivery URL, which must be reachable by your server over HTTPS.
  5. Set a strong secret and store it securely in the receiving system.
  6. Select the API version that your receiving code expects.
  7. Save, then trigger a test event, such as a test order, and confirm delivery.

Use separate webhooks for staging and production, and separate secrets. A webhook that sends test orders to a live fulfilment system is a classic and expensive mistake.

Verify the signature

Anyone who finds your endpoint URL can send it data. WooCommerce signs each delivery with a header containing a hash of the body made with your secret. The receiving code recomputes the hash from the raw body and compares it, using a constant-time comparison, before doing anything. Verify against the raw bytes received, not a re-serialised version of the JSON, because even a harmless difference in spacing changes the hash. Reject requests that fail, and log them. Also keep the endpoint URL non-obvious, restrict methods and avoid exposing details in error messages.

Receive and respond

  1. Read the raw body and headers.
  2. Verify the signature.
  3. Check the topic header and the event id or resource id.
  4. Write the event to a queue or table.
  5. Return a 200 response quickly.
  6. Process from the queue in a worker, with retries and logging.

Doing slow work inside the request, such as calling several APIs, risks a timeout, which WooCommerce counts as a failure. Accept first, process after. If you use a tool such as n8n, Make or Zapier as the receiver, the same principle applies: respond early where the tool allows and keep downstream steps robust. See n8n with Shopify for patterns that apply equally to WooCommerce.

Delivery, failures and disabling

WooCommerce delivers webhooks through its background scheduling system, so delivery is not instantaneous and depends on that system running. If the receiving URL returns an error or does not respond, WooCommerce records the failure and retries, and after a number of consecutive failures it can set the webhook to disabled. A disabled webhook silently stops sending events, which explains many reports of webhooks that “stopped working”. Check the webhook list for status and review the logs.

SymptomLikely causeFix
Webhook status is disabledRepeated delivery failuresFix the endpoint, then set it to active
No deliveries at allScheduler not running, WP-Cron disabled without a real cron, or caching/security plugin blockingRun the scheduler on a real cron; check logs
Delay of several minutesScheduler runs on traffic or low frequencyUse a system cron to trigger the scheduler regularly
Receiver sees duplicatesRetries, multiple updates or two webhooks configuredIdempotent handling; remove duplicate webhooks
Signature mismatchWrong secret or re-serialised bodyUse raw body and the correct secret
Endpoint blockedFirewall, bot protection or rate limitingAllow the sender or use a non-blocked route
Payload missing dataEvent fired before data was savedFetch the full resource through the API when needed

Make handlers safe to run twice

Assume every event can arrive more than once, out of order or late. Store the resource id and a version or modified time, and skip events older than what you have already processed. Use the order id as the unique key when creating records elsewhere. For actions with side effects, such as sending an email or creating a purchase order, record that you did it and check first.

Add a safety net

Even a well-built webhook setup will occasionally miss an event. A scheduled job that asks the REST API for orders modified in the last hour and compares them with what you have processed catches the gaps. It is cheap, simple and the difference between occasional silent loss and none. Alert if the number of webhook events in a period is much lower than the number of orders. Our guide to monitoring store automations shows how to build such checks.

Security and privacy

  • Use HTTPS endpoints only.
  • Keep secrets out of code repositories and logs.
  • Send only the topics and fields the receiver needs; avoid forwarding personal data to systems that do not require it.
  • Restrict who can create and edit webhooks in the admin.
  • Rotate secrets when staff leave.
  • Delete webhooks you no longer use.

Testing a webhook setup before you rely on it

Before you trust a webhook with real orders, run a short test plan in a staging copy of your store. Place a test order and confirm that the delivery arrives, that the signature verifies and that the payload contains the fields you expect. Change the order status and check that the update event arrives once, not three times. Take your receiving endpoint offline for ten minutes, create two orders and confirm that your catch-up check finds them afterwards. Disable the scheduler on purpose to see how long deliveries are delayed. Record the results in your runbook. These small tests take an afternoon and show you exactly how the system behaves when something goes wrong, which is when you will need that knowledge.

A worked example

A WooCommerce store with 40 orders a day sends “order created” and “order updated” to its fulfilment system. A hosting change disabled the background scheduler, and webhooks stopped for two days before anybody noticed. Orders worth about $4,800 were delayed by one to two days, leading to roughly 12 complaints and four refunds of $60. Adding a scheduled check that compares recent orders with fulfilled ones, plus an alert if no webhook has arrived in two hours during the day, would cost an afternoon of work and would have flagged the issue in two hours. The numbers are illustrative; the lesson is the value of an independent check.

When to get help

Simple webhooks to an automation platform are within reach of most store owners. Once money, stock or customer messages depend on them, a documented build with signature checks, queues, retries and monitoring is worth having. See our ecommerce workflow automation and automation and data integrations services.

Sources and further reading

Figures and rules in this guide come from the primary pages below. Platform limits and prices change, so open the page before you build on a number.

Questions

8 questions readers ask about this topic

What is a WooCommerce webhook?

An HTTP request that WooCommerce sends to a URL you choose when an event, such as an order being created, occurs.

How do I set up a webhook in WooCommerce?

Go to WooCommerce, Settings, Advanced, Webhooks, add one with a topic, delivery URL and secret, set it to active and test with a sample order.

Why did my WooCommerce webhook stop firing?

Common causes are a disabled status after repeated failures, a stopped scheduler, a blocked endpoint or a caching or security plugin.

Do webhooks fire instantly?

Not always. WooCommerce uses a background scheduler, so delivery can be delayed if it runs infrequently.

How do I verify a WooCommerce webhook signature?

Recompute the hash of the raw request body with your secret and compare it with the signature header using a constant-time comparison.

Can a webhook arrive twice?

Yes. Retries and multiple updates can cause duplicates, so handlers should be idempotent.

Should I use webhooks or the REST API?

Use webhooks for speed and a scheduled REST API check as a safety net.

Can Checkout Loom build WooCommerce webhook automations?

Yes. We build and monitor them with signature checks, queues, retries and alerts.

Webhooks you do not have to babysit

Signed, queued, retried and monitored, with a safety-net check that catches what they miss.

  • Fixed price, paid once
  • Built inside your tools
  • Thirty days of fixes