> Part of [WHCC Developer Documentation](https://www.whcc.com/developer/llms.txt)

**Legacy** This page is reference for integrations already built on the Order Submit API. It remains supported. New integrations use the [WHCC API](https://www.whcc.com/developer/docs/quick-start/index.html.md).

# Webhooks

Version 1.0 &middot; Updated 2026-10-07

Webhooks allow you to receive status updates on orders you have submitted as they move through the order lifecycle.

> Processing webhooks is very important, as otherwise you will not be notified of any issues that may prevent your orders from being processed.
>
> Registration here is for Editor API and Order Submit API integrations that already have Order Submit API credentials, and those integrations remain supported. WHCC no longer issues new credentials for this path. A new integration should use the [WHCC API](https://www.whcc.com/developer/docs/api/index.html.md) and its [Event Subscriptions](https://www.whcc.com/developer/docs/api/event-subscriptions/index.html.md).

> ## Webhook delivery is at-least-once &mdash; expect duplicates
>
> WHCC may send the same webhook notification more than once for the same order. This is normal, not a bug. Key on **(`ConfirmationId`, `SequenceNumber`, event type)** before acting on a notification, and treat a repeat as a reconcile rather than a discard &mdash; a later delivery can carry more data than the earlier one. See [Delivery, Retries & Idempotency](https://www.whcc.com/developer/docs/legacy/order-submit-api/webhook-delivery/index.html.md) for the full explanation, the retry schedule, and the response timeout.

## Two payload formats

WHCC sends webhooks in one of two formats, depending on when your integration was set up:

- **V2** &mdash; JSON request bodies. Documented in [Webhook Types](https://www.whcc.com/developer/docs/legacy/order-submit-api/webhook-types/index.html.md).
- **V1** &mdash; legacy, form-encoded (`application/x-www-form-urlencoded`) request bodies. Documented separately in [V1 Webhook Format](https://www.whcc.com/developer/docs/legacy/order-submit-api/webhook-v1-format/index.html.md).

Check the `Content-Type` header on an incoming webhook request if you're not sure which one you're receiving.

## Configuring webhooks is a two step process:

1. [Register](https://www.whcc.com/developer/docs/legacy/order-submit-api/webhook-register/index.html.md) a URI for WHCC to post webhook requests to.
2. [Verify](https://www.whcc.com/developer/docs/legacy/order-submit-api/webhook-register/#verify) the webhook URI belongs to you by returning a verification code WHCC sends to it immediately after registration.

## Testing your handler

Once your callback URI is registered and verified, the [Webhook Sandbox](https://www.whcc.com/developer/docs/legacy/order-submit-api/webhook-sandbox/index.html.md) lets you trigger a `Shipped`, `Processed` or `Order Cancelled` webhook on demand, without placing an order and waiting for it to ship. It is available on the sandbox environment only.

Additionally, WHCC [signs](https://www.whcc.com/developer/docs/legacy/order-submit-api/webhook-security/index.html.md) all webhook requests with an HMAC signature in order to verify it's from WHCC and intended for your consumption.

> ## What's Next
>
> [Register and verify](https://www.whcc.com/developer/docs/legacy/order-submit-api/webhook-register/index.html.md) a webhook callback URI
>
> [Delivery, Retries & Idempotency](https://www.whcc.com/developer/docs/legacy/order-submit-api/webhook-delivery/index.html.md) &mdash; read this before you build your handler