The plan was simple: move the large newsletter audiences from the old marketing tool to the new CRM. Before moving anything, I counted what was there.
The setup. Consumer health brands of a European pharmaceutical group, moving from an old marketing tool to a new CRM in September and October 2026. I worked through a digital agency, next to the group's CTO and the brands' marketing team. The plan assumed big newsletter audiences, and the migration was built around them.
How I counted
Before API access existed, I read the form inventory straight from the live tool and gave the client an estimate. Once the API was open, I replaced every estimate with a count, and then sampled the biggest segments against the API to make sure the counts meant what I thought they meant.
The counts contradicted my own earlier estimate. I corrected the report the same day. A wrong number that stays in a report becomes the plan.
What the 'contacts' really were
In plain words:
- 73.1% were not people. They were tracking rows: browsers the tool had seen, with no name and no way to reach anyone.
- 26.4% were named, but had no email. The two large segments the plan was built around held no email addresses at all. They were a postal list, not a newsletter audience.
- 0.4% had an email address. That was the real audience the migration had to carry.
That changed what the migration had to move, and what it could leave behind. With the plan rebuilt on counts, the migration went from 0 to 22 of its 29 checklist items in one push, with the forms finished.
Switching off the old tool without breaking sent emails
Turning off an old marketing tool sounds like one click. It is not, because every email it ever sent still carries links to its domain.
I measured the click tracker before writing any rule. The confirmation link in the 154 double opt-in emails already sent was not a plain address but a tracker path. A simple forwarding rule would have missed it, and anyone confirming a subscription from an old email would have hit an error.
While writing the server rules I caught a default setting that would have routed every other retired domain through them too. I tested the whole setup in a local container and wrote one script that deploys, verifies and rolls back. The switch is now one deploy on the day, with the way back ready.
The same habit on another brand
Here the worry was the opposite: the client suspected a purchase had been lost on the way to the new CRM, and old orders were missing from it.
First I checked the claim against the shop. Every order since the shop started sending orders to the new CRM was there, with the right items and the right revenue. Nothing had been lost.
Then, before importing the old order history, I ran the whole import as a dry run over the entire shop, in batches, and checked the final status myself.
914 records came back with zero errors across customers, products, variants, orders and refunds. The dry run also showed exactly what a real run would fix and what it would not, so nobody would expect the import to repair something it never touches.
On the same brand, my inventory of the old tool found a contact form everyone thought was unused. 71 people had written through it. I describe that one in Five Tracking Failures Nobody Noticed.
Before you switch booking software, a CRM or an email tool
The same counting works for a clinic moving to a new booking system, or a law firm changing its intake tool:
- Ask for counts, not totals. How many records have a working email or phone, and how many agreed to hear from you.
- List everything that feeds the old tool. Forms on every page, and links in emails already sent: confirmations, reminders, tracked clicks.
- Dry run the import. Compare the counts on both sides before anything goes live.
- Keep a way back. A rollback you can run on the day, not a plan to rebuild later.
For a medical practice, plan from counts and keep patient details where they are: you do not need an export of the list to know how much of it you can reach.
Tags
Frequently asked questions
How do I know how much of my contact list I can actually email?
Count the records that have an email address and a recorded opt-in. A dashboard total usually also includes anonymous tracking rows and people you only have a postal address for. Here the share with an email address was 0.4%.
What is a dry run for a CRM migration?
Running the full import in a mode that checks every record and reports what would happen, without writing anything. Here it checked 914 records with zero errors before anything touched the live data.
What breaks when I switch off an old email marketing tool?
Links in emails you already sent. Confirmation links and tracked clicks point at the old tool's domain, so that domain has to keep answering and forward those paths, or people who click an old email land on an error.
Want this loop closed on your account?
I connect your EHR, booking system, and calls to Google Ads so it counts patients who actually showed up. HIPAA-conscious, fixed price, verified in the account.
Prefer writing? (I reply within 24 hours)Prefer escrow? Hire me on Upwork (escrow)