Cancel at period end
Cancel now, but keep access until the paid period runs out. The renewal just never happens, and nothing is refunded.
See it
What it is
Cancelling at period end flips a flag instead of killing the subscription: no future renewal, but access continues until the term the customer already paid for runs out. In Stripe it is literally cancel_at_period_end: true; elsewhere it is 'turn off auto-renew'. The opposite is an immediate cancel, which ends access now. Whether any money goes back is a separate decision: nothing is refunded unless your contract, your published policy, or local consumer law says so, and even then someone (you or an automated rule) has to actually issue the credit or refund. Ending access and returning money are two different actions in every billing system worth using.
Make it the default for self-serve cancellation. The customer paid through the 30th, so taking the product away on the 12th feels like theft, generates support tickets, and invites a chargeback. It also buys you a win-back window: the subscription is still alive, so 'resume' is one flag flip back to false, with no new checkout, no new payment method, and no lost history.
Gotchas: entitlements must stay ON until the period actually ends, so do not downgrade access at the moment of the cancel request. The webhook that means 'they are really gone' fires at period end (subscription deleted), not when the button is clicked, so anything that offboards data or seats should listen for that one. And show the exact end date in the UI, plus a persistent 'renews: no, ends on Mar 30' banner, or people cancel twice and email you asking whether it worked.
Ask AI for it
Implement cancel-at-period-end for subscriptions. The cancel action should set cancel_at_period_end true rather than terminating the subscription: no refund, no immediate access change, and the current entitlements stay active until current_period_end. In the billing UI, replace the plan status with 'Cancels on {date}, access continues until then' plus a one-click Resume button that flips the flag back to false without a new checkout. Only revoke entitlements and run offboarding when the subscription deleted webhook arrives at period end. Keep a separate admin-only immediate cancel path for support cases, where ending access and issuing money back are two independent steps: the refund or credit is optional, driven by our stated policy and any applicable consumer law, and is only issued by an explicit call. Send a confirmation email stating the exact end date.