Move a Paid Newsletter Without Double-Charging Your Best Readers

The safest way to move a paid newsletter is to separate content, audience data, paid access, and billing into distinct tracks. Stage and test the first three while the old publication remains authoritative, then switch sending and routing only after every paid reader has one verified access state and one intended billing path.
A successful CSV import is not a completed migration. Before cutover, reconcile recurring subscriptions, legacy prices, trials, complimentary access, gifts, and app-store purchases at subscriber level; otherwise, activating destination billing while source billing remains live can charge the same reader twice.
Build a rollback package before changing the source

Create a dated, read-only migration folder containing the post archive, subscriber files, billing reports, tier rules, domain settings, email-authentication records, redirects, RSS details, and publication templates. Keep untouched exports alongside cleaned working copies so a bad transformation does not overwrite the material needed for rollback.
Export more than email addresses. The audience ledger should preserve status, tier, signup date, consent evidence, unsubscribe or suppression state, custom fields, access expiry, and any identifiers connecting a reader to billing. For example, beehiiv’s export documentation says its Quick and Full subscriber files include email, status, and tier; the Full export adds custom fields and statistics, while its post export includes published, archived, and draft posts.
Build a field map with one row per source column and four decisions: destination field, required transformation, fallback value, and rejection rule. Do not turn an unsubscribed, suppressed, or unverified contact into an active reader merely because the destination lacks an identical status.
Stage posts and free readers before paid accounts
Import the archive into a non-public destination first. Inspect representative free and paid posts, images, embeds, author details, publication dates, email-only editions, canonical URLs, and paywall positions. Importers can preserve text while changing specialized blocks or access boundaries, so compare rendered results rather than relying on a completion message.
Next, test a small audience file containing every meaningful status and field combination. Confirm that free readers remain free, suppressed addresses cannot receive a campaign, dates are interpreted correctly, tags create the intended segments, and duplicate handling is understood. Import the full free list only after that test, then reconcile source totals against accepted, rejected, skipped, and duplicate records.
Keep publishing on the source during staging, but record a freeze time. Put every later post, profile edit, signup, cancellation, upgrade, and payment change into a delta file for replay immediately before cutover.
Give every paid reader one billing outcome

Create a control table keyed by email plus the source customer and subscription identifiers. Record the product, price, currency, billing interval, renewal date, subscription state, access expiry, destination tier, and destination billing action. Keep monthly, annual, discounted, founding, and other legacy offers separate until their prices and renewal terms have been verified.
Copying payment data is not the same as moving subscriptions. Stripe’s account-copy documentation says its self-service process copies Customer objects and supported payment data, but not Subscriptions, Invoices, Plans, Coupons, or Charges; it also supplies a mapping file and recommends retaining the source account as a backup. Establish who will recreate the subscriptions and how the old and new identifiers will be matched before activating destination billing.
Platform-specific workflows may add further branches. beehiiv’s Substack migration instructions require destination tiers before mapping, allow legacy price points to retain their existing prices, and direct publishers to pause or cancel source subscriptions after migration to prevent duplicate billing. The same instructions separate complimentary, gifted, and iOS access because those records are absent from Stripe; iOS subscribers require a separate export and must be told to cancel through the App Store.
A list import may grant access without transferring recurring billing. Substack’s mailing-list guidance allows imported paid readers to receive a trial but says they must enter payment information when it ends to keep receiving the newsletter. Classify those readers as requiring reauthorization, not as migrated recurring subscriptions.
Assign each paid record exactly one outcome: migrated recurring billing, temporary complimentary access, reader reauthorization, scheduled expiry, or deliberate cancellation. Do not pause the source merely because the import finished; first verify destination access and the billing outcome for every record, then disable the corresponding source billing path before the destination can collect the same renewal.
Cut over communication and routing in order

Send a migration notice from the established system before the freeze and a brief confirmation from the destination after authentication and inbox tests pass. State what changes, what remains unchanged, whether the reader must act, which sender address to expect, and where billing questions should go. Send exception-specific instructions only to trial, gift, complimentary, or app-store cohorts.
Authenticate the sending domain at the destination before the first full campaign. Verify SPF, DKIM, and DMARC alignment with real messages, then review bounces and complaints from the initial send before increasing volume. Record the former DNS values in the rollback package before replacing them.
Map every valuable old URL to its corresponding new page rather than redirecting the entire archive to the homepage. Path conventions differ between platforms: Ghost’s Substack migration guide documents a special redirect because Substack uses /p/ for public post URLs while Ghost uses it for previews. After DNS changes, test old post links, paid previews, signup pages, unsubscribe links, and canonical destinations.
Move a podcast feed only after the episode archive and metadata are present at the destination. Validate the new feed and confirm that an existing subscription receives a test episode before redirecting or retiring the source feed.
Audit renewals before removing the rollback path
Immediately after cutover, compare source and destination counts for free, paid, complimentary, cancelled, suppressed, rejected, and duplicate records. Test access with accounts representing every tier and exception, including a legacy price, annual plan, gift, iOS purchase, expired subscription, and trial requiring payment authorization.
Monitor delivery failures, complaints, unsubscribe behavior, access requests, failed payments, and suspected duplicate charges. Reconcile completed renewals against the control table through a meaningful billing window, and schedule later checks for annual subscribers whose next charge cannot validate the move immediately.
Keep the old publication read-only or non-public where possible and retain its exports until the access and billing audits are complete. Define rollback triggers in advance, such as widespread lost access, incorrect prices, duplicate charges, broken authentication, or missing archive material. If rollback becomes necessary, restore the previous sending and access route without blindly restarting source billing, because some destination charges may already exist.
Also read:
Subscribe to our newsletter
Get the latest Web3, AI, and crypto news delivered straight to your inbox.