Shipment webhook events

Updated June 11, 20262 min read

Shipment webhooks fire on status transitions, metadata changes, and specific carrier reason codes. The trigger HTTP header on every delivery tells you which event fired.

Status triggers

The trigger header carries the status name.

Trigger valueFires when
draftShipment created in draft state
ready_to_shipShipment is ready for carrier collection
bookedCarrier accepts the booking
shippedHanded to carrier
in_transitIn the carrier network
out_for_deliveryOn the delivery vehicle
awaiting_customer_collectionAt a collection point, waiting for customer
deliveredSuccessfully delivered
failed_delivery_attemptDelivery attempt failed
failed_collection_attemptCollection attempt failed
cancelledCancelled by the merchant
cancelled_by_carrierCancelled by the carrier
delayedCarrier reports a delay
errorBooking or processing error
missingLost in transit
suspendedOn hold
returnedReturned to sender
ready_for_returnMarked for return
return_in_transitReturn leg in transit

Metadata triggers

These fire on non-status changes to the shipment.

Trigger valueFires when
default_label_updateDefault (carrier) label is generated
carriyo_label_updateCarriyo-generated label is generated
scheduled_collection_updateScheduled collection date changes
scheduled_delivery_updateScheduled delivery date changes
promised_delivery_updatePromised delivery date changes

Use default_label_update for label-printing automation — the label is not guaranteed to exist the instant the shipment books.

Reason-code triggers

Specific carrier reason codes that can fire a webhook independently of a status change.

Trigger valueFires when
customs_clearedCustoms clearance completed
handed_over_to_partnerHanded over to a delivery partner
address_corrected_by_carrierCarrier corrected the address

Payload

The body is the full Shipment object as JSON. No wrapper, no diff. Whatever is current on the shipment record when the webhook fires is what gets sent.

{
  "shipment_id": "SHP-00012345",
  "entity_type": "SHIPMENT",
  "merchant": "ACME",
  "carrier_account": {
    "carrier_account_id": "ca-dhl-uk-001",
    "carrier": "DHL"
  },
  "post_shipping_info": {
    "status": "in_transit",
    "carrier_status": "Out for delivery",
    "tracking_no": "1234567890",
    "tracking_url": "https://..."
  },
  "pickup": {
    "contact_name": "Warehouse London",
    "country": "GB",
    "city": "London"
  },
  "dropoff": {
    "contact_name": "John Smith",
    "country": "GB",
    "city": "Manchester"
  },
  "parcels": [{ "weight": { "value": 1.2, "unit": "kg" } }],
  "items": [{ "sku": "TSHIRT-BLK-M", "quantity": 2 }]
  // ... full shipment fields
}

Conditions

Shipment webhooks support the most granular filtering. Conditions are AND-combined; for OR-style logic, create separate configurations.

ConditionWhat it filters
Shipment typeForward, reverse, or consolidated
Delivery typeHome delivery, click-and-collect, etc.
Dropoff geographyDestination country, state, city, area, or postcode
Pickup locationSpecific origin locations
Creation sourceHow the shipment was created (API, connector, Dashboard)