Webhooks: Real-Time Order and Inventory Events

Send SKUSavvy order, inventory, and shipment events to your own systems in real time, with signed, verifiable payloads.

What Are Webhooks

A webhook sends a signed HTTP request to your own endpoint the moment something happens in SKUSavvy: a new order, a picked shipment, a completed cycle count. Use webhooks when your own systems need to react immediately, instead of repeatedly polling the API for changes.

Go to Your Webhooks

Create a Subscription

Go to Account > Webhooks and click Create.

  1. Enter the endpoint that will receive events: only the host and path, since SKUSavvy always delivers over https

  2. Check every topic you want to subscribe to, grouped by record type: Vendor Order, Customer Order, Transfer Order, Qty Change, Notification, Vendor, Product, Variant

  3. Click Create

Subscription limit

You can have at most 3 subscriptions per topic. If you're already at the limit, delete an existing subscription for that topic before adding another.

Verify Your Endpoint

A new webhook doesn't deliver events until it's verified. SKUSavvy posts to your endpoint with the header X-Webhook-Verification: true and a 6-digit code in the body, so verification itself arrives as a webhook-style request, not an email.

  1. Enter the 6-digit code on the webhook's page and click Verify

  2. Didn't get it? Click Resend Code

Verify the Signature

Every delivery is signed so you can confirm it actually came from SKUSavvy, not a spoofed request. Compute an HMAC-SHA256 hash of the raw request body using your webhook secret (shown on the Webhooks page), base64-encode it, and compare it to the X-Savvy-Signature header using a constant-time comparison.

Headers sent with every delivery: X-Savvy-Signature (the HMAC), X-Topic (e.g. QtyChange.Allocate), X-Webhook-Id, and X-Company-Id.
Respond with a 2xx status within 30 seconds: anything else counts as a failed delivery and queues a retry.

Topics Reference

Topics use a Record.Action format, for example QtyChange.Allocate. Here's what triggers each one:

TopicFires when

QtyChange.Allocate

Imported inventory is assigned to a bin location

QtyChange.Change

Inventory quantity is manually adjusted by a user

QtyChange.CheckIn

Inventory is received from a purchase order

QtyChange.CycleCount

A cycle count discrepancy reconciles inventory

QtyChange.Delete

Inventory is deleted by a user

QtyChange.Export

An order is fulfilled outside of SKUSavvy

QtyChange.KitConvert

A kit's inputs are combined into the kitted output

QtyChange.KitPick

A component is picked and added to a kit

QtyChange.Pick

Inventory is picked during shipment fulfillment

QtyChange.Reconcile

Exported inventory reconciles after fulfillment by an external system

QtyChange.Restock

Inventory is restocked after a refund or cancellation

QtyChange.Transfer

Inventory moves between bins within a warehouse

CustomerOrder.LineItem.Created

Items are added to a new customer order (Vendor/Transfer variants also exist)

CustomerOrder.LineItem.Updated

Order line items are modified (Vendor/Transfer variants also exist)

CustomerOrder.LineItem.Cancelled

Order line items are cancelled (Vendor/Transfer variants also exist)

Notification.LotExpiring

A lot expiration warning triggers based on your notification settings

CustomerOrder.Shipment.Created

A shipment is created for an order (Vendor/Transfer variants also exist)

VendorOrder.Shipment.CheckedIn / TransferOrder.Shipment.CheckedIn

A vendor or transfer order shipment is partially or fully checked in

CustomerOrder.Shipment.Fulfilled / TransferOrder.Shipment.Fulfilled

A shipment is partially or fully fulfilled

CustomerOrder.Created / VendorOrder.Created / TransferOrder.Created

A new order is created

CustomerOrder.Cancelled / VendorOrder.Cancelled / TransferOrder.Cancelled

An order is cancelled

VendorOrder.Confirmed

A vendor confirms a purchase order

CustomerOrder.Fulfilled / TransferOrder.Fulfilled

An order is partially or fully fulfilled

VendorOrder.CheckedIn / TransferOrder.CheckedIn

A vendor or transfer order is partially or fully received

CustomerOrder.Deleted / VendorOrder.Deleted / TransferOrder.Deleted

An order is archived

Vendor.Created / Product.Created / Variant.Created

A new vendor, product, or variant is created

Retries & Delivery History

If your endpoint doesn't return a 2xx response, SKUSavvy retries up to 10 times, spacing out further after each failure: immediately, 1 minute, 10 minutes, 1 hour, 2 hours, 8 hours, 12 hours, 24 hours, 48 hours, then 1 week later. After the 10th attempt fails, the delivery is marked failed and isn't retried again.

Open a webhook's page and check the Deliveries table to see every attempt: topic, when it was created, when (or if) it delivered, attempt count, and the response status.

Edit, Delete, and Your Secret

You can change a subscription's topics at any time, but not its endpoint: create a new subscription instead if the endpoint changes. Click Delete to remove a subscription entirely; there's no pause option, so deleting is also how you stop delivery.

Your webhook secret is shared across every subscription on your account and can't be rotated from the app: it's shown once on the Webhooks page for you to copy.