# 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

- [x] Root redirect (`/` → `/en/`) is host-agnostic, so it needs no domain edit.
- [x] **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]
      ```
- [x] 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 2–4 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.
