Short answer
Open the customer in the Stripe Dashboard and check three things: that the subscription itself shows as canceled, that the customer has no second active subscription, and whether the charge is a final invoice for prorations or pending invoice items. If the cancel only happened inside your app, Stripe never heard about it. Refund the payment from the Payments page, then fix the cancel flow so it cancels in Stripe.
Rather not fix it yourself? App Fix Ticket starts with a fixed-price diagnosis, then a fixed price for the fix before any fix work.
Why the customer was charged, and the fix
01
The app cancelled, but Stripe never did
An app can mark the account as cancelled in its own database and hide the paid features. If the code never cancels the subscription in Stripe, Stripe keeps billing on schedule. Simon checks the cancel button’s code path end to end and confirms the subscription status in Stripe changes.
02
The customer has a second subscription
“Your customer has another active subscription” Stripe, Cancel subscriptions
A customer who signed up twice, or upgraded by starting a new plan, can have two subscriptions. Cancelling one leaves the other billing. Check the customer’s Subscriptions list in the Dashboard. Stripe also says pending invoice items can still be billed while another subscription is active.
03
A final invoice picked up leftover charges
“The subscription cancellation includes a final invoice” Stripe, Cancel subscriptions
Cancelling normally stops new invoices. But if the cancellation includes a final invoice, or the customer has another active subscription, one-off items still waiting to be billed (pending invoice items) can be charged. To stop pending items being billed, delete them.
04
Cancelled at period end, with prorations still waiting
“If you set the subscription to cancel at period end, any pending prorations are left in place and still collected at the end of the period.” Stripe, Cancel subscriptions
Cancelling at the end of the period lets the customer keep what they already paid for. But prorations already created, for example from a plan change earlier in the period, are still charged when that period ends.
05
A future cancel date created a prorated charge
“Setting a future cancel_at date can shorten a renewal period and create a proration debit.” Stripe, Prorations
Setting the subscription to end on a chosen date, rather than at the end of the period, changes the length of the last period, and Stripe can bill for that part as a proration.
Checked against the vendor’s docs on : Stripe docs: Cancel subscriptions; Stripe docs: Prorations; Stripe docs: Refunds.
Rather hand it over?
Fixed scope, fixed price, paid upfront. The work happens in writing; no call needed.
- from $450App Fix TicketOne reproducible bug in an existing mobile or web app, diagnosed and fixed.See scope and start
- $950Stripe Billing Fix and SetupSubscriptions, webhooks, customer portal and failed payments set up or fixed, tested in Stripe test mode.See scope and start
- from $450AI-Built App RescueA Lovable, Bolt or Cursor app checked end to end in 3 days, then its worst problems fixed at a fixed price.No issues worth fixing, no charge. If the Launch Check finds nothing rated medium or higher, Simon refunds the full $450. You keep the report either way. This applies to the first 10 Launch Checks bought after October 30, 2026.See scope and start
“Very responsive, attentive to fixing bugs, and completed the project as needed! Thank you!”
Related: Stripe customer charged twice · Stripe subscription canceled, but access is wrong · Stripe dispute or chargeback · Stripe customers not getting receipts