OptiWMS API
Webhooks
OptiWMS API callbacks to your base URL, and dashboard notification webhooks with the store field.
Webhooks
Two different outbound schemes touch your servers. Keep them separate.
1. OptiWMS API callbacks (OptiWMS to your base URL)
When you register a store you give OptiWMS an HTTPS base URL. OptiWMS POSTs to paths under that URL for stock and fulfillment. These calls use the same signing as the OptiWMS API (X-OptiWMS-Integration, X-OptiWMS-Timestamp, X-OptiWMS-Signature over timestamp.method.path.body). The signed path is the full path your server receives, including any path prefix on the base URL.
| Topic | Path on your server | When |
|---|---|---|
| Stock | POST .../stock |
Available quantity for a SKU changed |
| Shipment | POST .../shipments |
A shipment left the warehouse |
| Tracking | POST .../shipments/{shipmentId}/tracking |
Tracking for a parcel changed |
| Cancel | POST .../orders/{orderId}/cancel |
The warehouse canceled an order |
Stock example (OpenAPI)
{
"sku": "TEE-BLK-M",
"variantId": "301",
"available": 42,
"locationCode": "main"
}
available is the absolute figure your store may sell (after the integration's stock buffer). OptiWMS sends the same SKU again whenever the figure changes.
Shipment example (OpenAPI)
{
"orderId": "5001",
"shipmentId": "8812",
"carrier": "Australia Post",
"trackingNumber": "33ABC1234567",
"trackingUrl": "https://auspost.com.au/mypost/track/details/33ABC1234567",
"shippedAt": "2026-10-27T15:20:00+11:00",
"lines": [
{ "lineId": "11", "quantity": 2 },
{ "lineId": "12", "quantity": 1 }
]
}
Line ids are your store's line ids from the order PUT. Answer 2xx when you accept the call; OptiWMS retries transient failures.
2. Dashboard notification webhooks
In the dashboard you can subscribe a URL to topics such as order.shipped, order.fulfilled, order.short_shipped, order.shipment_event and order.label_voided. Those deliveries are not OptiWMS API callbacks:
- JSON body with snake_case keys
- Header
X-OptiWMS-Hmac-Sha256: Base64(HMAC-SHA256(body, subscription secret)) - Header
X-OptiWMS-Webhook-Version: 1 - No
X-OptiWMS-Timestamp/X-OptiWMS-Signaturepath binding
The store field
Order topics include a store object when the order came through a sales channel integration (Shopify, WooCommerce, OptiWMS API, and so on). Manual orders omit the key.
{
"store": {
"integration_id": 42,
"name": "My Magento store",
"store_order_id": "5001",
"store_order_number": "#1001"
}
}
| Field | Meaning |
|---|---|
integration_id |
The OptiWMS tenant integration id |
name |
The integration's display name (the name the store was registered under) |
store_order_id |
Your store's order id (channel_order_id) |
store_order_number |
Your store's order number (#1001) |
On order.fulfilled for a multi-order fulfillment action, store is set only when every channel order on that action shares one integration; otherwise the key is omitted.
Use store when one organization has several custom stores (or a custom store next to Shopify) and your subscriber must route the event. See Several stores.
Connect your own store
Register the integration in the dashboard, then start with GET /ping.