LAUNCH PROGRESS 28% · 9/32 STEPS · POST-LAUNCH 0/7

iexcel.co — Launch Runbook

Go-live night: July 20–21, 2026 · Next.js 16 on Cloudflare Pages · DNS migrates GoDaddy → Cloudflare

LAST UPDATED
Jul 20, 11:50 PM CTpage auto-refreshes every 2 min
✓ Pre-Flight8/8 complete
Phase 20/5 complete
Phase 30/10 complete
Post-Launch0/7 complete

Decisions — Locked FINAL

The sitehttps://iexcel.co — apex is canonical. All metadata, schema, and sitemap already ship apex URLs.
www behaviorwww.iexcel.co/* 301s to https://iexcel.co/$1 via one Cloudflare redirect rule.
HostingCloudflare Pages project iexcel-website, auto-deployed from GitHub main on every push.
DNS homeiexcel.co zone moves into the same Cloudflare account that owns the Pages project (required to attach an apex custom domain).

Activity Log LIVE

Newest first. Every state change lands here with a timestamp (US Central — Chicago).

Time (CT)Event
Jul 20, 11:50 PM CT🔑 Token request sent to Chris in #team-iexcel (broadcast + @mention) — exact upgrade steps included; DM token to Micah when ready
Jul 20, 11:48 PM CT✅ DONE — Trailing-slash redirect fix (launch blocker) (PR #121 merged; verified on production pages.dev (10/10 paths))
Jul 20, 11:44 PM CT⛔ Zone creation blocked: iExcel CF token lacks zone.create permission — token upgrade needed from Micah (tracked as phase1.token-upgrade)
Jul 20, 11:44 PM CT🚨 Launch blocker caught pre-flip: trailing-slash WordPress URLs 404'd on Pages — fix shipped as PR #121, verifying on branch preview
Jul 20, 11:39 PM CTSlack live: kickoff posted in #team-iexcel — all step updates now mirror to the launch thread
Jul 20, 11:18 PM CTRunbook upgraded: animated launch progress bar pinned to top
Jul 20, 11:16 PM CTPre-flight complete: builds green, CI deploy 864b3934 live on iexcel-website.pages.dev, DNS exported. Next: Phase 1 (Cloudflare zone prep).
Jul 20, 11:16 PM CT⚠ flagged — Lint: 1 known error (accepted)
Jul 20, 11:16 PM CT✅ DONE — DNS inventory exported
Jul 20, 11:16 PM CT✅ DONE — GTM + consent verified
Jul 20, 11:16 PM CT✅ DONE — Redirect map shipped
Jul 20, 11:16 PM CT✅ DONE — CI/CD healthy
Jul 20, 11:16 PM CT✅ DONE — Static export build green
Jul 20, 11:16 PM CT✅ DONE — Server build green
Jul 20, 11:16 PM CT✅ DONE — Repo synced
Jul 20, 11:16 PM CTRunbook went live — self-updating from launch ops, timestamps in US Central

0.Pre-Flight COMPLETE — July 20

Verified before anything touches production.

1.Phase 1 — Cloudflare Zone Prep ZERO LIVE IMPACT

Est. 20–30 min. GoDaddy keeps answering all DNS queries until Phase 2 — nothing here is visible to visitors. Everything is staged, then diffed, then we flip.

Email is the #1 launch risk. iexcel.co runs live email on Google Workspace, plus HubSpot and Mailgun sending. All of these records must exist in Cloudflare before the flip: Google MX ×5 · SPF TXT · google._domainkey DKIM · _dmarc (p=quarantine — strict alignment, so a missing DKIM record means quarantined mail) · HubSpot DKIM ×2 · Mailgun mg.* MX/TXT/CNAME. Staging them in advance = zero mail gap at any point.

2.Phase 2 — The Nameserver Flip GO / NO-GO GATE

Est. 5 min to execute; minutes-to-~1 hour to propagate. This is the go-live moment. Requires explicit go from Micah after the Phase 1 diff sign-off.

Propagation reality check

The .co registry publishes NS changes within minutes. Resolvers that cached the old NS records can hold them up to the NS TTL (1 hour). During that window some visitors still get GoDaddy DNS — which is fine, because the GoDaddy zone still answers with the old site. There is no broken state: old-DNS visitors see the old site, new-DNS visitors see the new site, and email records are identical on both sides.

Rollback = one API call. GoDaddy keeps the zone file intact after the flip. For most failure modes there's an even faster path: edit the Cloudflare apex record back to 89.116.190.222 (old WordPress) — takes effect in seconds, no nameserver change needed. If anything goes sideways, we point the nameservers back to ns09/ns10.domaincontrol.com and we're back on the old site within the same propagation window. Nothing is deleted at GoDaddy until the migration is confirmed stable (keep ≥ 1 week).

3.Phase 3 — Verification LAUNCH NIGHT

Run top-to-bottom as soon as the zone is Active. Anyone on the team can run these — commands are copy-paste (see command blocks below the list).

Copy-paste verification commands

# --- DNS & SSL ---
dig +short NS iexcel.co @1.1.1.1              # expect *.ns.cloudflare.com
curl -sI https://iexcel.co | head -3
curl -sI https://www.iexcel.co | head -3       # expect 301 → https://iexcel.co/

# --- Email records (must match Appendix A exactly) ---
dig +short MX iexcel.co @1.1.1.1               # 5 Google MX hosts
dig +short TXT iexcel.co @1.1.1.1              # SPF + site verifications
dig +short TXT _dmarc.iexcel.co @1.1.1.1       # v=DMARC1; p=quarantine…
dig +short TXT google._domainkey.iexcel.co @1.1.1.1   # DKIM key

# --- Redirects ---
curl -sI https://iexcel.co/about-us | grep -i location                # → /the-iexcel-team
curl -sI https://iexcel.co/shop | grep -i location                    # → /services
curl -sI https://iexcel.co/legal-tech-marketing | grep -i location    # → /what-weve-done/legal-tech-marketing
curl -sI https://iexcel.co/product/organic-search-strategy-2 | grep -i location  # → /services/organic-search-strategy

# --- Subdomains ---
dig +short agents.iexcel.co @1.1.1.1           # 34.160.198.210
dig +short old.iexcel.co @1.1.1.1              # 107.180.34.184 (old WP reachable)

4.Post-Launch THIS WEEK

The week after go-live.

A.Appendix — DNS Record Disposition (GoDaddy export, July 20, 2026)

45 records total. KEEP = copy exactly. CHANGE = new value for the new site. SKIP = intentionally not migrated.

RecordTypeValueAction
@A89.116.190.222 (old WP)CHANGE → CNAME iexcel-website.pages.dev (flattened), proxied
wwwCNAME@CHANGE → CNAME iexcel-website.pages.dev, proxied
@ MX ×5MXaspmx.l.google.com (1), alt1/alt2 (5), alt3/alt4 (10)KEEP — exact copy, priorities included
@TXTv=spf1 a mx include:_spf.google.com include:spf.hubspotemail.net include:secureserver.net ~allKEEP
google._domainkeyTXTGoogle DKIM public key (rsa, 2048)KEEP
_dmarcTXTv=DMARC1; p=quarantine; rua/ruf=brendan@iexcel.co; adkim=s; aspf=sKEEP
hs1-23159503._domainkey / hs2-…CNAMEHubSpot DKIM (hs06a/hs06b)KEEP — DNS-only
mg MX ×2 · pic._domainkey.mg TXT · email.mg CNAMEmixedMailgun sending domainKEEP — DNS-only
@ TXT ×2TXTgoogle-site-verification (GSC ×2)KEEP — preserves Search Console verification
@ TXTTXTasv=4c44…KEEP
agents · internaltools · scrumA34.160.198.210 (Google Cloud LB — tools hub)KEEP — DNS-only
cleanpowerA8.232.142.62KEEP — DNS-only
admin · mail · oldA107.180.34.184 (legacy GoDaddy host)KEEP — DNS-only
stagingA89.116.190.222 (old WP)KEEP — DNS-only; revisit post-launch
internalCNAMEinternal.iexcel.coKEEP
autoconfig · autodiscover · webmail · cpanel · whm · webdisk (+ .admin variants) · SRV ×2CNAME/SRVcPanel mail plumbing → @KEEP for now — harmless; prune after 1 week stable
_3042…​.oldCNAMEComodo cert validation (old host)SKIP — stale
_domainconnectCNAMEGoDaddy Domain ConnectSKIP — GoDaddy-specific
@ NS ×2NSns09/ns10.domaincontrol.comSKIP — replaced by Cloudflare NS