# 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 `` 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.