Events: subscriptions
Four keys: created_subscription, updated_subscription, deleted_subscription, and updated_change_choices (not in the catalogue). General configuration: Understanding a webhook delivery.
Subscription object
Section titled “Subscription object”Every delivery carries the full subscription, with its plan, address and carrier.
| Field | Type | Nullable | Meaning |
|---|---|---|---|
id | integer | no | internal identifier |
uuid | string | no | public identifier |
plan | object | yes | see Plan object |
address | object | yes | see customers/addresses page |
transporter | object | yes | see Carrier object |
created_at | date | no | creation |
end_date | date | yes | end of the current period |
engaged_date | date | yes | end of commitment |
auto_pause_at | date | yes | scheduled automatic pause |
start_date | date | yes | subscription start |
active | boolean | no | subscription is active |
paused | boolean | no | subscription is paused |
next_billing | date | yes | next charge |
update_transporter_at | date | yes | scheduled carrier change |
relay | object | yes | pickup point |
graceMonths | integer | yes | remaining pause months |
user_uuid | string | no | customer (cus_...) |
user_id | integer | no | customer id |
email | string | no | customer e-mail |
revenue | string | no | revenue generated (decimal point) |
refunded | string | no | refunded amount |
customerRevenue | string | no | revenue on the customer side |
customerRefund | string | no | refunded on the customer side |
totalTransactionsSuccess | integer | no | successful transactions |
subTransactionsSuccess | integer | no | successful transactions on the last order |
countTransactions | integer | no | number of transactions of the last order |
customization_products | array | yes | customization |
retry_link | (always null) | yes | retry link |
is_auto | boolean | no | true if an automatic pause starts within 5 days |
interval | string | yes | billing period |
interval_count | integer | yes | multiplier |
switch_plan_uuid | string | yes | scheduled plan switch |
switch_plan_date | date | yes | switch date |
referrer | string | yes | acquisition source (referral, campaign) |
display_interval | string | yes | billing period label |
display_content | string | no | products (comma-separated) |
external_fingerprint | string | yes | PrestaShop fingerprint |
content | array | no | subscription products |
Plan object
Section titled “Plan object”The plan object follows the structure described below.
| Field | Type | Nullable | Meaning |
|---|---|---|---|
id | integer | no | internal identifier |
uuid | string | no | public identifier |
name | string | no | plan name |
short_name | string | yes | short name |
more | string | yes | description |
image | string | yes | image URL |
start_at | date | yes | availability start |
price | number | no | price excluding shipping |
tax | number | no | VAT (0.2 = 20%) |
interval | string | no | billing period |
interval_count | integer | no | multiplier |
shipped_count | integer | no | shipments per cycle |
position | integer | yes | display order |
engaged_interval | string | yes | commitment length |
engaged | boolean | no | plan with commitment |
active | boolean | no | plan is active |
The transporter object follows the same structure as in shipments, detailed under Carrier object.
created_subscription
Section titled “created_subscription”Object sent: full subscription. Delay before sending: none.
When it is sent
Section titled “When it is sent”- Creation on the Ciklik site, or from an order (composable or PrestaShop).
- Gift card activation: same mechanisms, hence an ordinary
created_subscription(gift_activation_codeis stored in the database but not exposed).
When it is not sent
Section titled “When it is not sent”- Subscription import by CSV, background task or command line: silent writes.
What changed contains
Section titled “What changed contains”Always an empty array ([]).
Cascading effects
Section titled “Cascading effects”If the shop has no existing marketing opt-in, a created_optin is sent as well (see customers/addresses/opt-ins page).
Example
Section titled “Example”{ "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": []}updated_subscription
Section titled “updated_subscription”Object sent: full subscription, in its state at the time of sending (state re-read at the time of delivery). Delay before sending: none.
When it is sent
Section titled “When it is sent”The most frequent event, with very different changed contents depending on the action:
- Cancellation by the customer or by you (
canceled_atset,activeset to0,next_billing/switch_plan_datecleared,plan_idif a plan switch was scheduled). - Reactivation of the subscription (
activeset to1,next_billingrecalculated, with cascade if charged immediately). - Restoration of a deleted subscription (
deleted_atcleared, the only signal of the resurrection). - Anti-churn postponement (
next_billing,end_datemoved forward). - Pause by the team, with or without closing pending orders.
- Change of address, carrier, variant, pickup point or customization, with cascade.
- Update through the vendors API,
PUT /subscriptions/{id}.
When it is not sent
Section titled “When it is not sent”- A scheduled plan switch, when it takes effect: the most costly trap on this page.
plan_id,next_billing,switch_plan_date,switch_plan_uuid,auto_pause_at,engaged_datechange in the database without any webhook. - Coupon applied to the next charge, CSV import,
next_billingshifted by the team,interval/interval_countadjustment, bulk deactivation when a site is deleted, a plain history-log entry, PrestaShop technical writes.
What changed contains
Section titled “What changed contains”An object {column: raw value}, dates in database format. Common fields: active, next_billing, end_date, canceled_at, plan_id, address_id, transporter_id, declinaison_id, customization_products, relay, grace_period, deleted_at, updated_at.
Cascading effects
Section titled “Cascading effects”- Cancellation: up to two
updated_subscription(the second one if the subscription was paused). With order closing enabled: oneupdated_checkoutorderperpendingorder. Never adeleted_subscription. - Reactivation with immediate charge: followed by
created_checkoutorder,created_checkouttransaction, oftencreated_checkoutinvoice, timeline 0, 10, 10, 15 s (see orders/transactions/invoices page). - Pause with order closing: one
updated_checkoutorderper order pending and being created, broader than cancellation. - Anti-churn postponement: followed by as many
created_shippingboxas months postponed.
Example
Section titled “Example”{ "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" }}deleted_subscription
Section titled “deleted_subscription”Object sent: full subscription, even after deletion (the state is re-read at the time of delivery). Delay before sending: none.
When it is sent
Section titled “When it is sent”- Deletion through the vendors API,
DELETE /subscriptions/{id}, accepted only on an inactive (cancelled) subscription, 422 otherwise. - Manual deletion by the team, only possible on an inactive subscription.
When it is not sent
Section titled “When it is not sent”- A cancellation: produces an
updated_subscription, never this webhook; these are two distinct actions. - Restoring a deleted subscription: an
updated_subscription(see above).
What changed contains
Section titled “What changed contains”Always {"deleted": true}.
Cascading effects
Section titled “Cascading effects”Before sending, every pending order is marked as failed (one updated_checkoutorder per order). Ciklik then notifies PrestaShop through another channel, which is not a merchant webhook.
Example
Section titled “Example”{ "changed": { "deleted": true }}updated_change_choices on request
Section titled “updated_change_choices ”Object sent: full subscription, same structure as updated_subscription. Delay before sending: none.
Outside the 17 official keys: rejected by POST /webhooks (422, see Configuring webhooks through the API), can only be enabled by the Ciklik team, on request.
When it is sent
Section titled “When it is sent”When customization_products changes on a subscription. Sent in addition to the usual updated_subscription, not instead of it.
When it is not sent
Section titled “When it is not sent”- Any other change on the subscription only produces an
updated_subscription, without this key. - Cannot be enabled through the API, rejected with a 422.
What changed contains
Section titled “What changed contains”A single field, customization_products: format trap, the value is not an object but a string containing encoded JSON, exactly as stored in the database.
Cascading effects
Section titled “Cascading effects”customization_products is one of the fields tracked for the shipments cascade: one updated_shippingbox is sent per shipment scheduled since month M-2 (see the callout above).
Example
Section titled “Example”{ "changed": { "customization_products": "[{\"id\":1,\"quantity\":2}]" }}