Skip to content
Admin portal → Settings → Migration, and WordPress → Tools → FMS Migration/admin/migration2 weeks of preparation, one morning, 3 days of watchingCannot be undone

Migration, start to finish ​

Every step of the move from the old membership plugin (PMPro) to FMS, in order, with what to do in each situation you may meet. Everyone moves on one morning. You end with every member served by FMS, PMPro switched off, nobody charged twice and nobody locked out.

You'll need

  • An Owner sign-in on the admin portal (a Membership manager can press the hand-over)
  • A WordPress administrator sign-in, with FMS Member Gate 0.56.1 or later
  • The morning agreed with the Business owner (decision cards 18 and 52)
  • One full rehearsal of the whole morning on a copy of the site first

Pick your path ​

ChoicePick it whenWhat differs
Everyone on one morning (the plan)Always. The Business owner chose it on 27 OctoberThe morning is Hand over everyone…. PMPro stays on for a few days so you can go back
One member at a time (fallback)Only for someone the morning missedHand over this member or Hand back on the member's page. See Stragglers
Rehearsal firstAlways, on a copy of the siteSame steps, test keys only. See docs/migration-runbooks/new-vps-test-cutover.md

The sequence at a glance ​

The days count from T, the morning everyone moves. The Business owner sets that date.

PhaseWhenWhereWhoUndo
1. PrepareT-14 to T-7WordPress server, FMS server, admin portalThomas, OwnerNothing changes
2. Load the dataT-2Admin portal, WordPress serverOwnerNothing members see changes
3. VerifyT-1Admin portal, WordPress serverOwnerNothing changes
4. The morningTAdmin portal, WordPress server, FMS serverOwner, Thomas, WordPress adminUntick the switch, Hand back…
5. The next days, PMPro still onT+1 to T+3Admin portal, WordPress serverOwnerUntick the switch, Hand back…
6. PMPro offT+3WordPress server, admin portal, FMS serverWordPress admin, ThomasReactivate PMPro, then a restore
7. Clean upT+3, then T+10Admin portal, FMS serverThomas, MarketingRun the checks again
Which server is which

WordPress and FMS run on different servers. The WordPress server is wp-admin: the plugin settings, the assistant under Tools → FMS Migration, and PMPro. The FMS server is where Thomas changes settings and restarts FMS. The admin portal is FMS's own screens, in a browser. The newsletter archive runs on the FMS server.

Phase 1: Prepare ​

Nothing in this phase changes anything members see. Do it in the two weeks before.

  1. Rehearse the whole morning on a copy of the site. Hand over everyone there, then switch PMPro off there.
  2. Open WordPress → Tools → FMS Migration and press Run checks. Fix every blocking failure. See Step 1: Prepare.
  3. Create the member pages and map them in the plugin. See Member pages.
  4. In the admin portal, check Plans lists Community, Friend, Follower, Fanatic and the team ladder.
  5. Open Settings → Connections and connect every Stripe account in read-only mode. Do not create its webhook endpoint yet.
  6. Ask Thomas to size the day and to check the link between the two servers. The numbers go into the plan.
  7. Check that a failed renewal keeps reading for 30 days (decision card 21). The failed-payment retry settings in each account's Stripe dashboard must retry for 30 days and then cancel the subscription. Thomas checks that the grace setting on the FMS server is 30 days, the default.
  8. Export the Mailchimp audience as a CSV with the Email Address and Tags columns. Keep the file and note the time.

Duplicate addresses

Two WordPress accounts whose addresses differ only by capital letters become one FMS member. Settle those in WordPress first.

Phase 2: Load the data ​

Everything loaded in this phase arrives On PMPro. The old plugin keeps serving everyone.

  1. On each Stripe account's page, press Preview import, map every price it lists, then Import. It runs in the background and resumes if it pauses. See Import existing subscriptions.
  2. Once every account is imported, create its webhook endpoint in that account's Stripe dashboard and paste the signing secret on the account's Webhook section. Both accounts must read Configured.
  3. Open Settings → Consolidation → Invoice history backfill, preview, then run it.
  4. In WordPress, press Export on the assistant, then Download JSON.
  5. In the admin portal, open Members → Import from WordPress. On card 1, Members and memberships — the WordPress export, choose the file, read the grey From the export file box, press Preview, then Import once it says Looks clean. See Import and verify members.
  6. On the same page, card 2, Newsletter unsubscribes — the Mailchimp audience export, choose the Mailchimp CSV, set the time it was taken, Preview, then Apply. See Keep members' newsletter opt-outs.
  7. In WordPress, press Sync restrictions from PMPro. Read the summary: it names articles that were locked through a whole category and are now locked one by one.

Moves money later

Nothing in this phase charges anyone. But once the webhook endpoints exist, Stripe events reach FMS. For a member still on PMPro, FMS only updates its copy. It never charges, cancels or emails them until they are handed over.

Phase 3: Verify ​

Do all of this the day before the morning.

  1. On card 1 of Members → Import from WordPress, with the same file chosen, press Verify. Every row lands in a box. Open each yellow box, fix the cause, export and import again.
  2. If the card lists held members the file no longer carries, read the names. These are people PMPro removed after your export. Press Reconcile absent members… to end them in FMS too.
  3. Open Settings → Consolidation and run Payment health. Nobody may hold two live memberships with different tiers.
  4. Run FMS ↔ Mailchimp. The drift it lists should be lapsed members still holding paid newsletters, and nothing you cannot explain. Leave the fixes alone for now.
  5. In WordPress, press Run checks again. Only two rows may still fail: Every member handed over and New members join through FMS.
  6. On the copy of the site, sign in as one member of each kind and read a locked article. See Every kind of member.
  7. In the evening, take a full backup of FMS under Settings → Backup. Ask the WordPress host for a backup of the WordPress database too.
The Verify result with one box per class of row
Verify compares every row of the export with FMS and writes nothing.
The Verify result with one box per class of row

Click anywhere, or press Esc, to close.

Phase 4: The morning ​

Three people: the Owner at the admin portal, Thomas at the FMS server, a WordPress administrator in wp-admin. Do the steps in this order.

  1. Check the admin portal says production. Open Health → Dead letters, read it, and replay nothing.
  2. Run the Stripe import on each account and the member import again. Press Verify, then Reconcile absent members… if it lists anyone.
  3. Thomas makes each Stripe account writable and arms Stripe writes on the FMS server.
  4. In WordPress, tick Enable FMS gating on this site. The banner reads FMS is serving handed-over members. Nobody moves yet.
  5. In the admin portal, open Settings → Migration and press Hand over everyone…. See Hand everyone over to FMS. Still on PMPro must read 0.
  6. In WordPress, tick Send people who join to FMS's signup and checkout. See The switches for moving members.
  7. Do the checks below. Then Marketing sends the member email.

Checks, the first hour:

  • A card member, a free member, a team admin, a seat and a Community member each sign in on the website
  • Each sees FMS's account page. Card members reach the Stripe billing page
  • A members-only article opens for a paying member
  • Signed out, Join opens FMS's sign-up page
  • The archive button takes a member whose plan includes it into the archive, signed in
  • Run sweep in the assistant finds no errors
  • Health shows the Mailchimp queue going down and no new dead letters
  • Each Stripe account's webhook deliveries succeed, in the Stripe dashboard
  • PMPro changes to handed-over members in WordPress lists no surprises
  • The support inbox is quiet

Moves money

From step 3, FMS charges real cards. Joining is live too. Check a join with a real card and refund it, or wait for the first real member.

The Mailchimp updates take hours

The hand-over queues one Mailchimp update per member. For about 22,000 Community members this takes hours. New members go first, and payments never wait for it. Thomas measured how long beforehand.

Why the archive cannot be checked before the hand-over

While PMPro is switched on, the website shows the archive button only to members FMS serves. Before the hand-over that is nobody. After it, every member whose plan includes the archive gets it.

Phase 5: The next days, PMPro still on ​

PMPro stays switched on for two or three days. The Business owner decides how many, and may choose the same day. This is the only time going back is a click.

  1. Change members in the admin portal only, never in PMPro.
  2. Each morning, read PMPro changes to handed-over members in WordPress.
  3. Each morning, check Health, Dead letters and the support inbox.
  4. Someone missing from FMS? Import again. Open their member page and press Hand over.

If something is wrong

  • The whole website: untick Enable FMS gating in WordPress. PMPro serves everyone again in seconds.
  • One member: press Hand back on their member page. Only that member returns.
  • Everyone, for FMS too: untick the switch, then press the red Hand back everyone… in the Go back card of the Cutover page.

Nothing a member did through FMS meanwhile is lost in Stripe.

The hand-over dialog with counts and warnings
The dialog counts who moves. It lists every warning before you confirm.
The hand-over dialog with counts and warnings

Click anywhere, or press Esc, to close.

Phase 6: PMPro off ​

  1. Check Still on PMPro reads 0 on the Migration page.
  2. In WordPress, press Swap pages, then Sync restrictions from PMPro once more.
  3. Press Open PMPro cutover panel. Every blocking check must pass. Press the deactivate button and type the confirmation word. It deactivates, it never deletes.
  4. Press Run sweep. Every member URL must answer, with no shortcode text and no new errors.
  5. Ask Thomas to retire PMPro's Stripe webhooks and switch off the global Stripe webhook secret.

Cannot be undone

Up to step 4, the master switch or a hand-back restores the old behaviour in minutes. After PMPro is off, going back means reactivating it and checking billing by hand.

Phase 7: Clean up ​

The same day PMPro goes off:

  1. Thomas arms Mailchimp fixes for the window. The Consolidation badge turns red.
  2. Run FMS ↔ Mailchimp, then Update all drifting. Run the check again a few minutes later.
  3. Run Mailchimp → FMS, then Strip all….
  4. Thomas disarms Mailchimp fixes.

The week after:

  1. Check the imported end dates, then switch on the membership emails under Settings → Email. See Membership emails. Card members follow each payment account's own switches: check them under Settings → Connections → Manage → Membership emails.
  2. Marketing sends the win-back campaign.

The full procedure is Step 3: Cutover and rollback.

Every kind of member ​

What happens to each kind, and what to check.

MemberHow they arrive in FMSWhat to checkWatch out for
Pays by card through StripeThe Stripe import, then the export binds their website loginunmatched Stripe customers is 0 in the previewA different address in Stripe and WordPress is fine. Two FMS members for one person is not: the preview names them
Free (comp) with an end dateThe exportTheir end date in FMS, on the member pageAn end date already in the past: FMS ends the membership within an hour. Fix the date in PMPro first
Pays by bank transferThe export, marked externalSame as freeA renewal entered in PMPro after the export: run the import again, it moves the date
Free CommunityThe export, when the Community box was tickedThe Community count on the Migration pageThey lose the 172 articles only paid members may read. Tell them before the morning
Team admin paying through StripeThe Stripe import; the export sizes the teamTeams on the Migration page lists the team with its seatsA team whose Stripe row is missing shows as stripe_team_missing. No free team is created
Team admin paying by invoice or freeThe export, with the team and its seatsSameSeats that join after the export arrive with the next import
Team seatThe export, as a seat on the admin's teamThe team's pageA seat that moved teams in PMPro: Verify lists the old seat; reconcile ends it
Personal plan and a team seatBoth rows, one memberThe member page shows bothThey move with everyone on the Cutover page
Monthly planAs the yearly oneThe plan name ends in monthlyMoves like the yearly plan
Gift recipientThe export, as a free membership with an end dateTheir end dateA gift bought in PMPro but not yet claimed would not move. The owner confirmed none are outstanding; see below
Card failing on the dayThe Stripe import, with a grace windowPast due, in grace on the import resultStripe's own retries settle them. Do not stop them by hand
Card fails after the morningAlready in FMS; Stripe retries the card for 30 daysThe member page shows the membership in graceThey keep reading for up to 30 days (decision card 21). Do not stop them by hand
On an old Stripe price nobody mappedThe Stripe import, under the raw price codeN unmappable plan on the Migration pageMap the price on Connections, then run the import again
No website accountThe export finds no WordPress loginN no website account on the Migration pageThe website cannot find them after hand-over. Fix on the member page under Website account
Two accounts differing by capital lettersMerged into one memberThe preview's yellow Fix these before applying boxSettle on the member page
Removed in PMPro after your exportStill live in FMSVerify, held members the file no longer carriesReconcile absent members… ends them
Joined through PMPro before the morningAdopted from the Stripe webhook, On PMProThe morning's import and VerifyThey move with everyone
Joined through FMS after the morningFMS's from the startMembers list, Served by → On FMSA hand-back never touches them
Cancelled in FMS, then their group is handed backThe cancel stays in StripeStripe and the member pagePMPro's copy is out of date. Fix it in PMPro by hand
Missed by the morning's importNot in FMS, or arrives On PMPro with a later importVerify, MissingImport again, then Hand over on their member page

Things that happen during the move ​

FMS cannot be reached ​

Since plugin 0.57.0, each signed-in member keeps their last answer from FMS for up to 24 hours (decision card 20). Visitors stay locked. This holds once PMPro is off too.

Outage settingWhile PMPro is activeAfter PMPro is off
Keep each member's last answerMembers keep their last answerMembers keep their last answer
Fall back to Paid Memberships ProPMPro decides for articles with their own ruleMembers keep their last answer
Keep content lockedPMPro decides for articles with their own rule. Others stay lockedMembers are locked out

The readiness row If FMS cannot be reached warns when the site is set to lock. A member who signs out during an outage stays locked until FMS answers. See The outage setting.

An import is more than a day old ​

The Migration page shows the box in red and the hand-over dialog repeats the warning. Run the Stripe import on each account and the member import again, then hand over. Skipping it means changes made on the website since are not in FMS. On the morning, run both imports first anyway.

PMPro changes a member you moved ​

In the days PMPro stays on, its nightly check can end a moved member's free membership on PMPro's old end date. That strips their newsletters in Mailchimp. FMS keeps serving them on the website and puts the labels back on its next update. The website's settings page lists each case under PMPro changes to handed-over members. Check any that looks like a real cancellation on the member's page.

A payment fails for a member still on PMPro ​

FMS does nothing. PMPro's retries own it. If the failure is one FMS would normally fix by moving the member to the other Stripe account, the event waits on Health → Dead letters marked legacy_held. After the morning, replay it only if the invoice is still unpaid. See Dead letters.

A member complains after a hand-over ​

Work down A member says they cannot read an article. If FMS has them, the usual cause is a stale sign-in: ask them to sign out and in. If FMS does not have them, their row was missing in Verify. Import again, then hand them over from their member page.

Staff need to change a member still on PMPro ​

Before the morning, the member page shows a yellow Still on PMPro box and the membership buttons are greyed out, with the reason when you point at them. Make the change in PMPro, or wait for the morning. Changing a name, email, note or website login still works.

A member page with the Still on PMPro box and greyed-out actions
Until the morning, FMS refuses to change a member and says why.
A member page with the Still on PMPro box and greyed-out actions

Click anywhere, or press Esc, to close.

An article locked by a whole category ​

The restriction sync locks every article in a locked category one by one. An article filed into a locked category after the last sync has no lock until you sync again. Sync once more right before PMPro is deactivated, then set the access level on each new article.

A gift code or discount code from PMPro ​

No PMPro gift or discount codes are outstanding (owner, 27 Oct). If one turns up, grant the membership by hand: see Give a member free access.

A seat moved from one team to another ​

Verify shows the old seat under held members the file no longer carries and the new seat as seat missing until the import runs. Import, then reconcile.

Raw shortcode text on a page ​

The pages were swapped too early. Press Rollback on the assistant. Swap them only when PMPro is switched off. See Raw shortcode text.

Undo at each stage ​

How far alongHow to undoWhat it cannot undo
Data loaded, nothing handed overNothing to undo. Members see no change—
Switch on, nobody handed over yetUntick the switch—
Everyone handed overUntick the switch to give the website back in seconds, then Hand back everyone… in the Cutover page's Go back cardA cancel or plan change a member made through FMS stays in Stripe
One member has a problemHand back on the member's pageThe same
New sign-ups onUntick the switch. Members who joined through FMS stay with FMS—
Pages swappedRollback on the assistant—
PMPro deactivatedReactivate it, untick the switch, hand everyone backBilling done through FMS meanwhile. Check it by hand

The switch only changes the website

Unticking the switch leaves FMS sending Mailchimp updates for members it serves. Hand them back too.

The red hand-back dialog
Hand back is red on purpose. Read what it does not undo before confirming.
The red hand-back dialog

Click anywhere, or press Esc, to close.

Who does what ​

RoleDoes
Business ownerSets the morning and how long PMPro stays on, answers decision cards 18, 52, 4 and 20 (21 is decided)
Owner (admin portal)Imports, verifies, reconciles, seeds the opt-outs, hands everyone over, hands a group back
Membership managerHands over and hands back
WordPress administratorThe switches, the assistant's buttons, deactivating PMPro
ThomasSizes the day, the link between the servers, the webhook endpoints, Stripe writes, the Mailchimp window
MarketingTells members on the morning and after, sends the win-back campaign

Check it worked ​

  • Still on PMPro reads 0 and the Migration page's bars are full
  • The website's banner reads FMS is serving everyone
  • The URL sweep answers on every member page
  • FMS ↔ Mailchimp and Mailchimp → FMS are clean apart from refused addresses
  • Settings → Audit lists the hand-over under the person who did it
  • A member whose plan includes the archive opens it from the website

Internal staff guide. Screenshots come from the rehearsal rig and never show real members. Project status (for developers and admins).