Aller au contenu

Événements : abonnements

Quatre clés : created_subscription, updated_subscription, deleted_subscription, et updated_change_choices (hors catalogue). Configuration générale : Comprendre un envoi de webhook.

Chaque envoi porte l’abonnement complet, avec sa formule, son adresse et son transporteur.

ChampTypeNullableSens
identiernonidentifiant interne
uuidchaînenonidentifiant public
planobjetouivoir Objet formule
addressobjetouivoir page clients/adresses
transporterobjetouivoir Objet transporteur
created_atdatenoncréation
end_datedateouifin de période en cours
engaged_datedateouifin d’engagement
auto_pause_atdateouipause auto programmée
start_datedateouidébut d’abonnement
activebooléennonabonnement actif
pausedbooléennonabonnement en pause
next_billingdateouiprochain prélèvement
update_transporter_atdateouitransporteur programmé
relayobjetouipoint relais
graceMonthsentierouimois de pause restants
user_uuidchaînenonclient (cus_...)
user_identiernonid client
emailchaînenone-mail du client
revenuechaînenonCA généré (point décimal)
refundedchaînenonremboursé
customerRevenuechaînenonCA côté client
customerRefundchaînenonremboursé côté client
totalTransactionsSuccessentiernontransactions réussies
subTransactionsSuccessentiernontransactions réussies sur la dernière commande
countTransactionsentiernonnombre de transactions de la dernière commande
customization_productstableauouipersonnalisation
retry_link(toujours nul)ouilien de reprise
is_autobooléennonvrai si une pause automatique démarre dans les 5 jours
intervalchaîneouipériodicité
interval_countentierouimultiplicateur
switch_plan_uuidchaîneouibascule programmée
switch_plan_datedateouidate de bascule
referrerchaîneouisource d’acquisition (parrainage, campagne)
display_intervalchaîneouilibellé de périodicité
display_contentchaînenonproduits (virgule)
external_fingerprintchaîneouiempreinte PrestaShop
contenttableaunonproduits abonnement

L’objet plan suit la structure décrite ci-dessous.

ChampTypeNullableSens
identiernonidentifiant interne
uuidchaînenonidentifiant public
namechaînenonnom de la formule
short_namechaîneouinom court
morechaîneouidescription
imagechaîneouiURL image
start_atdateouidébut de disponibilité
pricenombrenonprix hors port
taxnombrenonTVA (0.2 = 20 %)
intervalchaînenonpériodicité
interval_countentiernonmultiplicateur
shipped_countentiernonenvois par cycle
positionentierouiordre d’affichage
engaged_intervalchaîneouidurée d’engagement
engagedbooléennonformule engageante
activebooléennonformule active

L’objet transporter suit la même structure que dans les expéditions, détaillée sur Objet transporteur.

Objet envoyé : abonnement complet. Délai avant envoi : aucun.

  • Création sur le site Ciklik, ou depuis une commande (composable ou PrestaShop).
  • Activation d’une carte cadeau : mêmes mécanismes, donc un created_subscription ordinaire (gift_activation_code en base, non exposé).
  • Import d’abonnements par CSV, tâche de fond ou ligne de commande : écritures silencieuses.

Toujours un tableau vide ([]).

Sans inscription marketing existante pour la boutique, un created_optin part aussi (voir page clients/adresses/inscriptions).

created_subscription
{
"id": 1,
"uuid": "sub_N8PxGUEdS2U7DP",
"plan": {
"id": 1,
"uuid": "boutique-exemple-box-mensuelle-1",
"name": "Box mensuelle",
"short_name": "Mensuelle",
"more": "Une sélection de trois thés chaque mois",
"image": "https://s3.eu-central-1.amazonaws.com/ciklik-media/plans/box-mensuelle.jpg",
"start_at": null,
"price": 29.9,
"tax": 0.2,
"interval": "month",
"interval_count": 1,
"shipped_count": 1,
"position": 1,
"engaged_interval": null,
"engaged": false,
"active": true
},
"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",
"end_date": "2026-10-09T00:00:00.000000Z",
"engaged_date": null,
"auto_pause_at": null,
"start_date": "2026-06-10T00:00:00.000000Z",
"active": true,
"paused": false,
"next_billing": "2026-10-10T08:15:42.000000Z",
"update_transporter_at": null,
"relay": null,
"graceMonths": null,
"user_uuid": "cus_Qx7hR3eaEowcv1DX",
"user_id": 1,
"email": "claire.martin@example.com",
"revenue": "0.00",
"refunded": "0.00",
"customerRevenue": "0.00",
"customerRefund": "0.00",
"totalTransactionsSuccess": 0,
"subTransactionsSuccess": 0,
"countTransactions": 1,
"customization_products": [
{
"id": 1,
"quantity": 1
}
],
"retry_link": null,
"is_auto": false,
"interval": "month",
"interval_count": 1,
"switch_plan_uuid": null,
"switch_plan_date": null,
"referrer": "newsletter",
"display_interval": "Monthly",
"display_content": "Box découverte",
"external_fingerprint": null,
"content": [
{
"external_id": "1042",
"quantity": 1,
"product_id": 1,
"subscription_id": 1
}
],
"changed": []
}

Objet envoyé : abonnement complet, dans son état au moment de l’envoi (état relu au moment de l’envoi). Délai avant envoi : aucun.

Événement le plus fréquent, avec des changed très différents selon le geste :

  • Annulation par le client ou par vous (canceled_at renseigné, active à 0, next_billing/switch_plan_date vidés, plan_id si bascule programmée).
  • Réactivation de l’abonnement (active à 1, next_billing recalculé, avec cascade si le prélèvement est immédiat).
  • Restauration d’un abonnement supprimé (deleted_at vidé, seul signal de la résurrection).
  • Report anti-churn (next_billing, end_date déplacés).
  • Mise en pause par l’équipe, avec ou sans fermeture des commandes en attente.
  • Changement d’adresse, de transporteur, de déclinaison, de point relais ou de personnalisation, avec cascade.
  • Mise à jour par l’API vendors, PUT /subscriptions/{id}.
  • La bascule de formule programmée, à son échéance : le piège le plus coûteux de cette page. plan_id, next_billing, switch_plan_date, switch_plan_uuid, auto_pause_at, engaged_date changent en base sans aucun webhook.
  • Coupon sur la prochaine échéance, import CSV, décalage de next_billing par l’équipe, ajustement d’interval/interval_count, désactivation en masse à la suppression d’un site, simple enregistrement d’une ligne d’historique, écritures techniques PrestaShop.

Objet {colonne: valeur brute}, dates au format base. Champs courants : active, next_billing, end_date, canceled_at, plan_id, address_id, transporter_id, declinaison_id, customization_products, relay, grace_period, deleted_at, updated_at.

  • Annulation : jusqu’à deux updated_subscription (le second si l’abonnement était en pause). Fermeture des commandes activée : un updated_checkoutorder par commande pending. Jamais un deleted_subscription.
  • Réactivation avec prélèvement immédiat : enchaîne created_checkoutorder, created_checkouttransaction, souvent created_checkoutinvoice, chronologie 0, 10, 10, 15 s (voir page commandes/transactions/factures).
  • Mise en pause avec fermeture des commandes : un updated_checkoutorder par commande en attente et en cours de création, plus large que l’annulation.
  • Report anti-churn : suivi d’autant de created_shippingbox que de mois reportés.
changed de updated_subscription
{
"changed": {
"next_billing": "2026-11-10 08:15:42",
"end_date": "2026-11-09 21:59:59",
"updated_at": "2026-09-10T08:15:42.000000Z"
}
}

Objet envoyé : abonnement complet, même après suppression (l’état est relu au moment de l’envoi). Délai avant envoi : aucun.

  • Suppression via l’API vendors, DELETE /subscriptions/{id}, acceptée seulement sur un abonnement inactif (annulé), 422 sinon.
  • Suppression manuelle par l’équipe, possible seulement sur un abonnement inactif.
  • Une annulation : produit un updated_subscription, jamais ce webhook, ce sont deux actions distinctes.
  • La restauration d’un abonnement supprimé : un updated_subscription (voir plus haut).

Toujours {"deleted": true}.

Avant l’envoi, chaque commande pending passe en échec (un updated_checkoutorder par commande). Ciklik prévient ensuite PrestaShop par un autre canal, qui n’est pas un webhook marchand.

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

updated_change_choices sur demande

Section intitulée « updated_change_choices »

Objet envoyé : abonnement complet, même structure que updated_subscription. Délai avant envoi : aucun.

Hors des 17 clés officielles : refusée par POST /webhooks (422, voir Configurer les webhooks par l’API), activable uniquement par l’équipe Ciklik, sur demande.

Quand customization_products change sur un abonnement. Envoyé en plus de l’updated_subscription habituel, pas à sa place.

  • Tout autre changement sur l’abonnement ne produit qu’un updated_subscription, sans cette clé.
  • Impossible à activer par l’API, refusé en 422.

Un seul champ, customization_products : piège de format, la valeur n’est pas un objet mais une chaîne contenant du JSON encodé, telle que stockée en base.

customization_products fait partie des champs suivis pour la cascade expéditions : un updated_shippingbox part par expédition planifiée depuis le mois M-2 (voir l’encadré plus haut).

changed de updated_change_choices
{
"changed": {
"customization_products": "[{\"id\":1,\"quantity\":2}]"
}
}