Proration, in plain words
Proration means charging or crediting only for the part of the period that is left. A customer on ₦30,000 a month who upgrades to ₦60,000 halfway through pays the ₦15,000 difference for the half month that is left, not a whole new month. Bouclay’s default is the one most customers expect:- More (more seats, a dearer plan): applied now, and the difference for the rest of the period is billed now.
- Less (fewer seats, a cheaper plan, removing an add-on): waits until the next renewal, so the customer keeps what they already paid for.
Change seats or a price
Change one item’s quantity or price withPATCH /subscriptions/{id}/items/{item}:
prorationBehavior overrides the default:
Send
"remove": true to take an item off.
Preview first. POST /subscriptions/{id}/items/{item}/preview takes the same body and returns what the change would bill, without making it. Show it to the customer before they confirm. It only needs subscriptions:read.
Move to another plan
To switch the whole subscription to another plan, usePOST /subscriptions/{id}/plan-change:
- Timing. A change that costs the same or more is applied
now; one that costs less waits for thenext_renewal. Override withtiming. Moving from monthly to yearly applies now and credits the unused part of the month. - Charges are matched up. A usage charge carries on onto the new plan’s charge that counts the same meter; a fixed charge carries on onto the one with the same code. Charges with no match end, and the new plan’s other charges start.
- One pending change. A plan change booked for the next renewal replaces any plan change already pending.
POST /subscriptions/{id}/plan-change/preview shows which charges carry on, end and start, and the invoice it would raise now.
Price increases for existing subscribers
Prices never change once used. To charge more, create a new price, then move subscribers onto it with an item change or a plan change, usually withtiming: next_renewal so nobody pays the new price mid-period.
Add or end a charge for current subscribers
A charge added to a plan only reaches new subscribers. To give it to everyone already on the plan, callPOST /charges/{id}/add-to-subscribers: each live subscriber gets it at their next renewal (at once for trialing or paused ones, since nothing is billed). POST /charges/{id}/end-for-subscribers ends a charge the same way. Running either again skips subscribers already done.
Retire a plan
Early access.
POST /plans/{id}/retirement with retiresAt and, ideally, successorPlanId.
- From now on, nobody new can start or switch onto the plan.
- Each subscriber moves at their first renewal on or after
retiresAt, so nobody loses time they paid for: to a plan change or cancellation they already booked, else to the successor plan’s price in the same currency and interval. - With no successor, the subscription pauses (
pauseReason: plan_retired) and bills nothing until you move it to another plan and resume it.
DELETE /plans/{id}/retirement takes it back.