Webhooks for Pack App Order Lifecycle
Automatically receive updates for the Pack App order lifecycle.
About webhooks for the order lifecycle
The Pack App can send webhook notifications to your system to keep you updated on the status of your orders. These webhooks are sent out at key moments in the order lifecycle, allowing you to build powerful integrations and automate your workflows.
This document guides you through the steps to register your organization's webhook. To start, you’ll need to access the Pack App in the Shipium Console.
One webhook registered per application to be notified with order lifecycle event updates
Your organization can use a Shipium webhook to receive order lifecycle event updates to one API endpoint (or application), and then manage those updates via your internal processing system or pass them to your internal customers.
For example, if you have customers A, B, and C that need to receive order lifecycle event updates automatically, you would register one Shipium webhook for Customer A, one for Customer B, and one for Customer C, with three unique API endpoints.
One webhook per application to be notified with updates
Shipium suggests creating one webhook per desired application for which your organization needs to receive tracking event updates.
Once you've registered your organization's webhook, you can disable, delete, and enable it via the Pack App in the Shipium Console. You also can view a summary of all your registered webhooks within the console.
Steps to register your webhook
To receive these webhook notifications, you will need to configure a webhook endpoint in your Shipium account settings. Please contact your Shipium account manager for assistance with setting up your webhooks.
Order lifecycle event types for your webhook
The following table includes the event metadata event types that can be returned for an order lifecycle event notification. Each event type needs its own webhook registration; however, you can point all registered webhooks at the same API.
Event type for webhook | Description |
---|---|
Order Created | Signals that a new order has been successfully ingested by Shipium |
Order Updated | Notifies of any significant changes to the order details (e.g., quantity changes, address updates) |
Order Shipped | Indicates that a shipment has been created for the order, and a label has been generated |
Order Cancelled | Confirms that an order has been cancelled within the Pack App |
Order Completed | Signifies that all items within an order have been shipped, marking the end of the fulfillment process for that order |
Final steps and sample webhook call content
This section provides instructions for responding successfully to your webhook's initial call as well as sample webhook messages as they would appear as incoming order lifecycle event updates.
How to respond to your first webhook call
Once you've successfully registered your organization's webhook, you will start receiving webhook calls. Upon receipt of your webhook call, you'll need to respond with an appropriate Hypertext Transfer Protocol (HTTP) status code to acknowledge successful receipt of your webhook call. Your response must:
- be an HTTP status code within the 200-299 range; and
- be delivered within 3 seconds of receiving the webhook call.
Shipium's automated response to your newly registered webhook
Once you've registered your organization's webhook, Shipium:
- will retry the webhook three times if a 200-level HTTP code response is not received within 3 seconds, as required;
- will log this as an error; and
- may decide to mark your API endpoint as broken if multiple errors are received.
Webhook retry logic
If a webhook push fails to deliver to the target location, the Shipium platform employs automated retry logic. This is not the same as guaranteed delivery of webhooks. If your organization’s system or webhook endpoint is down for an extended period, retries may not deliver the payload. Our webhooks have the below retry/backoff policy for new webhook setups. We will configure separate policies if there are recurring performance issues with a managed endpoint we are publishing to.
Backoff Policy for Webhooks
- Maximum Delivery Attempt Count = 4
- Backoffs per Attempt:
- Attempt #1 = No backoff
- Attempt #2 Backoff = 1 hour
- Attempt #3 Backoff = 4 hours
- Attempt #4 Backoff = 16 hours
- Maximum Backoff Time/Expires After = 24 hours
Sample webhook messages
This section provides sample expected webhook messages as they would appear when delivering order lifecycle event updates.
This sample JavaScript Object Notation (JSON) message demonstrates the push event sent to your organization's endpoint for your registered webhook. When a webhook is published regarding an order lifecycle event, it will contain an array with one or more updates.
"events": [ // List of events
{
"metadata": { // The metadata associated with this event
"eventId": "string", // UUID identifying this event for debugging/idempotency purposes
"eventTimestamp": "date-time", // UTC timestamp of when this event was generated in our system
"eventType": "string", // Indicates what event occurred in our system
"payloadSchemaVersion": "string", // The schema version of this event's payload (major)
"testEvent": boolean // Indicates if this is a test notification instead of a real event
},
"payload": { // The actual event data associated with this event
// eventType specific payload
}
}
]
The elements in the above sample webhook message are described in the following table.
Element | Element type | Description |
---|---|---|
events | Array | List of events in the webhook call; the events array may contain a single event, or multiple events (from one or more shipments). |
events[].metadata | Object | Object containing metadata about a particular update |
events[].metadata.eventId | UUID | A unique identifier associated with this event |
events[].metadata.eventTimestamp | String | Timestamp of when the event in question occurred in ISO-8601 date-time format |
events[].metadata.eventType | String enumeration Values are: - order_created - order_updated - order_shipped - order_cancelled - order_completed | The type of event this message represents |
events[].metadata.partnerId | String | Your organization's unique ID |
events[].metadata.payloadSchemaVersion | String | The version ID for this published message (useful for debugging purposes) |
events[].metadata.testEvent | Booleantrue or false | If true , the published event was a test event, not a real event. |
events[].payload | Object | Object containing the contents of the message; see the payload data structures below for details. |
Sample webhook message for order created or order updated event
This sample JSON message demonstrates the example model of the push event for the order create and order update event types sent to your organization's endpoint for your registered webhook. The same payload is used for the order create and order update event types.
{
"eventId": "a1b2c3d4-e5f6-7g8h-9i0j-k1l2m3n4o5p6",
"eventType": "order_created",
"tenantId": "7b9c8d6e-5f4a-4321-b0c9-8e7f6a5b4c3d",
"shipiumOrderId": "ord_2b4a6c8e-1f3d-5b7f-9h1j-3k5m7o9q1s3u",
"partnerOrderId": "ACME-ORDER-789456",
"orderStatus": "created",
"orderEventDateTime": "2025-09-22T15:30:45.123Z",
"fulfillmentType": "dropship",
"orderSource": "store",
"associatedIdentifiers": [
"ACME-INTERNAL-12345",
"CAMPAIGN-FALL2025"
],
"orderedDateTime": "2025-09-22T15:29:12.456Z",
"orderItemQuantities": [
{
"productId": "SKU-WIDGET-001",
"quantity": 2
},
{
"productId": "SKU-GADGET-XL-BLUE",
"quantity": 1
}
],
"shipFromAddress": {
"name": "ACME Fulfillment Center",
"addressLine1": "1500 Industrial Blvd",
"addressLine2": "Suite 200",
"city": "Las Vegas",
"region": "NV",
"postalCode": "89408",
"countryCode": "US",
"addressType": "commercial",
"phoneNumber": "+1-555-123-4567"
},
"originId": "warehouse_lv_01",
"destinationAddress": {
"name": "John Smith",
"addressLine1": "123 Ocean Drive",
"addressLine2": "Apt 4B",
"city": "Miami",
"region": "FL",
"postalCode": "33131",
"countryCode": "US",
"addressType": "residential",
"phoneNumber": "+1-555-987-6543",
"email": "[email protected]"
},
"shipOption": "ground",
"customsInfo": {
"contentType": "merchandise",
"contentDescription": "Electronic accessories",
"incoterm": "DAP",
"customsItems": [
{
"description": "Wireless charging widget",
"quantity": 2,
"unitValue": {
"amount": 29.99,
"currencyCode": "USD"
},
"weight": {
"value": 0.5,
"unit": "lb"
},
"hsCode": "8504.40.95",
"countryOfOrigin": "CN"
}
]
},
"currencyCode": "USD",
"totalDeclaredValue": {
"amount": 89.97,
"currencyCode": "USD"
},
"orderFulfillmentParameters": {
"priorityLevel": "standard",
"packagingPreference": "minimal",
"deliveryInstructions": "Leave at front door",
"insuranceRequired": false,
"signatureRequired": false,
"saturdayDelivery": false,
"expeditedProcessing": false
}
}
Sample webhook message for order shipped event
This sample JSON message demonstrates the example model of the push event for the order shipped event type sent to your organization's endpoint for your registered webhook.
{
"eventId": "f3e7b8c2-9d1a-4f6e-8b2c-5d7f9a1e3b6d",
"eventType": "order_shipped",
"tenantId": "7b9c8d6e-5f4a-4321-b0c9-8e7f6a5b4c3d",
"shipiumOrderId": "ord_2b4a6c8e-1f3d-5b7f-9h1j-3k5m7o9q1s3u",
"partnerOrderId": "ACME-ORDER-789456",
"orderStatus": "partially_shipped",
"orderEventDateTime": "2025-09-23T10:15:32.789Z",
"shipiumShipmentId": "ship_8a2f4e6b-3c5d-7f9a-1e3b-5d7f9a1e3b6d",
"partnerShipmentId": "ACME-SHIP-789456-001",
"type": "forward",
"carrierTrackingId": "1Z999AA1234567890",
"carrier": "ups",
"carrierServiceMethodId": "ups-ground-service-method-id",
"shipFromAddress": {
"name": "ACME Fulfillment Center",
"addressLine1": "1500 Industrial Blvd",
"addressLine2": "Suite 200",
"city": "Las Vegas",
"region": "NV",
"postalCode": "89408",
"countryCode": "US",
"addressType": "commercial",
"phoneNumber": "+1-555-123-4567"
},
"originId": "warehouse_lv_01",
"destinationAddress": {
"name": "John Smith",
"addressLine1": "123 Ocean Drive",
"addressLine2": "Apt 4B",
"city": "Miami",
"region": "FL",
"postalCode": "33131",
"countryCode": "US",
"addressType": "residential",
"phoneNumber": "+1-555-987-6543",
"email": "[email protected]"
},
"fulfillmentContext": "warehouse",
"fulfillmentContextId": "9ba10640-600a-4d3e-842f-4b6a6c535be6",
"packagingType": {
"packagingMaterial": "box",
"linearDimensions": {
"linearUnit": "in",
"length": 12.0,
"width": 9.0,
"height": 6.0
}
},
"totalWeight": {
"weightUnit": "lb",
"weight": 1.8
},
"shippedOrderItemQuantities": [
{
"productId": "SKU-WIDGET-001",
"quantity": 2
}
],
"unshippedOrderItemQuantities": [
{
"productId": "SKU-GADGET-XL-BLUE",
"quantity": 1
}
]
}
Sample webhook message for order cancelled event
This sample JSON message demonstrates the example model of the push event for the order cancelled event type sent to your organization's endpoint for your registered webhook.
{
"eventId": "c9f2e8a1-6b4d-3e7f-a2c5-8f1b4e7a2d5c",
"eventType": "order_cancelled",
"tenantId": "7b9c8d6e-5f4a-4321-b0c9-8e7f6a5b4c3d",
"shipiumOrderId": "ord_2b4a6c8e-1f3d-5b7f-9h1j-3k5m7o9q1s3u",
"partnerOrderId": "ACME-ORDER-789456",
"orderStatus": "cancelled",
"orderEventDateTime": "2025-09-22T16:45:18.234Z",
"unshippedOrderItemQuantities": [
{
"productId": "SKU-WIDGET-001",
"quantity": 2
},
{
"productId": "SKU-GADGET-XL-BLUE",
"quantity": 1
}
]
}
Sample webhook message for order completed event
This sample JSON message demonstrates the example model of the push event for the order completed event type sent to your organization's endpoint for your registered webhook.
{
"eventId": "e7d3f9b5-2a8c-4f1e-9b6d-7c2f5a8e1b4d",
"eventType": "order_completed",
"tenantId": "7b9c8d6e-5f4a-4321-b0c9-8e7f6a5b4c3d",
"shipiumOrderId": "ord_2b4a6c8e-1f3d-5b7f-9h1j-3k5m7o9q1s3u",
"partnerOrderId": "ACME-ORDER-789456",
"orderStatus": "completed",
"orderEventDateTime": "2025-09-24T14:22:07.567Z"
}
Pack App order lifecycle webhook payload elements defined
Data elements for the Pack App order lifecycle event types are defined in the following tables.
Payload elements common to all event types
Element | Element type | Description |
---|---|---|
eventId | String | A unique identifier associated with this event for debugging/idempotency purposes |
eventType | String enumeration | The type of order lifecycle event this message represents |
tenantId | String | The unique identifier for the tenant; when present, this is used to indicate the tenant associated with the order |
shipiumOrderId | String | The unique identifier for the order within Shipium's system |
partnerOrderId | String | The unique identifier that your organization uses for the order |
orderStatus | String | The current status of the order (e.g., "created", "partially_shipped", "shipped", "cancelled", "completed") |
orderEventDateTime | String | UTC timestamp of when this order event occurred in the Shipium system in ISO 8601 date-time format |
Payload elements specific to order created and order updated event types
Element | Element type | Description |
---|---|---|
fulfillmentType | String | The type of fulfillment for this order (e.g., "dropship", "warehouse", "3pl", "direct") |
orderSource | String | The source system or channel where the order originated (e.g., "api", "manual") |
associatedIdentifiers | Array | Additional identifiers associated with the order (e.g., internal reference numbers, campaign IDs) |
orderedDateTime | String | UTC timestamp of when the order was originally placed in ISO 8601 date-time format |
orderItemQuantities.productId | String | The unique identifier for the product/SKU |
orderItemQuantities.quantity | Integer | The quantity of this product in the order |
shipFromAddress.name | String | Name of the shipping location or facility |
shipFromAddress.addressLine1 | String | Primary address line |
shipFromAddress.addressLine2 | String | Secondary address line |
shipFromAddress.city | String | City name |
shipFromAddress.region | String | State, province, or region code |
shipFromAddress.postalCode | String | Postal or ZIP code |
shipFromAddress.countryCode | String | Two-letter ISO country code |
shipFromAddress.addressType | String enumeration | The type of shipping address |
shipFromAddress.phoneNumber | String | Phone number for the shipping location |
originId | String | The unique identifier for the origin/fulfillment location |
destinationAddress.name | String | Recipient's name |
destinationAddress.addressLine1 | String | Primary address line |
destinationAddress.addressLine2 | String | Secondary address line |
destinationAddress.city | String | City name |
destinationAddress.region | String | State, province, or region code |
destinationAddress.postalCode | String | Postal or ZIP code |
destinationAddress.countryCode | String | Two-letter ISO country code |
destinationAddress.addressType | String enumeration | The type of delivery address |
destinationAddress.phoneNumber | String | Recipient's phone number |
destinationAddress.email | String | Recipient's email address |
shipOption | String | The shipping service level requested (e.g., "ground", "express", "overnight") |
customsInfo | Object | Customs information for international shipments |
customsInfo.contentType | String | Type of contents (e.g., "merchandise", "gift", "documents") |
customsInfo.contentDescription | String | Description of the package contents |
customsInfo.incoterm | String | International commercial terms (e.g., "DAP", "DDP", "FOB") |
customsInfo.customsItems.description | String | Description of the customs item |
customsInfo.customsItems.quantity | Integer | Quantity of this item |
customsInfo.customsItems.unitValue.amount | Number | Monetary amount |
customsInfo.customsItems.description .unitValue.currencyCode | String | Three-letter ISO currency code |
customsInfo.customsItems.weight.value | Number | Weight value |
customsInfo.customsItems.weight.unit | String | Weight unit (e.g., "lb", "kg", "oz", "g") |
customsInfo.customsItems.hsCode | String | Harmonized System classification code |
customsInfo.customsItems.countryOfOrigin | String | Two-letter ISO country code of origin |
currencyCode | String | Three-letter ISO currency code for the order value |
totalDeclaredValue.amount | Number | Total monetary amount of the declared value of the order |
totalDeclaredValue.currencyCode | String | Three-letter ISO currency code |
orderFulfillmentParameters.priorityLevel | String | Priority level for processing (e.g., "standard", "expedited", "rush") |
orderFulfillmentParameters.packagingPreference | String | Packaging preference (e.g., "minimal", "standard", "protective") |
orderFulfillmentParameters.deliveryInstructions | String | Special delivery instructions |
orderFulfillmentParameters.insuranceRequired | Boolean | Whether insurance is required for the shipment |
orderFulfillmentParameters.signatureRequired | Boolean | Whether signature confirmation is required |
orderFulfillmentParameters.saturdayDelivery | Boolean | Whether Saturday delivery is requested |
orderFulfillmentParameters.expeditedProcessing | Boolean | Whether expedited processing is requested |
Payload elements specific to order shipped event type
Element | Element type | Description |
---|---|---|
shipiumShipmentId | String | The unique identifier for the shipment within Shipium's system |
partnerShipmentId | String | The unique identifier that your organization uses for the shipment |
type | String enumeration | The type of shipment (forward shipment or return) |
carrierTrackingId | String | The tracking number provided by the carrier |
carrier | String | The carrier that will handle the shipment |
carrierServiceMethodId | String | The carrier service method identifier |
fulfillmentContext | String | The context of fulfillment (e.g., "warehouse", "3pl", "dropship", "store") |
fulfillmentContextId | String | The Shipium-generated unique identifier for the fulfillment context |
packagingType.packagingMaterial | String enumeration | The type of packaging material used |
packagingType.linearDimensions.linearUnit | String enumeration | The unit of measurement for dimensions |
packagingType.linearDimensions.length | Number | Length of the package |
packagingType.linearDimensions.width | Number | Width of the package |
packagingType.linearDimensions.height | Number | Height of the package |
totalWeight.weightUnit | String enumeration | The unit of measurement for weight |
totalWeight.weight | Number | The weight value |
shippedOrderItemQuantities | Array | List of products and quantities that were shipped in this shipment |
shippedOrderItemQuantities.productId | String | The unique identifier for the shipped product/SKU |
shippedOrderItemQuantities.quantity | Integer | The quantity of this product that was shipped |
unshippedOrderItemQuantities | Array | List of products and quantities that remain unshipped |
unshippedOrderItemQuantities.productId | String | The unique identifier for the unshipped product/SKU |
unshippedOrderItemQuantities.quantity | Integer | The quantity of this product that remains unshipped |
Payload elements specific to order completed event type
Element | Element type | Description |
---|---|---|
unshippedOrderItemQuantities | Array | List of products and quantities that remain unshipped |
unshippedOrderItemQuantities.productId | String | The unique identifier for the unshipped product/SKU |
unshippedOrderItemQuantities.quantity | Integer | The quantity of this product that remains unshipped |
Resources
Your Shipium team member is available to help along the way. However, you might find these resources helpful:
Updated 8 days ago