00 / guide
Stripe customer subscribed twice: stop duplicate subscriptions
A customer writes in: "You charged me twice." In Stripe you find two active subscriptions for the same person. Here is how to clean it up, and the settings that stop it happening again.
01 / what CheckoutAlarm checks
a
What it would catch here
Nothing on this page. A second subscription looks like a normal, successful sale.
b
What it won't catch
It doesn't look for duplicate subscriptions or double charges. It watches for undelivered webhook events, disabled endpoints and sales that stop. Use Stripe's settings below.
c
Plans
Free: 1 site, checked once a day. Pro: $19 a month, up to 3 sites checked hourly. You prove you own the site first. For Stripe we only take a restricted key with read access to Events, Webhook Endpoints and Charges. Full secret keys are refused. Compare plans
02 / find the duplicates
1
In the dashboard
Open the customer in Stripe and look at their subscriptions. Also search by email: a second Customer with the same email often holds the second subscription.
2
With the API
List subscriptions with the customer filter. By default the list leaves out canceled ones, so what you see is still billing. Stripe API: list subscriptions
3
Cancel and refund
Cancel the extra subscription and refund any charge the customer didn't mean to make. Tell the customer what you did.
03 / stop it in Stripe
1
Turn on limit to one subscription
In Stripe's Checkout and Payment Links settings, you can send customers who already have an active subscription to the customer portal or to your site. Stripe: limit customers to one subscription
2
Know what counts as active
Stripe treats Active, Past due, Unpaid and Paused as active here. Stripe: limit customers to one subscription
3
Keep the portal login link on
Stripe warns that if you turn off the portal login link, customers can create multiple subscriptions. Stripe: limit customers to one subscription
04 / stop it in your code
1
Reuse the same Customer
Stripe spots an existing subscriber from the Customer on the session, or from the email. Save each user's Stripe Customer ID and pass it when you create checkout. Stripe: how detection works
2
Check before you create
Before you open checkout, list the user's subscriptions. If one is active, show "Manage plan" instead of "Subscribe". Stripe API: list subscriptions
3
Use idempotency keys
If your server creates subscriptions with the API, send an Idempotency-Key. When a double-click or a network retry sends the same request again, Stripe returns the first result instead of making a second one. Stripe suggests a random V4 UUID. Stripe API: idempotent requests
4
Make webhooks safe to run twice
Stripe can send the same event more than once. Save event IDs and skip ones you already handled. Stripe: handle duplicate events More in missed webhooks.
05 / questions
- Can Stripe stop a customer from subscribing twice?
- Yes, for Checkout and Payment Links. Stripe has a setting that sends customers who already have an active subscription to the customer portal or a page on your site instead.
- How does Stripe know the customer already subscribed?
- It uses the Customer on the Checkout Session, or the email the customer types in. If your app makes a new Customer every time, Stripe can't link them.
- Does CheckoutAlarm catch duplicate subscriptions?
- No. It reads events, webhook endpoints and charges for delivery problems and stalled sales. It doesn't compare subscriptions per customer.
06 / where CheckoutAlarm fits
CheckoutAlarm won't catch duplicate subscriptions. It watches for undelivered events, disabled endpoints and stalled sales with a read-only key.
CheckoutAlarm is new. It only checks sites you prove you own. How to verify
Watch my app free07 / sources
- Stripe: limit customers to one subscription
- Stripe API: list subscriptions
- Stripe API: idempotent requests
- Stripe: handle duplicate events
Docs checked on Oct 20, 2026.