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 WebhooksCreate a Subscription
Go to Account > Webhooks and click Create.
Enter the endpoint that will receive events: only the host and path, since SKUSavvy always delivers over https
Check every topic you want to subscribe to, grouped by record type: Vendor Order, Customer Order, Transfer Order, Qty Change, Notification, Vendor, Product, Variant
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.
Enter the 6-digit code on the webhook's page and click Verify
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:
| Topic | Fires 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.