CheckoutAlarmWatch my app free

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.

What it would catch here

Nothing on this page. A second subscription looks like a normal, successful sale.

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.

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

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.

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

Cancel and refund

Cancel the extra subscription and refund any charge the customer didn't mean to make. Tell the customer what you did.

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

Know what counts as active

Stripe treats Active, Past due, Unpaid and Paused as active here. Stripe: limit customers to one subscription

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

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

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

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

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.

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.

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 free

Docs checked on Oct 20, 2026.