100 lines
4.4 KiB
Markdown
100 lines
4.4 KiB
Markdown
# 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.
|