The brief arrived the way these always do: a spreadsheet, a deadline, and a sentence that read "we absolutely cannot lose our organic traffic." Twelve years of recipes, guides and seasonal posts, all living inside a Wix site with URLs nobody had ever audited.
Audit before you export anything
Before a single post moved I pulled every indexed URL from Search Console, the sitemap and a full crawl, then de-duplicated the three lists. That produced 81,400 URLs — about 1,400 more than the client believed existed. Roughly 6,000 of them had never earned a click in three years.
Those 6,000 were the win. Not migrating dead weight cut the import time in half and removed thousands of thin pages the new site would have had to justify.
Redirects are patterns, not rows
Eighty thousand redirects would have made the server cry. Wix URL structures are predictable enough that almost everything collapsed into 312 regex rules, with a hand-written list for the two hundred pages that mattered most — the ones driving 80% of the traffic.
wp post list --post_type=post --format=csv \ --fields=ID,post_name,post_date > live-posts.csv # dry run first, always wp rewrite import redirects.csv --dry-run
Every rule was tested against a sample of live URLs on staging before cutover. The dry run caught fourteen rules that would have chained two hops — enough to leak authority on the pages that could least afford it.
A migration is not a content transfer. It is a promise that every old link still lands somewhere useful.
Cutover on a Tuesday morning
Never a Friday. We flipped DNS at 9am with the client on a call, ran the redirect test suite twice, and resubmitted the sitemap within the hour. Traffic dipped 4% for six days, then came back above where it started.
- Staging built from real content, not lorem ipsum
- Redirect suite run pre- and post-cutover
- Analytics and Search Console verified before the announcement
- A rollback plan nobody needed but everybody wanted
What I would do differently
Two things. First, I would prune the dead 6,000 posts a month earlier, so the client had time to disagree with me calmly. Second, I would build the image pipeline before the import rather than after — recompressing 40,000 images retroactively cost a weekend nobody billed for.
If you are staring down a migration and the phrase "we cannot lose traffic" is in the brief, the honest answer is that you can protect it — but only with an audit first and a redirect map you actually tested.
WordPress and Bricks developer. 100+ production builds, five years of migrations, and a stubborn refusal to ship below Lighthouse 90.