Migration hidden-killers catalogue — the seven failure modes that appear in every post-mortem

The reproducible failure modes — appear in every credible migration post-mortem.

  1. The "thousands of attachment URLs" mistake. A photographer's WP site with 800 portfolio images can have 5,000+ indexable attachment pages. Per WordPress.org support forum: "Thousand of attachment urls are automatically indexed, How do I remove them?" Forgetting them is the #1 cause of post-migration crawl errors.

    • Mitigation: audit /wp-json/wp/v2/media and the XML sitemap before scoping.
  2. ACF custom-field data silently dropped. ACF fields not exposed via REST (the default for fields registered before the ACF-to-REST plugin was installed) won't appear in the JSON export.

    • Mitigation: WP-CLI dump of postmeta and an explicit ACF audit. Catastrophic if discovered mid-migration.
  3. Page-builder pages that "look fine" in staging but are empty templates. Elementor/Divi render via shortcode at request time; a naive REST export returns mostly empty post_content.

    • Mitigation: always render the live page and use that HTML, not the API response.
  4. Staging accidentally indexed before launch. A robots.txt disallow does NOT stop indexing if pages are linked from elsewhere. John Carey's post-mortem: "I've seen migrations where the staging site was accidentally indexed by Google before launch, creating duplicate content issues and cannibalising the live site's rankings."

    • Mitigation: HTTP-header-level noindex, IP allowlist, basic auth, and a Vercel/Netlify preview-deployment password. All four, belt-and-suspenders.
  5. Schema dropped without replacement. Yoast/Rank Math inject Article, FAQ, and Organization schema invisibly. Post-migration the new site has zero schema and gradually loses rich results in SERPs.

    • Mitigation: schema audit as a separate audit deliverable. Bake equivalents into the new stack's templates.
  6. Client editing workflow rejection post-launch. Client logs in to Sanity Studio once, gets confused, asks why they can't "just drag the headline bigger like in Elementor," relationship sours.

  7. Cutting redirects too early. See RULE: Keep migration 301 redirects in place for at least 12 months; never less than 180 days (Google's explicit floor). Cutting redirects at 30/60/90 days destroys recovered traffic. Industry standard is 12 months minimum.