Skip to content

Events: shipments

This page details the three shipment-related event keys: created_shippingbox, updated_shippingbox, deleted_shippingbox. A shipment (“shippingbox”) is a scheduled parcel: a subscription generates one per cycle, and a shop order can generate one directly. For general configuration, see Understanding a webhook delivery.

Every shipment-related delivery carries the full object.

FieldTypeNullableMeaning
tenant_idintegernoowning shop
idintegernointernal identifier
uuidstringnopublic identifier
addressobjectyessee Address object
transporterobjectyessee Carrier object
created_atISO 8601 datenocreation
updated_atISO 8601 datenolast modification
scheduled_atISO 8601 dateyesscheduled departure
tracking_linkstringyesnull without a tracking number (combined with the carrier’s tracking URL) nor a tracking URL set directly on the shipment
subscription_uuidstringyesoriginating subscription; null for a shop shipment
address_idintegeryesaddress id
phonestringyesrecipient phone number
statusstringnofree-form (created, shipped…), not a closed enumeration
tracking_numberstringyestracking number
customer_idstringyespublic customer id (cus_...), not the numeric one
supply_idstringyeslogistics batch
transporter_idintegeryescarrier id
first_namestringyesrecipient first name
last_namestringyesrecipient last name
postcodestringyespostal code
address1stringyesaddress
address2stringyesaddress line 2
divisionstringyesadministrative subdivision
citystringyescity
countrystringyescountry
mailstringyescustomer e-mail at the time of delivery
subscriptions_countstringyescustomer’s subscriptions, as a string
transporter_namestringyescarrier name
shipped_countstringyesshipments per cycle, as a string
site_namestringyesshop
optionsstringyesvariant, values separated by |
iso_codestringyesISO country code
relayobjectyesselected pickup point
relay_idstringyespickup point id
orderable_namestringyesname of the shipped product
orderable_idstringyesproduct id, as a string
orderable_typestringyestype of shipped product: plan (App\Plan) or product (App\Product)
order_idintegeryesrelated order
refstringyesproduct reference
customization_productsarrayyescustomization choices
extra_customization_productsarrayyescustomizations added afterwards

The transporter object follows the structure described below. It is null when the shipment has no assigned carrier.

FieldTypeNullableMeaning
idintegernointernal identifier
countriesarray of objectsnocovered countries (id, name)
plan_blacklistedarray of objectsnoexcluded plans (id, name)
namestringnocarrier name
descriptionstringyesmarketing description
pricenumbernoprice, float
giftbooleannoavailable for a gift card
activebooleannocarrier is active
shipped_countintegernoshipments per cycle
typestringnocarrier type
relayOptionsobjectyessee below

relayOptions is a non-contractual structure: its contents vary with the selected pickup-point carrier (Mondial Relay, Colissimo, DPD) and may change without notice. Do not rely on its individual keys. In the examples on this page it is null (no pickup point).

Object sent: full shipment. Delay before delivery: none. Full example: in the OpenAPI contract (/openapi/ciklik-webhooks.yaml), webhook created_shippingbox.

  • Creation or renewal of a subscription (standard generation, including the composable shop).
  • Shop order generating a shipment directly, outside any subscription.
  • Anti-churn postponement: postponing a due date produces an updated_subscription followed by as many created_shippingbox as months postponed. See Events: subscriptions.

No known case: every shipment creation triggers the delivery.

Always an empty array ([]): by definition, a created_* has no previous state to compare against.

None, beyond its own origin. The anti-churn postponement case is itself a cascading effect of an updated_subscription, not the other way round.

created_shippingbox
{
"tenant_id": 1,
"id": 1,
"uuid": "c636e863-bdf5-4914-b108-05e117cb0c12",
"address": {
"id": 1,
"user_id": 1,
"address": "12 rue des Lilas",
"address1": "Bâtiment B, 3e étage",
"postcode": "69003",
"city": "Lyon",
"phone": "+33612345678",
"first_name": "Claire",
"last_name": "Martin",
"region_id": 1,
"division": null,
"division_name": null,
"deletable": false,
"company_name": null,
"country": {
"id": 1,
"name": "France",
"alphaCode": "FR"
},
"external_id": 4821
},
"transporter": {
"id": 1,
"countries": [
{
"id": 1,
"name": "France"
}
],
"plan_blacklisted": [],
"name": "Colissimo domicile",
"description": "Livraison à domicile sous 48h",
"price": 4.9,
"gift": false,
"active": true,
"shipped_count": 1,
"type": "subs",
"relayOptions": null
},
"created_at": "2026-09-10T08:15:42.000000Z",
"updated_at": "2026-09-10T08:15:42.000000Z",
"scheduled_at": "2026-09-15T00:00:00.000000Z",
"tracking_link": null,
"subscription_uuid": "sub_N8PxGUEdS2U7DP",
"address_id": 1,
"phone": "+33612345678",
"status": "created",
"tracking_number": null,
"customer_id": "cus_Qx7hR3eaEowcv1DX",
"supply_id": null,
"transporter_id": 1,
"first_name": "Claire",
"last_name": "Martin",
"postcode": "69003",
"address1": "12 rue des Lilas",
"address2": "Bâtiment B, 3e étage",
"division": null,
"city": "Lyon",
"country": "France",
"mail": "claire.martin@example.com",
"subscriptions_count": "1",
"transporter_name": "Colissimo domicile",
"shipped_count": "1",
"site_name": "Boutique Exemple",
"options": null,
"iso_code": "fr",
"relay": null,
"relay_id": null,
"orderable_name": "Box mensuelle",
"orderable_id": "1",
"orderable_type": "App\\Plan",
"order_id": 1,
"ref": "BOX-MENSUELLE",
"customization_products": [
{
"id": 1,
"quantity": 1
}
],
"extra_customization_products": null,
"changed": []
}

Object sent: full shipment, in its state at the time of delivery. Delay before delivery: none. Full example: in the OpenAPI contract (/openapi/ciklik-webhooks.yaml), webhook updated_shippingbox.

  • Direct modification of the shipment (address, status, tracking number…) through the vendors API or by the Ciklik team.
  • Cascade from a modified address, subscription or customer: see “Cascading effects”.
  • Linking a shipment to its originating order (silent write).
  • Adding extra customizations from the internal interface (extra_customization_products, silent write).
  • Recalculating the shipped_count counter or fixing options through an internal maintenance command.

An object {column: raw value}.

Three origins each produce one updated_shippingbox per shipment scheduled since the first day of the month before last (M-2, for example July 1st for a shipment in September), shipments already sent included:

OriginTriggerScope
Addressupdated_address, whatever the modified fieldevery subscription linked to the address
Subscriptionchange of address, carrier, variant, pickup point or product customizationthe modified subscription
Customerchange of the customer’s e-mailevery subscription of the customer, in addition to the updated_user

The e-mail change cascade is established in the code: a customer whose e-mail changes and who has 12 shipments in that window triggers 1 updated_user followed by 12 updated_shippingbox (details in Events: customers, addresses and opt-ins). A change on the subscription additionally triggers one or two updated_checkoutorder per order being created (see Events: orders, transactions and invoices).

changed of updated_shippingbox
{
"changed": {
"phone": "06 12 34 56 78",
"first_name": "CLAIRE",
"last_name": "MARTIN",
"postcode": "69007",
"address1": "27 AVENUE JEAN JAURES",
"address2": "",
"city": "LYON",
"country": "FRANCE",
"mail": "claire.martin-dupont@example.com",
"status": "shipped",
"tracking_number": "6A12345678901"
}
}

The rest of the payload is identical to that of created_shippingbox. Here, first_name, last_name, address1, city, country, phone, postcode and mail come from resynchronization; only status and tracking_number are actually modified by the caller.

Object sent: full shipment, even after deletion (the state is re-read at the time of delivery, regardless of the deletion). Delay before delivery: none. Full example: in the OpenAPI contract (/openapi/ciklik-webhooks.yaml), webhook deleted_shippingbox.

  • Deletion through the vendors API, DELETE /deliveries/{id}.
  • Validation of a withdrawal request by the Ciklik team, with the deletion option: only future shipments are deleted.
  • Refund of a transaction by the Ciklik team, with the deletion option: all shipments of the order are deleted, past and future.

Always {"deleted": true}, whatever the shipment.

No cascading effect specific to deletion is documented: it occurs at the end of the journey (validated withdrawal or refund), with no other associated webhook.

changed of deleted_shippingbox
{
"changed": {
"deleted": true
}
}

The rest of the payload is identical to that of created_shippingbox.