msos/docs/launch-seo-checklist.md

4.4 KiB
Raw 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)

  • Update the root redirect in .htaccess (lines 25): change msos.spletnimojster.simsosorg.com so //en/ on the real host.
  • Add a 301 from the temp domain to the final domain so any links / early indexing on msos.spletnimojster.si pass equity to msosorg.com: apache RewriteCond %{HTTP_HOST} ^(www\.)?msos\.spletnimojster\.si$ [NC] RewriteRule ^(.*)$ https://msosorg.com/$1 [R=301,L]
  • Pick ONE host form (www vs non-www) and 301 the other to it.
  • (Ask me to make these edits — they're quick.)

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.