Dr J's Binding Protocol — Document 15

Site Migration & Launch

Complete operational playbook for replacing the old WordPress/WooCommerce websites with new custom-built sites. Covers 301 redirect mapping, DNS cutover, SEO preservation, email continuity, launch-day procedures, and post-launch monitoring for patriotchassis.com and thehighroadmanufacturing.com.

← Back to Build Hub

Contents

  1. Migration Architecture Overview
  2. Priority Matrix — Must Do vs. Clean Up After
  3. Pre-Migration Audit & Benchmarks
  4. DNS & SSL Cutover Strategy
  5. 301 Redirect Map — Patriot Chassis
  6. 301 Redirect Map — The High Road Manufacturing
  7. Email Continuity
  8. SEO Preservation
  9. Pre-Launch Verification Checklist
  10. Launch Day Procedure
  11. Post-Launch Monitoring
  12. Rollback Plan
  13. External Profile & Directory Updates
  14. Analytics & Tracking Migration
  15. Old Site Archiving
  16. Golden Rules

1. Migration Architecture Overview

We are replacing two WordPress/WooCommerce/Elementor sites with purpose-built static HTML + PHP sites. This is a full platform migration — not a theme change or CMS upgrade. Every URL structure, every asset path, and every server-side behavior changes.

Sites Being Migrated

Property Patriot Chassis The High Road Mfg
Domain patriotchassis.com thehighroadmanufacturing.com
Old platform WordPress + WooCommerce + Elementor + Astra WordPress + WooCommerce + Elementor + Astra + NitroPack
New platform Custom HTML/CSS/JS + PHP API + MySQL Custom HTML/CSS/JS + PHP API + MySQL
Old URL count ~197 (28 pages + 84 products + 14 categories + 67 tags + misc) ~145 (28 pages + 107 products + 9 categories + 1 post)
New URL count 103 (20 pages + 83 products) ~28 (12 pages + 16+ products + portal)
Product URL pattern /product/{slug}//product.php?p={slug} /product/{slug}//product.php?slug={slug}
Google indexed pages ~100+ (healthy indexing) ~3 (broken site, almost nothing indexed)
Social presence Facebook, Instagram (1,381 followers) Alignable only (no FB/IG found)
Migration risk Medium — significant indexed content Low — almost no SEO equity to preserve
Critical difference: Patriot Chassis has ~100+ indexed URLs, active backlinks from enthusiast forums (Pirate 4x4, Fuel Curve, Classic Broncos), and an active Instagram following. Every redirect matters. The High Road has almost no SEO equity — only 3 pages indexed, broken WooCommerce, 500 errors on product pages. THR migration is nearly a fresh start.

Migration Flow

DevHub (Build) Production (Live) ================== ==================== 1. Sites built & tested Old WordPress sites running on DevHub preview URLs at patriotchassis.com & thehighroadmanufacturing.com 2. 301 redirect map finalized & .htaccess rules written 3. DNS TTL lowered (T-7 to T-1) 4. SSL certs pre-provisioned Old server still live via DNS-01 challenge 5. devhub-deploy push ------> New files deployed to production docroot 6. .htaccess redirects active Old URLs redirect to new WordPress files removed New site serves all traffic 7. Post-launch monitoring Verify redirects, SSL, for 72 hours email, analytics 8. DNS TTL raised Old server decommissioned Old site archived after 30-day hold
Key principle: The old and new sites will share the same production server (prod-hetzner) and the same domain. This is a docroot swap, not a server migration. DNS records do not change. The dpanel nginx vhost continues to point at the same docroot — only the files inside it change.

2. Priority Matrix — Must Do vs. Clean Up After

Not everything has to be perfect on launch day. This section separates the hard blockers from the items that can be addressed in the days and weeks after go-live. Get the “Must Do” list to zero before deploying. Work through “Clean Up After” in the first 30 days.

20
Must Do Before Launch
16
Clean Up After Launch
⚠ Must Do Before Launch — Site Will Break Without These
  • Production .env files — DB credentials, Stripe keys, SITE_URL, MAIL_METHOD=sendmail, CORS_ORIGIN. Without this, nothing connects. §8 Pre-Launch
  • Purge all DevHub URLs from source files — search for devhub, preview.ecom.jj, devhub-mysql, devhub-mailhog. Any left behind will cause broken API calls, wrong CORS, or Google indexing DevHub URLs. §8 Pre-Launch
  • Product redirect pattern ruleRewriteRule ^product/([a-z0-9-]+)/?$ catches all ~84 PC products and ~107 THR products. Without this, every product page from the old site is a 404. §4, §5 Redirect Maps
  • Top page redirects/products//shop.html, /about//about.html, /contact//contact.html, and the other high-traffic pages. These are the pages people have bookmarked and Google has indexed. §4, §5 Redirect Maps
  • Trailing slash normalization rule — WordPress uses trailing slashes on every URL. New site uses .html. Without the catch-all RewriteCond/RewriteRule, every bookmarked URL with a trailing slash 404s. §4 Redirect Maps
  • Production database provisioned with BOTH table tiers — Create the database and run ALL migrations. This creates two sets of tables: Hub tables (thr_*) for admin management AND Site tables (ths_*) for the live website. Verify with SHOW TABLES LIKE 'thr_%' and SHOW TABLES LIKE 'ths_%' — both must return results. Doc 10 §4
  • Product data pushed from Hub to Site tables — After migration, thr_products has data but ths_products is empty. Run the push (push.php?action=push-all or Portal deploy) to copy products from Hub → Site DB. Then run php api/generate-products-js.php to rebuild the JS data file. Without this step, the shop page will show zero products even though admin shows a full catalog. Doc 10 §4
  • .env has both DB_PREFIX and SITE_PREFIX — The production .env must define DB_PREFIX=thr_ (Hub tier) and SITE_PREFIX=ths_ (Site tier). If SITE_PREFIX is missing, config.php defaults to ths_, but relying on defaults is fragile. Make it explicit. Doc 10 §4
  • Stripe production keys in database — Switch from test keys to live keys in the settings table. Without this, checkout is broken. §8 Pre-Launch
  • Nginx vhost updated — PHP-FPM handler for .php files, custom 404 page directive. Without PHP handling, product pages and all API endpoints return raw PHP source code. §3 DNS & SSL
  • New robots.txt — Do NOT copy the old ones. Old THR has Disallow: /*? which blocks all product pages. Write fresh with only /admin/ and /api/admin/ blocked. §7 SEO
  • New sitemap.xml with production URLs — Must reference https://patriotchassis.com/ not DevHub. §7 SEO
  • Canonical tags use production domain — Every page has rel="canonical". If these point to DevHub, Google indexes DevHub instead of the real site. §7 SEO
  • CORS origin set to production domain — API calls from the frontend will be blocked by the browser if CORS is still set to the DevHub origin. §8 Pre-Launch
  • Email sending works — Contact form, order confirmations, and chassis request notifications must send via sendmail on production. Test before launch. §6 Email
  • 404 page returns HTTP 404 — The custom 404 page must return a 404 status code, not 200. Verify via curl -I. §8 Pre-Launch
  • Forms submit successfully — Contact, chassis request, air ride request, full build. Test end-to-end including email delivery. §9 Launch Day
  • Old site files archived — Tarball of WordPress files + database dump BEFORE deploying new files. This is the rollback safety net. No archive = no deploy. §14 Archiving
  • Feeds updated with production URLs — Google Merchant XML and Facebook CSV currently contain DevHub preview URLs. Must reference https://patriotchassis.com/. §8 Pre-Launch
  • Admin auth strengthened — Current admin uses a simple token. Production needs something harder to guess at minimum. §8 Pre-Launch
✓ Clean Up After Launch — First 7–30 Days
  • Monitor access logs for missed 404s and add redirects — The redirect map covers known URLs, but real traffic will reveal edge cases. Parse access.log daily for the first week. §10 Post-Launch
  • WordPress infrastructure redirects/wp-admin, /wp-content/, /wp-includes/, /wp-login.php. Low priority because no humans bookmark these, but bots and scrapers hit them. Add in Week 1. §4, §5 Redirect Maps
  • Tag page redirects (67 URLs) — All 67 /product-tag/ URLs are thin taxonomy pages with minimal SEO value. The pattern rule handles them, but these are low-value redirects. §4 Redirect Maps
  • Submit sitemap to Google Search Console — Do on launch day ideally, but the site works fine without it. Google will find the sitemap via robots.txt. §7 SEO
  • Submit sitemap to Bing Webmaster Tools — Lower priority than Google. Do in first week. §7 SEO
  • Request indexing on key pages via URL Inspection tool — Speeds up re-indexing but Google will crawl naturally. Nice to do on Day 1, not a blocker. §7 SEO
  • Update Google Business Profile — Verify website URL is correct. Create one for THR if it doesn’t exist. Do within 48 hours. §12 External Profiles
  • Update Facebook & Instagram profile links — Check bio links point to production URLs. Update within 48 hours. §12 External Profiles
  • Update Alignable listing (THR) — Low-traffic directory. Do in first week. §12 External Profiles
  • Install GA4 tracking — Important for measuring post-migration traffic, but the site functions without it. Ideally on Day 1, not a hard blocker. §13 Analytics
  • Set up uptime monitoring — UptimeRobot or similar. Do on launch day but not a pre-deploy requirement. §10 Post-Launch
  • Run Screaming Frog crawl for broken links — Full-site crawl to catch any broken internal links or images. Do Day 2–3. §10 Post-Launch
  • Update ad platform landing page URLs — If running Google/Facebook Ads, update landing pages. Old URLs redirect so ads won’t break, but direct links are better. First week. §13 Analytics
  • Update email signatures — Team email signatures with deep links to old URL patterns. First week. §12 External Profiles
  • Wayback Machine archiving of old site — Submit key pages to web.archive.org for permanent record. Nice to have, not time-sensitive. §14 Archiving
  • Decommission old WordPress database tables — After 30–90 days of stable operation, clean up old wp_* tables. No rush. §14 Archiving
Decision rule: If it causes a broken page, a 404 error for a real user, a security hole, or prevents a transaction from completing — it’s a Must Do. If the site works fine without it but it’s good practice — it’s Clean Up After.

3. Pre-Migration Audit & Benchmarks

Before touching production, capture baseline metrics. These benchmarks let you measure migration success and diagnose problems post-launch.

SEO Benchmarks to Record

Old Site Inventory — Patriot Chassis

Content TypeCountURL PatternNotes
Pages28/about/, /contact/, etc.Trailing slashes (WordPress default)
Products~84/product/{slug}/WooCommerce pattern with trailing slash
Categories14/product-category/{slug}/Including 3 sub-categories
Tags67/product-tag/{slug}/Excessive — many are thin pages
Blog posts1/hello-world/Default WP post, never replaced
Archives1/2020/09/Monthly archive

Old Site Inventory — The High Road

Content TypeCountURL PatternNotes
Pages28/about/, /contact-the-high-road/, etc.Mix of real & junk pages
Products107/product/{slug}/Many return 500 errors; mix of public & client invoices
Categories9/product-category/{slug}/Organized by client name, not product type
Blog posts1/hello-world/Default WP post
THR advantage: With only 3 pages indexed in Google and widespread 500 errors on the old site, the new THR site will almost certainly perform better from day one. Focus redirect effort on Patriot Chassis where real SEO equity exists.

Known External Backlinks — Patriot Chassis

SourceURL LinkedPriority
Pirate 4x4 Forumpatriotchassis.com (homepage)High
Pirate 4x4 Forumpatriotchassis.com (Blazer chassis thread)High
Fuel Curvepatriotchassis.com (K5 Blazer feature article)High
Classic Broncos Forumpatriotchassis.com (forum mention)Medium
Facebookfacebook.com/PatriotChassis/High
Instagraminstagram.com/patriotchassis/High

4. DNS & SSL Cutover Strategy

Since both old and new sites live on the same production server (prod-hetzner), this migration does not require a DNS change. The A records, MX records, and all other DNS records remain unchanged. This eliminates the riskiest part of most migrations.

Simplified migration: No DNS propagation delay. No email disruption risk from MX record changes. The cutover is a docroot file swap managed by dpanel’s deployment system, not a DNS change.

What Changes

ComponentOld StateNew StateAction Required
DNS A/AAAA recordsPoints to prod-hetznerNo changeNone
MX recordsmail.domain.comNo changeNone
SPF/DKIM/DMARCConfiguredNo changeNone
SSL certificateLet’s Encrypt (auto-renew)Same cert, same auto-renewNone
Nginx vhostPoints to WP docrootPoints to new site docrootdpanel deployment or manual update
PHP version8.x (WP + WooCommerce)8.3 (custom PHP API)Verify PHP-FPM pool
DatabaseWordPress tables (wp_*)Custom tables (pc_*, thr_*, ths_*)Import/migrate data
Docroot filesWordPress core + theme + pluginsCustom HTML/CSS/JS + PHPDeploy new files, archive old

SSL Verification

Since SSL certs are already provisioned and auto-renewing via dpanel for both domains, no SSL work is needed. However, verify post-deploy:

Nginx Configuration Updates

The dpanel nginx vhost will need adjustments for the new site architecture:

# Key nginx directives for new sites: # 1. PHP handling for product pages and API location ~ \.php$ { fastcgi_pass unix:/var/run/php/php8.3-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } # 2. Custom 404 page error_page 404 /404.html; # 3. Feed files with correct content types location /feeds/google-merchant.xml { default_type application/xml; } # 4. Block direct access to admin API in production # (optional: restrict by IP or require auth header)

Domain Confirmation

Confirmed: The production domain is thehighroadmanufacturing.com. This is the only active domain — research verified it has DNS records, an active WordPress site, and is the domain used in all business listings. The new site HTML correctly references this domain in canonical tags and structured data.

5. 301 Redirect Map — Patriot Chassis

Every URL that exists on the old WordPress site must either redirect to its equivalent on the new site or return a proper 410 Gone response. Never redirect to the homepage as a catch-all — this destroys page-level SEO equity.

Implementation: All redirects go in the .htaccess file in the new site’s docroot. Use RewriteRule with [R=301,L] flags. Redirects must be server-side (not JavaScript or meta refresh). Keep redirects active for a minimum of 1 year.

Page Redirects

Old URLNew URLNotes
//No redirect needed (same URL)
/products//shop.htmlMain catalog page
/about//about.htmlDirect equivalent
/contact//contact.htmlDirect equivalent
/pages/contact-us/contact.htmlAlternate contact URL found in Google index
/custom-full-chassis//chassis.htmlFull chassis landing page
/modular-chassis-system//chassis.htmlSame destination, modular = chassis
/patriot-air-shock//air-shock.htmlAir shock feature page
/patriot-air-ride//air-ride-request.htmlAir ride quote request form
/patriot-suspension-components//shop.htmlNo direct equivalent; goes to shop
/chassis-components//shop.htmlCategory browsed via shop filters
/body-components//shop.htmlCategory browsed via shop filters
/badass-diy-products//shop.htmlCategory browsed via shop filters
/apparel-and-swag//shop.htmlCategory browsed via shop filters
/turnkey-full-builds//turnkey-builds.htmlDirect equivalent
/turn-key-build-request//full-build.htmlBuild request form
/chassis-request//chassis-request.htmlDirect equivalent
/badassery//faq.htmlInfo content → FAQ page
/patriot-chassis-pictures//gallery.htmlPhoto gallery
/patriot-chassis-videos//videos.htmlVideo library
/patriot-who//about.htmlAbout/contact alternate
/collegues//partners.htmlPartners page (fixes misspelling)
/policies//policies.htmlDirect equivalent
/cart//cart.htmlShopping cart
/my-account//account.htmlAccount page
/checkout//cart.htmlStripe handles checkout; redirect to cart
/members//login.htmlMembers area → login
/member-product//shop.htmlMember products → shop
/faq.htmlAlready exists on new site (no redirect needed)

Product Redirects (Pattern Rule)

All ~84 WooCommerce product URLs follow /product/{slug}/. The new site uses /product.php?p={slug}. A single pattern rule handles all products:

# Redirect all old WooCommerce product URLs to new product pages RewriteRule ^product/([a-z0-9-]+)/?$ /product.php?p=$1 [R=301,L,QSA]
Trailing slash handling: WordPress URLs include trailing slashes (/product/patriot-air-shock-patent-pending/). The regex /?$ handles both with and without trailing slash. Test both variants.

Category Redirects (Pattern Rule)

WooCommerce category pages don’t have direct equivalents on the new site. Redirect them all to the shop page:

# Redirect all old product category pages to shop RewriteRule ^product-category/(.*)$ /shop.html [R=301,L]

Tag Redirects (Pattern Rule)

67 product tags are thin taxonomy pages with minimal SEO value. Redirect all to shop:

# Redirect all old product tag pages to shop RewriteRule ^product-tag/(.*)$ /shop.html [R=301,L]

WordPress Infrastructure Cleanup

# Block old WordPress paths that should not exist on new site RewriteRule ^wp-admin(.*)$ / [R=301,L] RewriteRule ^wp-login\.php$ /login.html [R=301,L] RewriteRule ^wp-content/(.*)$ / [R=410,L] RewriteRule ^wp-includes/(.*)$ / [R=410,L] # Old WordPress sitemap URLs → new sitemap RewriteRule ^wp-sitemap(.*)\.xml$ /sitemap.xml [R=301,L] RewriteRule ^sitemap_index\.xml$ /sitemap.xml [R=301,L] # Old WordPress feed URLs RewriteRule ^feed/?$ / [R=301,L] # Old blog/archive pages (dead content) RewriteRule ^hello-world/?$ / [R=301,L] RewriteRule ^2020/(.*)$ / [R=301,L] # Test/junk pages that were indexed RewriteRule ^test/?$ / [R=410,L] RewriteRule ^lcp/?$ / [R=410,L] RewriteRule ^sample-page/?$ / [R=410,L] # HTML sitemap page RewriteRule ^sitemap\.html$ /sitemap.xml [R=301,L]

Trailing Slash Normalization

The old WordPress site uses trailing slashes on all URLs. The new site uses .html extensions. Add a general rule to strip trailing slashes from page-level URLs:

# Strip trailing slashes and redirect to .html equivalent # Only for pages that have a .html file RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{DOCUMENT_ROOT}/$1.html -f RewriteRule ^([a-z0-9-]+)/?$ /$1.html [R=301,L]

6. 301 Redirect Map — The High Road Manufacturing

The old THR site has almost no SEO equity (3 indexed pages, broken WooCommerce). Redirects are still important for the few backlinks that exist and for any bookmarked URLs, but this is low-risk compared to Patriot Chassis.

Page Redirects

Old URLNew URLNotes
//No redirect needed
/about//about.htmlDirect equivalent
/products//shop.htmlProduct catalog
/manufacturing//capabilities.htmlManufacturing → capabilities
/engineering//capabilities.htmlEngineering → capabilities
/welding//welding.htmlDirect equivalent
/cable-railing//capabilities.htmlProduct type → capabilities
/handrail//capabilities.htmlProduct type → capabilities
/contact-the-high-road//contact.htmlContact page
/high-road-team//about.htmlTeam page → about
/picture-gallery//gallery.htmlPhoto gallery
/affiliates//brands.htmlAffiliates → brands
/information//faq.htmlInfo page → FAQ
/shop//shop.htmlWooCommerce shop page
/cart//cart.htmlShopping cart
/my-account//account.htmlAccount management
/account//account.htmlDuplicate account page
/checkout//cart.htmlCheckout → cart (Stripe handles rest)
/login//login.htmlClient login
/login-2//login.htmlDuplicate login page
/register//register.htmlClient registration
/registration//register.htmlAlternate registration URL
/members//login.htmlMembers area → login
/user//account.htmlUser profile → account
/client-products//login.htmlClient products → login (requires auth)
/policies//policies.htmlCompany policies
/equipment//equipment.htmlDirect equivalent

Product Redirects (Pattern Rule)

# Redirect all old WooCommerce product URLs to new product pages RewriteRule ^product/([a-z0-9-]+)/?$ /product.php?slug=$1 [R=301,L,QSA]

Category, Tag, and WordPress Cleanup

# Categories to shop RewriteRule ^product-category/(.*)$ /shop.html [R=301,L] # WordPress infrastructure RewriteRule ^wp-admin(.*)$ / [R=301,L] RewriteRule ^wp-login\.php$ /login.html [R=301,L] RewriteRule ^wp-content/(.*)$ / [R=410,L] RewriteRule ^wp-includes/(.*)$ / [R=410,L] RewriteRule ^wp-sitemap(.*)\.xml$ /sitemap.xml [R=301,L] # Junk pages RewriteRule ^hello-world/?$ / [R=301,L] RewriteRule ^sample-page/?$ / [R=410,L] RewriteRule ^single-product/?$ /shop.html [R=301,L] RewriteRule ^password-reset/?$ /login.html [R=301,L] RewriteRule ^logout/?$ / [R=301,L] RewriteRule ^category/(.*)$ / [R=301,L] # Trailing slash normalization (same as PC) RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{DOCUMENT_ROOT}/$1.html -f RewriteRule ^([a-z0-9-]+)/?$ /$1.html [R=301,L]

THR-Specific: Client Invoice Products

Private products in old site: The old THR WooCommerce site contains client-specific invoice products (e.g., /product/acme-invoice-166/, /product/37-crystal-ct-garage-level-pan-decking-install/) that should never have been publicly visible. The product pattern redirect will catch these and send them to the new product.php, which will show “Product Not Found” for non-existent slugs. This is acceptable — do not create specific redirects for client invoices.

7. Email Continuity

Email is the highest-risk component of any web migration. Lost email means lost business. For DominionPort sites, the risk is minimal because email and web hosting share the same server (prod-hetzner) and DNS records are not changing.

Low risk: Email infrastructure (Exim, Dovecot, SOGo) runs independently of the website docroot. Swapping website files does not affect email at all. MX records, SPF, DKIM, and DMARC records all remain unchanged.

Pre-Launch Email Verification

New Site Email Configuration

The new sites send transactional email (contact form confirmations, order notifications). On production, these must use sendmail, not DevHub’s MailHog:

# .env on production (shared/ directory) MAIL_METHOD=sendmail # Exim auto-DKIM-signs outbound email for hosted domains # No SMTP credentials needed when using sendmail

8. SEO Preservation

Critical On-Page Elements

The new sites must have these elements on every page. The Patriot Chassis site already has them (20/20 audit score). Verify they survive deployment:

XML Sitemap

robots.txt

# New robots.txt for both sites User-agent: * Allow: / # Block admin and API paths from crawling Disallow: /admin/ Disallow: /api/admin/ Disallow: /tools/ # Sitemap location Sitemap: https://patriotchassis.com/sitemap.xml
Do NOT copy the old robots.txt. The old THR site has Disallow: /*? which blocks all URLs with query parameters — this would block product pages (/product.php?p=slug) from being crawled. The old PC site has Crawl-delay: 3 which unnecessarily slows Google’s crawl. Start fresh.

Google Search Console Actions

  1. Verify ownership of both patriotchassis.com and thehighroadmanufacturing.com in Search Console (use DNS TXT record verification — already have DNS access via dpanel)
  2. Since this is a same-domain migration (not a domain change), the “Change of Address” tool is not needed
  3. Submit the new sitemap.xml on launch day
  4. Use the URL Inspection tool to test 5–10 key pages and request indexing
  5. Monitor the Index Coverage report daily for the first week

Expected SEO Recovery Timeline

SiteExpected ImpactRecovery Time
Patriot Chassis Temporary ranking dip while Google processes redirects and reindexes 2–4 weeks if redirects are correct
The High Road Mfg Likely immediate improvement — old site was broken Immediate to 1 week

9. Pre-Launch Verification Checklist

Complete every item before deploying to production. This is the final gate.

Technical

Content

Performance

Security

Database

Feeds & Distribution

Backup

10. Launch Day Procedure

This is the operational runbook for go-live. Execute steps in order. One site at a time — launch Patriot Chassis first (higher priority), monitor for 24 hours, then launch The High Road.

Recommended Launch Window

Early morning (5–7 AM Pacific / 8–10 AM Eastern) on a Tuesday, Wednesday, or Thursday. Avoids weekends (harder to get support), Mondays (catch-up traffic), and Fridays (no one wants to debug on Saturday).

T-60 Minutes: Final Prep

  1. Archive the old site: tar -czf patriotchassis-old-$(date +%Y%m%d).tar.gz /home/patriotchassis/public_html/
  2. Dump old database: mysqldump patriotchassis_wp > patriotchassis-wp-$(date +%Y%m%d).sql
  3. Verify new site builds successfully on DevHub: devhub-deploy build
  4. Send test email from production mail server to verify email works pre-deploy

T-0: Deploy

  1. Deploy new site files: devhub-deploy push
  2. Verify health check passes
  3. Run production database migration (if needed)
  4. Push product data from Hub to production site DB
  5. Regenerate products-data.js on production
  6. Verify .htaccess redirect rules are in place

T+5 Minutes: Smoke Test

TestExpected ResultCommand / URL
Homepage loadsHTTP 200, new designcurl -I https://patriotchassis.com/
Product page worksHTTP 200, product data renderscurl -I https://patriotchassis.com/product.php?p=patriot-air-shock-patent-pending
Old product URL redirectsHTTP 301 → new URLcurl -I https://patriotchassis.com/product/patriot-air-shock-patent-pending/
Shop page loadsHTTP 200, products gridcurl -I https://patriotchassis.com/shop.html
Old /products/ redirectsHTTP 301 → /shop.htmlcurl -I https://patriotchassis.com/products/
Contact form submitsEmail received, success responseManual browser test
Cart add/remove worksCart updates, Stripe checkout loadsManual browser test
404 page worksHTTP 404, custom 404 pagecurl -I https://patriotchassis.com/nonexistent-page
SSL validValid cert, no mixed contentcurl -vI https://patriotchassis.com/ 2>&1 | grep subject
Email worksCan send and receiveSend test to badass@patriotchassis.com

T+15 Minutes: SEO Activation

  1. Submit new sitemap.xml to Google Search Console
  2. Submit new sitemap.xml to Bing Webmaster Tools
  3. Use URL Inspection tool on 5 key pages, request indexing
  4. Verify robots.txt is accessible and correct: curl https://patriotchassis.com/robots.txt

T+30 Minutes: Feed Verification

  1. Verify Google Merchant feed loads: curl https://patriotchassis.com/feeds/google-merchant.xml | head -20
  2. Verify Facebook catalog feed loads: curl https://patriotchassis.com/feeds/facebook-catalog.csv | head -5
  3. If using Google Merchant Center: update feed URL if it changed

11. Post-Launch Monitoring

Hour 0–4: Active Watch

Hour 4–24: Sustained Monitoring

Day 2–3: Stabilization

Day 4–7: Assessment

Day 8–30: Recovery Tracking

Day 90: Final Assessment

At 90 days post-migration, rankings should be fully recovered or improved. If traffic is still down, investigate: broken redirects, missing pages, canonical issues, or thin content.

12. Rollback Plan

If something goes catastrophically wrong, we can revert to the old WordPress site. Because this is a docroot swap on the same server, rollback is fast.

Rollback Triggers

Rollback Procedure

  1. Restore old files: Extract the archived tarball back to the docroot
  2. Restore old database: Import the SQL dump taken pre-migration
  3. Restore old nginx config: If vhost was modified, revert from saved copy
  4. Clear caches: Restart PHP-FPM, clear any opcode caches
  5. Verify: Confirm old WordPress site is serving correctly
  6. Communicate: Notify stakeholders of rollback and new timeline
Rollback speed: Since the old files are pre-archived and the database dump is ready, rollback should take under 10 minutes. The versioned release system (devhub-deploy rollback) can also swap back to the previous release atomically.

Do NOT Rollback For

13. External Profile & Directory Updates

Update all external references to point to the new URL structure. Since the domain stays the same, most profile URLs don’t need changing — but any deep links to specific pages may break without updates.

Patriot Chassis

PlatformCurrent LinkAction
Facebookfacebook.com/PatriotChassis/Update website link if it points to an inner page
Instagraminstagram.com/patriotchassis/Update bio link to homepage or shop
Google Business Profilepatriotchassis.comVerify website URL is https://patriotchassis.com/
Pirate 4x4 ForumThread links to homepageNo action needed (homepage URL unchanged)
Email signaturesVarious linksUpdate any deep links in team email signatures
Printed materialsBusiness cards, brochuresReprint if they reference old URL patterns
Google Merchant CenterFeed URLUpdate feed URL if path changed
Facebook Commerce ManagerCatalog feed URLUpdate catalog feed URL

The High Road Manufacturing

PlatformCurrent LinkAction
Alignablealignable.com/ponderay-id/the-high-road-manufacturingUpdate website URL
Google Business ProfileVerify exists, update URLCreate if not exists
Email signaturesVariousUpdate all team email signatures
Timing: Update external profiles on launch day or within 24 hours. Do not update before launch (broken links) or wait more than a week (stale references).

14. Analytics & Tracking Migration

Google Analytics 4 (GA4)

Since the domain is not changing, the existing GA4 property can continue to be used. However:

Conversion Tracking

Search Console

Ad Platform Tracking

If running ads (Google Ads, Facebook Ads), verify:

15. Old Site Archiving

What to Archive

ItemCommand / MethodStorage Location
Website files tar -czf pc-old-YYYYMMDD.tar.gz /home/patriotchassis/public_html/ Backblaze B2 + Helsinki
WordPress database mysqldump patriotchassis_wp > pc-wp-YYYYMMDD.sql Backblaze B2 + Helsinki
Nginx vhost config Copy from /etc/nginx/sites-available/ Same archive
PHP-FPM pool config Copy from /etc/php/8.3/fpm/pool.d/ Same archive
Cron jobs crontab -l -u patriotchassis Same archive
Visual screenshots Full-page screenshots of every page Same archive

Wayback Machine

Before migration, manually submit key pages to the Wayback Machine for permanent public archival:

Retention

Keep the archive indefinitely. Storage is cheap. The old site content may be needed for legal, compliance, or content reference purposes. Do not delete the old WordPress database tables until at least 90 days post-migration and only after confirming all data has been successfully migrated.

16. Golden Rules

Never redirect to the homepage as a catch-all. Every old URL must redirect to its closest equivalent on the new site. Homepage redirects destroy page-level SEO equity and create a poor user experience.
Test every redirect before launch. Use curl -I on every redirect rule. A single syntax error in .htaccess can break the entire site. Test both with and without trailing slashes.
Keep redirects active for at least one year. Google recommends maintaining 301 redirects for a minimum of 1 year. Removing them too early causes 404 errors for anyone with bookmarks, backlinks, or cached search results.
Archive before you overwrite. Always create a complete backup (files + database + config) of the old site before deploying the new one. This is your safety net. No archive, no deploy.
Launch one site at a time. Deploy Patriot Chassis first (higher risk, more SEO equity). Monitor for 24 hours. Then deploy The High Road. Never launch both simultaneously — if something breaks, you need to know which site caused it.
Submit sitemaps immediately. The moment the new site is live, submit the new XML sitemap to Google Search Console and Bing Webmaster Tools. Do not wait. Every hour of delay is an hour Google might index old URLs without redirects.
Monitor access logs for 404s daily. The redirect map will never be 100% complete on day one. Real traffic will reveal missed URLs. Parse access logs daily for the first week and add redirects as needed.
Do not touch DNS unless you must. This migration is a docroot swap, not a server move. DNS records stay unchanged. Email stays unchanged. If you don’t need to change it, don’t. Every unnecessary change is unnecessary risk.
No DevHub URLs in production. Search every file for “devhub” before deploy. Database connections, API base URLs, CORS origins, canonical tags, Open Graph URLs, feed links — all must reference the production domain. One DevHub URL in a canonical tag can confuse Google for weeks.
Update external profiles on launch day. Google Business Profile, Facebook, Instagram, email signatures, ad campaigns, and merchant feeds. Don’t update before launch (creates broken links) and don’t delay more than 48 hours (stale references erode trust).