# 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 2–5): change
      `msos.spletnimojster.si` → `msosorg.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 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.
