Knowledge
How to Prevent Double Billing During a Stripe Account Transfer
Prevent double billing during a Stripe account transfer: schedules on the renewal date, a 48-hour hold, and cancel at period end.
· Simon Liang
When you move subscriptions between companies, or acquire a SaaS, your first job is to prevent double billing during a Stripe account transfer. A double charge is the fastest way to lose the customers you just acquired.
Stripe has no switch to move billing from one account to another. If you create new subscriptions in the destination account without matching the existing renewal dates, customers pay twice for the same period. This guide explains why that happens and the five mechanisms that prevent it.
How a double charge happens
Stripe's customer copy moves customer records and saved payment methods. It does not move subscriptions, prices, billing meters, or schedules. The destination account starts with cards and zero subscriptions.
The typical mistake:
- The operator sees the copied customers in the destination account.
- The operator creates an active subscription for each of them.
- Stripe charges each card at once.
- The source subscription is still active, and it already charged the same customer for this period.
The customer pays twice. If the seller then cancels the source subscriptions at once, refunds and confusion follow.
Mechanism 1: Start each schedule on the renewal date
Never create an immediate subscription in the destination account. Create a subscription schedule with a future start date:
- Read the source subscription with a read-only key.
- Take its
current_period_end. - Create a destination schedule that starts on that exact timestamp.
- Attach the recreated price and the copied customer.
The destination account waits until the paid period ends, then sends the next regular renewal invoice. One charge, on the expected date.
Mechanism 2: Flag renewals within 48 hours
A subscription that renews during the migration can collide with it. The source account charges the renewal, current_period_end moves forward, and a schedule built from the old date can charge again right after.
Flag every subscription that renews within 48 hours. Let it renew in the source account first. After current_period_end rolls forward, schedule it in a later pass.
Mechanism 3: Check the default payment method
The customer copy sometimes drops the invoice default payment method. A customer with a saved card but no default fails to pay when the schedule starts, and the invoice goes past due.
Verify every copied customer in the destination account. Where the default is missing, set it from the copied payment method before any schedule is created.
Mechanism 4: Cancel at period end, never immediately
There are two ways to cancel a Stripe subscription: immediately, or at period end (cancel_at_period_end: true).
Never cancel the source subscriptions immediately. That ends paid access before the destination schedule starts, and leaves the customer with nothing if the destination fails.
Set cancel_at_period_end: true. The source subscription stays active until the period ends and sends no further invoice. At that moment the destination schedule starts.
Mechanism 5: Three gates, three keys
- Read-only source. The source key can only read. Catalog recreation, customer verification, and schedule creation all run while the source account keeps billing.
- Decisions on flagged subscriptions. Renewals within 48 hours, coupons, trials, past due, existing schedules, manual tax rates, missing payment methods, and unusual items get a decision from the source owner, not a batch.
- Verified schedules, then a narrow cancellation key. Read every schedule back and check the start date, customer, price, quantity, and tax. Only then use a separate key that can only set cancel at period end.
What stays your job
These mechanisms cover Stripe Billing objects. Your team still updates the application database with the new IDs, switches the API keys, points the webhooks at the destination account, and checks entitlements.
SubPorter runs all five mechanisms as gates in a migration project.
Frequently Asked Questions
Why does a Stripe account transfer cause double billing?
- Stripe’s customer copy moves customers and cards, not subscriptions. If an operator creates active subscriptions in the destination account while the source subscriptions still run, both accounts charge the same period.
How do subscription schedules prevent a double charge?
- A subscription schedule has a start date. Set it to the source subscription’s current period end, and the destination account bills only after the paid period ends.
Why hold subscriptions that renew within 48 hours?
- A renewal during the migration moves the period end forward, and a schedule built from the old date can charge again. Let these renew in the source account first, then schedule them in a later pass.
Should source subscriptions ever be cancelled immediately?
- No. Set them to cancel at period end. The customer keeps paid access until the destination schedule starts at that same moment.
How does SubPorter verify the schedules before the cancel step?
- It reads every schedule back from Stripe and checks the customer, start date, price, currency, quantity, collection method, and tax against the plan. The cancel step stays locked until every check passes.