Intempt Docs
GuidesCustomer Data PlatformWebhooks

WooCommerce webhook

Collect orders, customers, products and coupons from your WooCommerce store.

Research Preview. This connector is rolling out account by account. Ask your Intempt contact to enable it for your workspace.

The WooCommerce webhook collects store activity: orders placed and paid, customers created, products published and changed, coupons created.

For a WooCommerce store this is the purchase spine. Order status transitions (paid, cancelled, fulfilled, refunded) all arrive here, and Intempt derives the commerce events from them.

Available events

WooCommerce core ships sixteen webhook topics. Intempt subscribes to all of them and derives the rest.

TopicDescriptionIntempt events
customer.createdCustomer account createduser_created
customer.updatedCustomer profile changeduser_updated
customer.deletedWordPress user deleteduser_deleted
order.createdOrder placedorder_created, checkout_completed, discount_applied when coupon lines are present
order.updatedAny order change, including every status transitionorder_edited, and order_paid, order_cancelled, order_fulfilled, order_refunded, refund_created by status
order.deletedOrder trashedorder_deleted
order.restoredOrder restored from trashReverses order_deleted
product.createdProduct createdproduct_created
product.updatedProduct changed, including stockproduct_updated, and inventory_level_updated, variant_in_stock, variant_out_of_stock from stock deltas
product.publishedProduct moved to publishedproduct_published
product.deletedProduct trashedproduct_deleted
product.restoredProduct restored from trashReverses product_deleted
coupon.createdCoupon createddiscount_created
coupon.updatedCoupon changeddiscount_updated
coupon.deletedCoupon trashedNot mapped
coupon.restoredCoupon restoredNot mapped

Each event is normalised onto a named stream, so you build segments and journey triggers on the event name rather than on the payload shape.

Three payload facts that change what you can build:

  • *.deleted payloads are {"id": 42} and nothing else. No email, no status, no timestamp. For orders and products the topic fires on trash, not on permanent delete, and *.restored reverses it. Intempt records the deletion against the record it already holds and stamps receipt time. customer.deleted is the exception: WordPress users have no trash, so that one is a hard delete.
  • product.published needs WooCommerce 10.8.0 or later. Older stores never fire it. product.created and product.updated work on every version.
  • Payloads carry current state only. There's no previous status on order.updated. Intempt derives the status transition by comparing against the last state it holds for that order.

Product reviews have a REST resource but no webhook topic, so product_review_created arrives from the historical load and scheduled reads, not live.

Identity

The identity key is order.billing.email. A logged-in shopper also carries customer_id; a guest checkout has customer_id = 0 and resolves on email alone.

Product and coupon events have no person on them. WooCommerce products have no owner, subscriber or waitlist, so a back-in-stock audience is the set of past buyers of that product, read from the Orders API. WooCommerce core has no waitlist; a real notification list needs an extension.

Endpoint

The collector path for WooCommerce events is:

https://<your collector host>/webhooks/events/woocommerce

WooCommerce signs each delivery with the secret you set on the webhook: X-WC-Webhook-Signature is an HMAC-SHA256 of the raw body, base64-encoded. Intempt verifies it against the source secret and rejects a delivery that doesn't match. X-WC-Webhook-Delivery-ID is used as the idempotency key, so a redelivery never double-counts.

Historical load

Connecting WooCommerce runs a one-time historical load before the webhook takes over. It covers: Customers, orders (with refunds), products and coupons over the wc/v3 REST API.

Deleted records can't be listed, so history holds what existed at connect time. The connector reports connected only once that load finishes, so a complete profile is never mistaken for a partial one. Records that arrive in the overlap between the load and the first webhook event are de-duplicated on the record id and X-WC-Webhook-Delivery-ID.

Backfilled records do not trigger journeys, workflows or experiments.

Setup

WooCommerce webhooks are created one per topic under WooCommerce Settings. Sixteen topics means sixteen webhooks, all pointing at the same endpoint with the same secret. Create the source in Intempt first.

Configure WooCommerce

  1. Create a WooCommerce source on the Integrations page and copy the endpoint URL and secret.

  2. In WordPress admin, go to WooCommerce, Settings, Advanced, then Webhooks, and click Add webhook.

  3. Name it after the topic, set Status to Active, pick the Topic, paste the Intempt endpoint as the Delivery URL and the Intempt secret as the Secret. Leave API version at WP REST API Integration v3.

  4. Save, then repeat for each topic in the table above.

  5. Place a test order and confirm order.created appears in the Intempt event stream, then move it to Completed and confirm order.updated follows.

WooCommerce disables a webhook after repeated delivery failures and marks it Disabled in the list. If events stop, check that column first.

On this page