Files
odoo-expertos.com/seo-audit-2026-05-27/ACTION-PLAN.md
T
2026-08-28 10:11:11 -03:00

69 lines
5.3 KiB
Markdown
Raw 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.
# Action Plan — odoo-expertos.com SEO Fixes
**Date:** 2026-05-27 · **Overall health: ~44/100** · Source: `FULL-AUDIT-REPORT.md`
Ordered by impact ÷ effort. Most high-impact fixes are **template/generator changes** that fan out across ~1,000+ pages — fix the generator, not individual pages.
---
## 🔴 CRITICAL — fix immediately (blocks indexing / risks site-wide downgrade)
| # | Action | Where | Effort |
|---|--------|-------|--------|
| C1 | **Remove the 3 dead `<loc>` entries** for `/en/odoo-hosting/`, `/fr/odoo-hosting/`, `/pt/odoo-hosting/` from `sitemap-en/fr/pt.xml`. Then **build the missing index pages** (mirror DE/AR). | sitemaps + page generator | Low (purge) / Med (build) |
| C2 | **Resolve the EN/DE untranslated-content problem** (400+ pages with `lang="en/de"` serving Spanish/garbled text). Decide: translate, or remove+hreflang-to-ES, or 301 to Spanish canonical. Stop generating Spanish-slug EN/DE pages. | content pipeline | High (decision + execution) |
| C3 | **Fix inner-page hreflang**: EN template add `pt`+`ar`; DE template build `es`/`x-default` from the **root** ES URL (no `/de/` prefix). Add full 7-entry hreflang to all **category index** pages (currently zero). | head template | Med |
| C4 | **Fix Organization logo + schema host site-wide**: replace dead `www.odooexpertos.com/...logo.png` with one real URL on `www.odoo-expertos.com`; switch all schema `url`/`item` from non-www → www. | schema template | Low |
| C5 | **Rebuild the homepage as an authoritative entity page**: factual keyword-led H1, drop combat/fear hype + emoji H2s, source or remove "280% ROI", add Organization JSON-LD (shared `@id`, populated `sameAs`), last-updated date. | homepage | Med |
| C6 | **Replace `document.write()` header/footer/eeat** with `insertAdjacentHTML` into a pre-sized placeholder + `defer` the component scripts. | content-page generator | Med |
---
## 🟠 HIGH — within ~1 week
| # | Action | Where | Effort |
|---|--------|-------|--------|
| H1 | Rewrite category titles to 5060 chars in the target language (kill the 270300-char stuffed strings). | category template | Low |
| H2 | Add rendered breadcrumb + parent-category link + ≥3 related-article links to article template (fix orphan pages). | article template | Med |
| H3 | Add `Article.image` + `mainEntityOfPage` + valid `dateModified`; remove duplicate Microdata `itemtype`; add `BreadcrumbList` to deep pages. | schema template | Med |
| H4 | Add author bylines + datePublished/dateModified (visible + schema) to content pages; create real author pages or attribute to the org. | content + author pages | Med |
| H5 | Self-host D3 (`/js/d3.v7.min.js`), preload only where used, remove misplaced d3js.org preconnect, defer D3 init until in-viewport. | homepage + D3 pages | Low |
| H6 | Trim homepage inline `<style>` 32 KB → <14 KB (move non-critical to `main.min.css`); externalize + `defer` the big inline JS; throttle mousemove with rAF. | homepage | Med |
| H7 | Apply async-CSS (`preload…onload`+`<noscript>`) + ~2 KB critical CSS to the content-page template. | content-page generator | Low |
| H8 | Fix robots.txt: one group per agent; merge `Disallow: /*?` `/*&` into the FIRST `User-agent: *`; delete the 2nd `*` block, duplicate Bingbot/CCBot, and `/*#`. | robots.txt | Low |
| H9 | Expand `llms.txt` (812 links per section); regenerate `llms-full.txt` as a genuine per-language content dump. | llms files | Low (scripted) |
---
## 🟡 MEDIUM — within ~1 month
| # | Action |
|---|--------|
| M1 | Add security headers in `vercel.json` (`X-Content-Type-Options`, `X-Frame-Options`, `Referrer-Policy`). |
| M2 | Add long-lived `Cache-Control: max-age=31536000, immutable` for hashed `/css`,`/js`,`/components` (with filename/version hashing). |
| M3 | Fix `og:locale` on DE/FR/PT category pages (currently `es_ES`) → `de_DE`/`fr_FR`/`pt_*`. |
| M4 | Expand thin article bodies (~400w) to 200300 words per H2 section. |
| M5 | Populate `sameAs` (LinkedIn, YouTube, directories); remove non-functional `?s=` SearchAction or wire real search. |
| M6 | Add `Service` schema (homepage) + `FAQPage` where question-H2s exist; add `inLanguage` to ES/DE schema blocks. |
| M7 | Create `/contacto/` + `/sobre-nosotros/` pages in primary nav; verify/link Odoo partner badge. |
| M8 | Apply "direct-answer-first" 134167-word passages across content pages (citability). |
| M9 | Wrap continuous CSS animations (kenBurns/shimmer) in IntersectionObserver. |
---
## 🔵 LOW / backlog
- Localized URL slugs for EN/DE (`/en/odoo-ai/`, `/de/odoo-ki/`) with 301s once translated.
- Single-hop `http-apex → https-www` redirect.
- Off-site entity building (YouTube channel → strongest AI-citation signal; r/Odoo participation; Wikipedia if notable).
- Accessible HTML data tables beside D3 charts (AI-crawler + a11y).
---
## Verification checklist (after fixes)
- [ ] `curl -I` the 3 former-404 category pages → 200; sitemaps contain no 404 `<loc>`.
- [ ] hreflang reciprocity passes (EN has pt+ar; DE es/x-default resolve 200) — re-run technical agent.
- [ ] Rich Results Test passes for Organization (logo loads) + Article (image present) + Breadcrumb.
- [ ] Re-run PageSpeed **with an API key**; confirm LCP ≤2.5s / INP ≤200ms / CLS ≤0.1 on mobile.
- [ ] Homepage re-screenshot: factual H1, no combat hype.
- [ ] Re-audit: target health ≥70/100.