msos/docs/launch-seo-checklist.md

4.7 KiB
Raw Permalink Blame History

Launch-day SEO checklist

Everything below is blocked until the site goes live on the final domain msosorg.com (it can't be done on the temp host msos.spletnimojster.si). Work top to bottom on launch day. The on-page/technical SEO is already done — this is the "flip the switch" list.


0. Before you flip the domain

  • Native-speaker proofread of MK + SI content. All Macedonian/Slovene translations (blog post, about-us, timeline, meta descriptions) are AI-drafted and marked for review. Fix before indexing — quality counts.
  • Decide the canonical domain: with-www or bare msosorg.com. Everything is currently hard-coded to https://msosorg.com (bare, https). If you want www, tell me and I'll re-run the injector with the new base.

1. DNS + hosting

  • Point msosorg.com DNS to the host.
  • Confirm a valid HTTPS certificate (Let's Encrypt / host-provided).
  • Confirm the site loads at https://msosorg.com/en/ (and /mk/, /si/).

2. Redirects (.htaccess) done

  • Root redirect (//en/) is host-agnostic, so it needs no domain edit.
  • Canonical-host 301 added. A single rule 301s every non-canonical host — the temp domain msos.spletnimojster.si, any www., and the origin host — to https://msosorg.com, consolidating ranking signals. It runs before the HTTPS-force so the temp domain reaches the canonical in one hop: apache RewriteCond %{HTTP_HOST} !^msosorg\.com$ [NC] RewriteRule ^ https://msosorg.com%{REQUEST_URI} [R=301,L]
  • Host form chosen: bare msosorg.com (matches the hard-coded canonicals); www. is folded into the rule above.
  • After this deploys, verify with curl -I https://msos.spletnimojster.si/en/301 to https://msosorg.com/en/, and that https://msosorg.com/en/ is 200.

3. Verify the technical layer resolves on the real domain

  • https://msosorg.com/robots.txt loads and lists the sitemap.
  • https://msosorg.com/sitemap.xml loads (201 URLs, all msosorg.com).
  • Spot-check a page's <link rel="canonical"> and hreflang point to https://msosorg.com/... (they do — just confirm live).
  • Hit a bad URL (e.g. /en/blog/xxx) → branded 404 with 404 status (works once the Apache ErrorDocument is live).

4. Google Search Console ← most important

  • Add the property (prefer Domain property via DNS TXT — covers all subdomains + http/https).
  • Submit https://msosorg.com/sitemap.xml.
  • Use URL Inspection on the homepage + a couple key pages → Request indexing.
  • Check International Targeting → no hreflang errors.
  • Over the next weeks: watch Coverage/Pages, Core Web Vitals, and the Performance report.

5. Bing Webmaster Tools (optional, ~5 min)

  • Add the site (can import from Search Console) and submit the sitemap.

6. Analytics (measure the SEO) — see docs/ note / ask me to wire it

  • Create the analytics account (GA4 or Plausible — recommendation below).
  • Give me the Measurement ID (GA4) or confirm the domain (Plausible); I add the snippet to tools/seo_inject.py so it lands on all 201 pages at once.
  • Verify real-time hits after deploy.

7. Social / rich-result validation

  • Rich Results Test (search.google.com/test/rich-results) on a blog, news, and project URL → Article + BreadcrumbList detected, no errors.
  • Facebook Sharing Debugger — paste homepage + a blog URL, click Scrape Again → correct title/description/OG image.
  • LinkedIn Post Inspector — same check.
  • Confirm the favicon shows in a browser tab and in Google results.

8. Post-launch monitoring (first 24 weeks)

  • Watch indexing count climb in Search Console.
  • Fix anything in Coverage (excluded/errors).
  • Re-check Core Web Vitals (image optimization + lazy-loading should keep these green).
  • Add fresh content (blog/news) — freshness + internal links help.

Notes / gotchas

  • Custom 404 only works on the Apache/LiteSpeed host via .htaccess ErrorDocument (already added). The Python dev server ignores it.
  • Re-run after any page add/rename/delete: python tools/seo_inject.py --all --sitemap (keeps canonical, hreflang and the sitemap in sync).
  • images/original/ (458 MB source masters) is gitignored — keep a Drive/local backup; it never deploys.
  • If the final domain or www-choice differs from https://msosorg.com, the DOMAIN constant in tools/seo_inject.py must be updated and the injector re-run — one-line change, ask me.