4.7 KiB
4.7 KiB
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-
wwwor baremsosorg.com. Everything is currently hard-coded tohttps://msosorg.com(bare, https). If you wantwww, tell me and I'll re-run the injector with the new base.
1. DNS + hosting
- Point
msosorg.comDNS 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
- Root redirect (
/→/en/) is host-agnostic, so it needs no domain edit. - Canonical-host 301 added. A single rule 301s every non-canonical host
— the temp domain
msos.spletnimojster.si, anywww., and the origin host — tohttps://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] - 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/→301tohttps://msosorg.com/en/, and thathttps://msosorg.com/en/is200.
3. Verify the technical layer resolves on the real domain
https://msosorg.com/robots.txtloads and lists the sitemap.https://msosorg.com/sitemap.xmlloads (201 URLs, allmsosorg.com).- Spot-check a page's
<link rel="canonical">andhreflangpoint tohttps://msosorg.com/...(they do — just confirm live). - Hit a bad URL (e.g.
/en/blog/xxx) → branded 404 with 404 status (works once the ApacheErrorDocumentis 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.pyso 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
.htaccessErrorDocument(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, theDOMAINconstant intools/seo_inject.pymust be updated and the injector re-run — one-line change, ask me.