Migration Checklist (per practice)¶
Reusable template for migrating a dental practice from an existing site to Helios.
Pre-requisites: Helios platform deployed, practice exists in Aletheia (Practice model with address, phone, hours, team), SiteConfig created.
Phase 1 — Content Extraction¶
1-2 weeks before cutover. Owner: Claude + manual review.
- [ ] 1.1 Crawl existing site
- Run:
npx tsx scripts/crawl-site.ts https://{domain} migrations/{code}/ - Output:
migrations/{code}/crawl.json(all pages with URL, title, meta, H1, body text, images, word count) -
Visually review key pages (homepage, services, contact) in browser for layout/content nuances
-
[ ] 1.2 Build redirect map
- From crawl data, map each old URL to its new Helios URL
- Output:
migrations/{code}/redirects.json({ "/old-path": "/new-path" }) - For Drupal:
/node/XX→/service-ville/(full URL change) -
For WordPress: many URLs may stay the same or similar (low risk)
-
[ ] 1.3 Assess content quality
- Review
migrations/{code}/content-assessment.md(auto-generated by crawl script) - Per page, annotate verdict column: reuse / rewrite / skip
-
Flag thin content (< 100 words), missing images, outdated info
-
[ ] 1.4 Verify Aletheia data completeness
- Check:
GET /sites/{domain}/practice/— address, phone, hours, access info, parking, transit - Check:
GET /sites/{domain}/team/— all dentists have photos, bios, skills, booking URLs - Check:
GET /sites/{domain}/config/— theme colors, logo, favicon, SEO settings -
Flag gaps → fix in Aletheia before Phase 2
-
[ ] 1.5 Upload missing assets
- Team photos, case study before/after images, cabinet gallery photos
- Upload via Aletheia
/web/editor (auto-processed to WebP + responsive srcset)
Phase 2 — Build & QA¶
1 week before cutover. Owner: Aletheia (content) + Helios (config) + manual QA.
- [ ] 2.1 Create all pages in Aletheia
- Minimum pages: homepage, contact, mentions-legales, politique-confidentialite
- Service pages: one hub (L1) + details (L2) per enabled service
- Cabinet pages: philosophie, technologies, tarifs, acces
- Votre-besoin pages linked to services
-
Use content verdicts from 1.3 — paste reusable content, rewrite flagged pages
-
[ ] 2.2 Configure navigation
- Verify:
GET /sites/{domain}/nav/— all items present, correct URLs, proper nesting -
Check dropdowns: Le Cabinet, Nos Soins, Votre Besoin
-
[ ] 2.3 Verify theme on staging
- Visit
{code}-staging.groupe-suffren.com -
Check: colors, fonts, logo, hero images, overall visual quality
-
[ ] 2.4 Add redirect map to proxy.ts
- Import
migrations/{code}/redirects.jsonintoproxy.ts -
Test redirects locally:
curl -I localhost:3000/old-path→ 301 to new path -
[ ] 2.5 QA all pages
- Visit every page on staging
- Check: content renders, images load, nav works, footer correct (hours, address, phone)
- Check: CTAs link correctly, contact form submits, map shows with correct pin
-
Check: mobile responsive, bottom dock visible
-
[ ] 2.6 Lighthouse audit
- Run on homepage + 2-3 key service pages
- Target: Performance > 90, Accessibility > 95, SEO > 95
-
Fix issues before cutover
-
[ ] 2.7 Schema.org validation
- Google Rich Results Test on: homepage (Dentist/LocalBusiness), service page (FAQPage), team member (Dentist)
-
Fix invalid/missing structured data
-
[ ] 2.8 Set up analytics
- Create site in Umami for this practice domain
- Set
NEXT_PUBLIC_UMAMI_WEBSITE_IDin env files - Verify tracking script loads on staging
Phase 3 — DNS Cutover (D-day)¶
Owner: infra + manual verification.
- [ ] 3.1 Deploy to prod
./deploy.sh prod {tag}— includes redirect map, domain config, all content-
Verify Aletheia pages are
published(not draft) -
[ ] 3.2 Update DNS
- Point production domain A record →
54.36.99.184 - Add CNAME
www→ apex domain -
(At domain registrar, not OVH)
-
[ ] 3.3 SSL certificate
- Expand Helios cert:
certbot --expand -d {domain} -d www.{domain} -
Via nginx container on VPS
-
[ ] 3.4 Enable indexing
- Add domain to
PRODUCTION_DOMAINSinsrc/app/robots.ts+src/app/layout.tsx -
Deploy. Until this step, new site has
noindex. -
[ ] 3.5 Test redirects
- Run:
scripts/test-redirects.sh migrations/{code}/redirects.json https://{domain} - Verify all old URLs return 301 → correct new URL
-
Check no redirect loops
-
[ ] 3.6 Submit sitemap
- Google Search Console → Add property → Submit
https://{domain}/sitemap.xml -
Request indexing for homepage + key service pages
-
[ ] 3.7 Verify live site
- Quick smoke test: homepage, nav links, contact form, team, services, mobile
- Not full QA (done in Phase 2)
Phase 4 — Post-Migration Monitoring (2 weeks)¶
Owner: manual monitoring.
| Task | How | Frequency |
|---|---|---|
| Monitor 404s | Sentry alerts + Search Console crawl errors | Daily (week 1), weekly (week 2) |
| Check rankings | Search Console: impressions + clicks for key terms | Weekly |
| Verify redirects | Search Console Coverage: redirect issues | Weekly |
| Core Web Vitals | Search Console CWV report | Weekly |
| Keep old site running | Don't cancel old hosting for 30 days. DNS revert < 5 min. | Rollback safety net |
Quick Reference — Practice Migration Files¶
| File | Purpose |
|---|---|
migrations/{code}/crawl.json |
Crawl output (all pages with metadata) |
migrations/{code}/redirects.json |
Old URL → new URL redirect map |
migrations/{code}/content-assessment.md |
Per-page content verdict (reuse/rewrite/skip) |
proxy.ts |
Redirect map loaded here |
docs/adding-a-practice.md |
Infrastructure setup steps (domain mapping, nginx, SSL) |