Aller au contenu

Événements : expéditions

Cette page détaille les trois clés d’événement liées à l’expédition : created_shippingbox, updated_shippingbox, deleted_shippingbox. Une expédition (« shippingbox ») est un colis planifié : un abonnement en génère une à chaque cycle, une commande boutique peut en générer une directement. Pour la configuration générale, voir Comprendre un envoi de webhook.

Chaque envoi lié à une expédition porte l’objet complet.

ChampTypeNullableSens
tenant_identiernonboutique propriétaire
identiernonidentifiant interne
uuidchaînenonidentifiant public
addressobjetouivoir Objet adresse
transporterobjetouivoir Objet transporteur
created_atdate ISO 8601noncréation
updated_atdate ISO 8601nondernière modification
scheduled_atdate ISO 8601ouidépart planifié
tracking_linkchaîneouinul sans numéro de suivi (combiné à l’URL de suivi du transporteur) ni URL de suivi enregistrée directement sur l’expédition
subscription_uuidchaîneouiabonnement d’origine ; nul pour une expédition boutique
address_identierouiid de l’adresse
phonechaîneouitéléphone destinataire
statuschaînenonlibre (created, shipped…), pas une énumération fermée
tracking_numberchaîneouinuméro de suivi
customer_idchaîneouiid public du client (cus_...), pas le numérique
supply_idchaîneouilot logistique
transporter_identierouiid du transporteur
first_namechaîneouiprénom destinataire
last_namechaîneouinom destinataire
postcodechaîneouicode postal
address1chaîneouiadresse
address2chaîneouicomplément
divisionchaîneouisubdivision administrative
citychaîneouiville
countrychaîneouipays
mailchaîneouie-mail client à l’envoi
subscriptions_countchaîneouiabonnements du client, en chaîne
transporter_namechaîneouinom du transporteur
shipped_countchaîneouienvois du cycle, en chaîne
site_namechaîneouiboutique
optionschaîneouidéclinaison, valeurs séparées par |
iso_codechaîneouicode pays ISO
relayobjetouipoint relais choisi
relay_idchaîneouiid du point relais
orderable_namechaîneouinom du produit expédié
orderable_idchaîneouiid du produit, en chaîne
orderable_typechaîneouitype de produit expédié : formule (App\Plan) ou produit (App\Product)
order_identierouicommande liée
refchaîneouiréférence produit
customization_productstableauouichoix de personnalisation
extra_customization_productstableauouipersonnalisations ajoutées après coup

L’objet transporter suit la structure décrite ci-dessous. Il est nul quand l’expédition n’a pas de transporteur assigné.

ChampTypeNullableSens
identiernonidentifiant interne
countriestableau d’objetsnonpays couverts (id, name)
plan_blacklistedtableau d’objetsnonformules exclues (id, name)
namechaînenonnom du transporteur
descriptionchaîneouidescription commerciale
pricenombrenonprix, flottant
giftbooléennondisponible pour une carte cadeau
activebooléennontransporteur actif
shipped_countentiernonenvois par cycle
typechaînenontype de transporteur
relayOptionsobjetouivoir ci-dessous

relayOptions est une structure non contractuelle : son contenu varie selon le transporteur relais choisi (Mondial Relay, Colissimo, DPD) et peut changer sans préavis. N’en exploitez pas les clés individuellement. Dans les exemples de cette page, il vaut null (pas de point relais).

Objet envoyé : expédition complète. Délai avant l’envoi : aucun. Exemple complet : dans le contrat OpenAPI (/openapi/ciklik-webhooks.yaml), webhook created_shippingbox.

  • Création ou renouvellement d’un abonnement (génération standard, y compris boutique composable).
  • Commande boutique générant directement une expédition, hors abonnement.
  • Report anti-churn : un report d’échéance produit un updated_subscription suivi d’autant de created_shippingbox que de mois reportés. Voir Événements : abonnements.

Aucun cas connu : toute création d’expédition déclenche l’envoi.

Toujours un tableau vide ([]) : un created_* n’a par définition rien à comparer à un état antérieur.

Aucun, au-delà de son origine. Le cas du report anti-churn est lui-même un effet en cascade d’un updated_subscription, pas l’inverse.

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": []
}

Objet envoyé : expédition complète, dans son état au moment de l’envoi. Délai avant l’envoi : aucun. Exemple complet : dans le contrat OpenAPI (/openapi/ciklik-webhooks.yaml), webhook updated_shippingbox.

  • Modification directe de l’expédition (adresse, statut, numéro de suivi…) par l’API vendors ou par l’équipe Ciklik.
  • Cascade depuis une adresse, un abonnement ou un client modifié : voir « Effets en cascade ».
  • Liaison d’une expédition à sa commande d’origine (écriture silencieuse).
  • Ajout de personnalisations supplémentaires depuis l’interface interne (extra_customization_products, écriture silencieuse).
  • Recalcul du compteur shipped_count ou correctif d’options par une commande de maintenance interne.

Un objet {colonne : valeur brute}.

Trois origines produisent, chacune, un updated_shippingbox par expédition planifiée depuis le premier jour de l’avant-dernier mois (M-2, par exemple le 1er juillet pour un envoi en septembre), expéditions déjà parties incluses :

OrigineDéclencheurPortée
Adresseupdated_address, quel que soit le champ modifiéchaque abonnement lié à l’adresse
Abonnementchangement d’adresse, de transporteur, de déclinaison, de point relais ou de personnalisation produitl’abonnement modifié
Clientchangement de l’e-mail du clientchaque abonnement du client, en plus de l’updated_user

La cascade du changement d’e-mail est établie dans le code : un client dont l’e-mail change et qui a 12 expéditions dans cette fenêtre déclenche 1 updated_user puis 12 updated_shippingbox (détail sur Événements : clients, adresses et inscriptions). Le changement sur l’abonnement déclenche en plus un ou deux updated_checkoutorder par commande en cours de création (voir Événements : commandes, transactions et factures).

changed de 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"
}
}

Le reste de la charge utile est identique à celle de created_shippingbox. Ici, first_name, last_name, address1, city, country, phone, postcode et mail proviennent de la resynchronisation ; seuls status et tracking_number sont réellement modifiés par l’appelant.

Objet envoyé : expédition complète, même après suppression (l’état est relu au moment de l’envoi, sans tenir compte de la suppression). Délai avant l’envoi : aucun. Exemple complet : dans le contrat OpenAPI (/openapi/ciklik-webhooks.yaml), webhook deleted_shippingbox.

  • Suppression via l’API vendors, DELETE /deliveries/{id}.
  • Validation d’une demande de retrait par l’équipe Ciklik, avec l’option de suppression : seules les expéditions futures sont supprimées.
  • Remboursement d’une transaction par l’équipe Ciklik, avec l’option de suppression : toutes les expéditions de la commande sont supprimées, passées et futures.

Toujours {"deleted": true}, quelle que soit l’expédition.

Aucun effet en cascade propre à la suppression n’est documenté : elle intervient en fin de parcours (retrait validé ou remboursement), sans autre webhook associé.

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

Le reste de la charge utile est identique à celle de created_shippingbox.