msos/docs/launch-seo-checklist.md

103 lines
4.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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