Skip to main content
A subscription migration moves your active subscribers and their saved cards from your current processor to Dodo Payments. Your customers keep their subscriptions. They don’t enter their cards again, and their billing continues on schedule. You never handle card numbers yourself. Your current processor sends the cards to Dodo Payments in an encrypted export, and you send a subscriptions file that links each subscription to its product, customer, and next billing date.
We migrate saved cards only. Apple Pay, Google Pay, and other wallet payment methods can’t move between processors, so those customers need to add a card again.
To start a migration, contact support. A Solutions Engineer guides you through each step.

Requirements

  • PCI DSS compliance: Your current processor must be able to export card data securely. Dodo Payments is PCI DSS Level 1 compliant. Share our Attestation of Compliance (AOC) with your processor if they ask for it.
  • Live integration: Finish your Dodo Payments integration and send new customers to Dodo Payments checkout before the import. This keeps new sign-ups out of the old system.
  • Authorization: You can request a data export from your current processor. This usually needs the account owner.

How Your Cards Move

You request a card export from Stripe to Dodo Payments. Stripe’s support team handles this request, and Stripe delivers the encrypted export to a secure location that Dodo Payments then retrieves it from. Your Solutions Engineer gives you the details to include in the request.This also covers billing platforms that run on Stripe, such as Polar, Lemon Squeezy, and Chargebee. The cards live in the underlying Stripe account.
The card export usually takes around 2 weeks, depending on your processor’s response times. Prepare your products and subscriptions file while you wait.

Set Up Your Products

Make one subscription product in Dodo Payments for each plan and price you bill today, in the dashboard or with the API. Each product has a product ID of the form pdt_..., which goes in your subscriptions file.
  • Make monthly and yearly plans as two separate products.
  • Set the billing interval and trial on the product, not in the file.
  • The import charges the full product price. It doesn’t apply coupons, discounts, or promotions. If a customer pays a reduced price today (a coupon, a legacy rate, or a discount), make a product at that exact price and use it for that customer. Tell your Solutions Engineer about these customers so they can confirm the amount.
  • Set a long total subscription term, for example 10 years. The term starts on the original subscription start date (started_at), not on the import date. A short term makes the import refuse the subscription.

Prepare subscriptions.csv

Send one CSV file with one subscription per row. If a customer has two subscriptions, use two rows and repeat the customer’s details on each. A column marked Yes is required. Conditional means it’s required only in the case described. Keep every column in the header row, even optional ones, and leave the value empty when it doesn’t apply.
The first customer has one saved card, so card_last4 is empty. The second has more than one, so card_last4 picks the card the subscription charges.
Use the Stripe customer ID, not a platform ID. Polar, Lemon Squeezy, Paddle, Chargebee, and other platforms that run on Stripe give each customer their own ID. Cards are matched on the Stripe cus_... value, so a platform ID matches nothing.
  • Wrong (a platform ID, such as a raw UUID): 11111111-2222-3333-4444-555555555555
  • Right (the Stripe ID): cus_Qa1b2C3d4E5f6G7
Your platform can usually export the Stripe customer ID for each subscription. If you can’t find it, ask your Solutions Engineer for help mapping it.

card_last4 Rules

  • Leave it empty when the customer has only one saved card.
  • Fill it in when the customer has more than one saved card, so the import knows which card the subscription charges.
  • Format the column as text in your spreadsheet. A card ending in 0042 loses its leading zero in a number column. A stripped leading zero still matches, but text keeps the value clear.

Format Rules

  • CSV, UTF-8 encoded, comma separated.
  • Use the exact column names above in the header row, lowercase snake_case.
  • Write dates in ISO 8601 UTC, for example 2025-04-01T00:00:00Z. Paddle files also accept 2025-04-01 and 2025-04-01 00:00:00.
  • first_billing_date must be in the future and after previous_billing_date.
  • Don’t put the price or currency in the file. They come from the product.
  • Wrap a value containing a comma, quote, or new line in double quotes, and write an embedded quote twice ("").
  • Don’t put card numbers, expiry dates, or card tokens from Stripe in the file.

How the Import Runs

Your data goes through three checks before anything is written. Nothing is charged at import.
1

Card export check

The card export is decrypted and checked for structure and card validity. You get a summary of how many cards are ready and which ones are skipped, such as expired cards.
2

Card dry run

The full card import is rehearsed without saving any card. This confirms every card can be imported.
3

Subscriptions check and dry run

Your subscriptions.csv is checked against the format rules and joined to the cards, then every row is rehearsed against your products and account without creating anything.
4

Approval and import

A second person on the Dodo Payments team approves, and the cards and subscriptions are imported.
The import is all or nothing. If any row fails a check, the import doesn’t start. Your Solutions Engineer sends you the rows that failed and why. You correct the file and send it again, and it goes through every check again. If a row is refused during the import itself, the import stops at that row. Once the problem is fixed, it continues from where it stopped, and rows already imported aren’t imported twice.

Renewal Options

You choose how migrated subscriptions renew. The choice applies to the whole import.

After the Import

Stop billing at your old processor before the first Dodo Payments charge. The import doesn’t touch your subscriptions at Stripe, Paddle, or any other processor. If they stay active, your customers are charged twice: once by your old processor and once by Dodo Payments on each subscription’s first_billing_date.Before the go-live date you agree with your Solutions Engineer, set every migrated subscription at your old processor to cancel at the end of its current billing period. The cancellation must take effect on or before the subscription’s first_billing_date, so the old processor doesn’t renew it that day. If a current period ends after first_billing_date, cancel that subscription at once, or ask your Solutions Engineer to move its date. Don’t delete the customers or their saved cards. Cancelling the subscription is enough.
  • You receive a report that maps each old subscription ID (stripe_subscription_id or paddle_subscription_id) to its new Dodo Payments subscription_id. Use it to update your records.
  • You agree a go-live date with your Solutions Engineer, and the first billing cycle is monitored.
  • We recommend checking a sample of migrated subscriptions in your dashboard.

Existing Customers

If a customer already exists in your Dodo Payments account, for example from an earlier migration, the import may create a new customer record for the subscription, linked to the migrated card. You then see two records for that person. This is expected. The check before the import lists these customers, so tell your Solutions Engineer if you want them handled differently.

Migratable Data

PGP Key

Card exports sent over SFTP must be encrypted with the Dodo Payments PGP public key. Share it with your processor.
Before encrypting, check that the key’s fingerprint is 07E7 A69F 2C48 5BF3 4026 40F6 6381 DFCF F34A 59CC.

For Your Processor

Send this section to your processor’s migration team. It covers what they need to upload the card export to Dodo Payments.
  1. Send us an SSH public key. We sign in with keys only, not passwords. Send an ssh-ed25519 or ssh-rsa public key to your Solutions Engineer. Never send the private key. We reply with your SFTP username.
  2. Encrypt the export with the Dodo Payments PGP public key. Check its fingerprint first.
  3. Check our host key on the first connection. It must match one of the fingerprints below.
  4. Upload the file, then tell your Solutions Engineer. Your account can upload files but can’t download or delete them.
Your processor can check the host key before connecting:

Timeline

A migration usually takes 3-4 weeks end to end. Preparing your products and subscriptions file while the card export is in progress keeps it short.

Get Started

Contact Support

Start your migration and get connected with a Solutions Engineer.

Migrate other data

Move products, customers, and discounts with the migration tool.
Last modified on October 16, 2026