Getting Started
1
Subscribe to webhooks
Create a webhook to subscribe to an event and define a subscription URL.
2
Receive Webhook Events
When the event occurs, ShipBob sends a
POST request to your subscription URL with relevant data.3
Acknowledge Receipt
Your system should return a
2XX response to confirm successful receipt.4
Handle Retries
If no
2XX response is received, ShipBob retries delivery using an exponential backoff strategy.Key Concepts
- Subscription: A request to receive webhook notifications at a specified URL.
- Subscription URL: The endpoint where webhook data is sent.
- Event: A trigger that generates webhook data (e.g., an order being shipped).
- Topic: The category of event data being sent.
- Payload: The actual event data sent in the webhook.
- Response: A
2XXHTTP response is required to confirm webhook receipt.
Common Use Cases
- ✅ Real-time Order Tracking - Receive
order.shippedandorder.shipment.deliveredevents to provide live tracking updates to customers. - ✅ Inventory Management - Monitor
order.shipment.exceptionevents to detect and respond to stock shortages. - ✅ Return completed notifications - Use
return.completedevents to update your system when a return has successfully been processed and completed by ShipBob.
Webhook Topics & Events
| Topic (2025-07) | Description | Scopes Required |
|---|---|---|
order.shipped | Fires when a shipping label is purchased, printed, and scanned. If the order is split into multiple shipments, this fires per shipment. | orders_read |
order.shipment.delivered | Fires when a shipment is delivered to the customer. | orders_read or fulfillments_read |
order.shipment.exception | Fires when a shipment is moved to exception status (e.g., out-of-stock items). | orders_read or fulfillments_read |
order.shipment.on_hold | Fires when a shipment moves to On-Hold status due to missing information (e.g., address issues). | orders_read or fulfillments_read |
order.shipment.cancelled | Fires when a shipment is canceled. Does not fire for manually canceled or imported orders. | orders_read or fulfillments_read |
return.created | Fires when a return is created. | returns_read |
return.updated | Fires when a return is updated. | returns_read |
return.completed | Fires when a return is completed. | returns_read |
Webhook topics for 1.0 and 2.0 versions
Webhook topics for 1.0 and 2.0 versions
| Topic (1.0, 2.0) | Description | Scopes Required |
|---|---|---|
order_shipped | Fires when a shipping label is purchased, printed, and scanned. If the order is split into multiple shipments, this fires per shipment. | orders_read |
shipment_delivered | Fires when a shipment is delivered to the customer. | orders_read or fulfillments_read |
shipment_exception | Fires when a shipment is moved to exception status (e.g., out-of-stock items). | orders_read or fulfillments_read |
shipment_onhold | Fires when a shipment moves to On-Hold status due to missing information (e.g., address issues). | orders_read or fulfillments_read |
shipment_cancelled | Fires when a shipment is canceled. Does not fire for manually canceled or imported orders. | orders_read or fulfillments_read |
Webhook Headers
ShipBob sends webhook notifications with the following headers:Webhook headers for 1.0 and 2.0 versions
Webhook headers for 1.0 and 2.0 versions
Webhook Payloads
✨ The best way to see examples of webhook payloads is to create a webhook in the ShipBob Dashboard by going to:Integrations → Webhooks → Create new subscription.
- Add your subscription URL — this is the endpoint on your server where ShipBob will send the webhook data.
- Select a topic — choose an event type such as
order.shippedorreturn.completed. - Click “Send example” — ShipBob will immediately send a sample JSON payload to your URL so you can preview the structure.

Retry Schedule
Each message is attempted based on the following schedule, where each period is started following the failure of the preceding attempt:- Immediately
- 5 seconds
- 5 minutes
- 30 minutes
- 2 hours
- 5 hours
- 10 hours
- 10 hours (in addition to the previous)

Disabling failing endpoints
If all attempts to a specific endpoint fail for a period of 5 days, the endpoint will be disabled and an email will be sent to the account owner. The clock only starts after multiple deliveries fail within a 24-hour span, with at least 12 hours difference between the first and the last failure.Static Source IP Addresses
In case your webhook receiving endpoint is behind a firewall or NAT, you may need to allow traffic from static IP addresses. This is the full list of IP addresses that webhooks may originate from.Best Practices
✅ Use HTTPS - Subscription URLs must support SSL. Use RequestBin for testing if needed. ✅ Implement Redundancy - Webhooks may be delayed or lost. UseGET endpoints to periodically reconcile data.
✅ Retry Handling - Events may arrive out of order due to retries—handle them as independent updates.
✅ Use Idempotency - Store webhook event ids and discard duplicates to prevent redundant processing.
✅ Logging & Monitoring - Log webhook requests and responses to diagnose issues.
Troubleshooting Guide
How can I view webhooks logs and retry failed events?
How can I view webhooks logs and retry failed events?
Yes, you can view webhook logs in the ShipBob dashboard by going to Integrations > Webhooks. Then, click into your webhook and you will be able to see logs at the bottom of the page.

Webhook Not Triggering?
Webhook Not Triggering?
- Ensure your subscription URL is correct and publicly accessible.
- Confirm your app
returns a 2XX responseto ShipBob’sPOSTrequest. - Verify that your app
has the correct webhooks_read or webhooks_write permissions.
Webhook Retries Are Overloading My Server
Webhook Retries Are Overloading My Server
- Ensure your system processes events efficiently and responds within 5 seconds.
- Return a
2XXresponse before doing heavy processing.
Webhook Data is Out of Order
Webhook Data is Out of Order
- Use timestamps from the payload to sort events properly.
- Handle events individually, rather than relying on strict order.
Receiving Duplicate Events?
Receiving Duplicate Events?
- Webhooks are not guaranteed to be sent only once.
- Implement idempotency checks: Store received event IDs and ignore duplicates.
