# Opportunities Scan (post-W1..W11) — odoo-expertos _Date: 2026-05-28. Source: seo+blog opportunity sub-agent (Sonnet, WebFetch-grounded)._ _Consumed by goals/W5b.txt, W12.txt, W13.txt — those tell the fix agents to read this file for concrete targets._ --- ## 1. Top 10 AI-Search Opportunity Pages Ranked by: "best/review/vs" query intent + existing structural strength + GSC crawl signal. | # | URL | Current Weakness | Concrete Fix | AI-Cite | |---|---|---|---|---:| | 1 | `/odoo-hosting/odoo4projects-hosting-review-2026/` | 3,222 words, strong schema, but "847 reviews" aggregate is unsourced — fabricated, kills trust | Replace aggregate with linked G2/Capterra URL; add Capterra Odoo-category benchmark; add 40-60w TL;DR at top | 7 | | 2 | `/odoo-hosting/mejor-hosting-odoo-2026/` | 1,347 words (below blog floor 1,500); H2s declarative not question-led; no inline source attribution | Expand to 1,800+ words; convert 3 H2s to questions; one sourced stat per H2 opening sentence | 6 | | 3 | `/odoo-hosting/mejores-proveedores-hosting-odoo-2026/` | 2,775 words but "three-month evaluation by our team" has no methodology URL; pricing claims unsourced; no TL;DR | Add methodology disclosure box; link 3+ price data points to public provider pricing pages; add TL;DR capsule | 6 | | 4 | `/odoo-hosting/comparativa-precios-odoo-2026/` | 2,527 words, table present, "70% Ahorro Potencial" is an unsourced superlative (QRG flag); no visible datePublished in body | Replace 70% with a sourced TCO example (link Odoo.sh public pricing vs VPS); add visible byline + date | 6 | | 5 | `/odoo-hosting/cloudpepper-vs-odoo-sh-2026/` | 2,556 words, "2,864 Reseñas Verificadas" has no source — fabricated social proof; radar chart is D3/JS so invisible to crawlers | Delete the fabricated review count; link a G2/Capterra page; add HTML `` fallback for the radar data | 6 | | 6 | `/odoo-hosting/opiniones-hosting-odoo-2026/` | 2,295 words; claims "2,800 opiniones" from G2/Capterra/Trustpilot with no links; Review schema present but no `reviewUrl`; no table | Add 3 direct links to source platforms; populate `reviewUrl` on each Review item; add provider-rating comparison table | 5 | | 7 | `/odoo-hosting/odoo-vs-sap-hosting-2026/` | 2,354 words; "85% Ahorro en TCO" is the first visible stat and is unsourced; "Guía de Migración" H2 has 1-2 sentences per step | Source the TCO claim (Panorama Consulting / Gartner / SAP public pricing); expand migration H2 to 250+ words with numbered steps | 5 | | 8 | `/odoo-hosting/alternativas-odoo-sh-2026/` | 2,016 words; zero sourced stats; "0EUR Coste Migración" unattributed; ItemList schema has no `url` per item | Add a source link per alternative (provider pricing page); populate ItemList `url`; add a direct-answer opening paragraph | 4 | | 9 | `/odoo-hosting/odoo-community-vs-enterprise-hosting-2026/` | 2,220 words; partially sourced (G2/Trustpilot); BUT "Dr. María Elena Rodríguez" author is fabricated — destroys AI citability | Replace fabricated byline per W7 pattern (use "Equipo Odoo Expertos"); add `inLanguage: es` to Article schema; remove "Dr." prefix | 5 | | 10 | `/odoo-ia/alternativas-odoo-ia-comparativas-2025/` | 1,949 words; "340% mejora" unattributed; first-person fabricated loss narrative ("perdí $180,000") — QRG low-trust signal; no table; no FAQ | Remove the fabricated loss narrative; cite a real third-party migration case; add comparison `
` with ``; add FAQPage schema | 3 | **Excluded but noted:** `/odoo-hosting/odoo-vs-zoho-books-hosting-2025/` — only 1,643 words + fabricated "$50,000 loss" + 120+ char title. Belongs in §2 (rewrite-from-scratch) rather than deepen-in-place. --- ## 2. Top 20 Thin-Content Rewrite Priorities ES-root pages from `gsc/crawled-not-indexed.txt`. Fixing the ES canonical fixes the PT/FR duplicate signal simultaneously. | # | URL | Current Weakness | Proposed Angle | Words | AI Query | |---|---|---|---|---:|---| | 1 | `/odoo/odoo-hosting-cloud-infraestructura-2025/` | ~610 total words; H2s are 1-2 sentences (confirmed in audit) | Definitive infra guide: RAM/CPU/disk minimums per Odoo version, provider table, cost breakdown | 1800 | "infraestructura odoo cloud 2025" | | 2 | `/odoo-hosting/hosting-odoo-gratis-gratuito-2025/` | Crawled-not-indexed ES root (03.05.26); templated "free hosting" page | Honest free-vs-paid breakdown: what free actually gives (community trial, Odoo.sh 15-day), hard limits, when to upgrade | 1600 | "hosting odoo gratis" | | 3 | `/odoo/odoo-compras-gestion-proveedores-2025/` | Crawled-not-indexed ES root (31.03.26); 400-word boilerplate on a high-volume module topic | Step-by-step Purchase module setup, RFQ workflow, approval rules, 3-way matching explained | 1800 | "odoo gestión de compras" | | 4 | `/odoo/odoo-argentina-implementacion-local-2025/` | Crawled-not-indexed ES root; geo page with no local specifics | Argentina: AFIP localization, electronic invoice (ARCA), peso currency handling, local partners | 1600 | "odoo argentina implementación" | | 5 | `/odoo-hosting/odoo-vs-zoho-books-hosting-2025/` | 1,643 words, fabricated loss narrative, 120-char title, hype framing | Neutral feature/pricing comparison: Zoho Books vs Odoo for LATAM SMBs, localization + hosting flexibility | 1800 | "odoo vs zoho books" | | 6 | `/odoo-hosting/odoo-gratis-vs-pago-diferencias-2025/` | In duplicate-canonical GSC list (FR/PT flagged); ES root likely templated | Concrete feature matrix Community vs Enterprise by module, with exact pricing from odoo.com pricelist | 1600 | "odoo gratis vs pago" | | 7 | `/odoo-ia/que-es-odoo-ia-guia-basica-2025/` | Crawled-not-indexed ES root (27.04.26); "basic" suggests shallow intro | Structured explainer: Odoo AI features by module (ChatGPT connector, OCR, predictive reordering) + version availability table | 1800 | "qué es odoo ia" | | 8 | `/odoo-hosting/servidor-dedicado-odoo-2026/` | Crawled-not-indexed ES root (11.04.26); 400-word skeleton | Spec guide: hardware for 50/100/500 users, Hetzner/OVH/AWS prices, PostgreSQL tuning basics | 1600 | "servidor dedicado odoo" | | 9 | `/odoo-hosting/managed-odoo-hosting-2026/` | Crawled-not-indexed ES root (31.03.26); high commercial intent query | What "managed" means: SLA comparison table, who manages what, pricing per tier | 1600 | "managed odoo hosting" | | 10 | `/odoo-hosting/odoo-docker-hosting-2026/` | Crawled-not-indexed ES root (04.04.26); technical, specific | Docker Compose walkthrough for Odoo 17/18, multi-container architecture, prod vs dev config | 1800 | "odoo docker hosting" | | 11 | `/odoo-hosting/hosting-odoo-mexico-2026/` | Crawled-not-indexed ES root (01.04.26); geo page no local specifics | Mexico: SAT CFDI e-invoice, Odoo partner list MX, latency for US-border hosting | 1600 | "hosting odoo méxico" | | 12 | `/odoo-hosting/migracion-hosting-odoo-2026/` | Crawled-not-indexed ES root (29.03.26); high commercial intent | Step-by-step migration checklist: backup, filestore export, DB restore, domain cutover, post-migration validation | 1800 | "migración hosting odoo" | | 13 | `/odoo-hosting/vps-odoo-hosting-2026/` | Crawled-not-indexed ES root (31.03.26); generic VPS page | VPS sizing by user count, Ubuntu 22.04 recs, Nginx reverse proxy, SSL config | 1800 | "vps odoo hosting" | | 14 | `/odoo-hosting/hosting-hibrido-odoo-2026/` | Crawled-not-indexed ES root (31.03.26); niche but uncontested | Define hybrid: on-prem DB + cloud app tier; regulated-data use case; cost model | 1500 | "hosting híbrido odoo" | | 15 | `/odoo-hosting/hosting-odoo-argentina-2026/` | Crawled-not-indexed ES root (31.03.26) | Argentina: data residency, peso invoicing, local providers (Cloudflare LatAm PoP), ARBA localization | 1600 | "hosting odoo argentina" | | 16 | `/odoo-hosting/hosting-odoo-sin-tarjeta-2026/` | Crawled-not-indexed ES root (01.04.26); pure trial-intent | List every free-trial option (Odoo.sh 15-day, Online demo, Odoo4projects trial), limits, upgrade paths | 1400 | "hosting odoo sin tarjeta" | | 17 | `/odoo-hosting/hosting-odoo-economico-2026/` | Crawled-not-indexed DE/ES variants; price-sensitive buyer | Tiered buyer guide: <30€, 30-80€, 80-200€, named providers per tier | 1600 | "hosting odoo económico" | | 18 | `/odoo-hosting/odoo-enterprise-hosting-2026/` | Crawled-not-indexed ES/EN/DE/FR variants; high-value Enterprise-specific intent | Enterprise hosting requirements: min SLA, dedicated support, GDPR, SAP migration path, price range | 1800 | "odoo enterprise hosting" | | 19 | `/odoo-hosting/hosting-odoo-mensual-2026/` | Crawled-not-indexed across 5 language variants | Monthly vs annual for 8 providers, contract flexibility, what's included, cancellation terms | 1400 | "hosting odoo mensual" | | 20 | `/odoo-hosting/odoo-on-premise-2026/` | Crawled-not-indexed FR/DE variants; top-of-funnel decision | 3-year TCO model: on-prem (hardware + sysadmin + upgrades) vs managed cloud, with decision flowchart | 1800 | "odoo on premise vs cloud" | --- ## 3. Content-Derived Unique Title + Meta Generator (kills the 194 duplicate titles properly) ### Why W5 did not solve this W5 appended `slug + lang` as a suffix. The 194 duplicates remain because the underlying templated stem was identical across pages — only the appended suffix changed. Two pages with title stem "Guía Odoo Hosting" become "Guía Odoo Hosting — slug-A | es" and "Guía Odoo Hosting — slug-A | en" which are still semantically duplicate (and SERP-truncated). ### The rule (run as a Node.js or Python codemod over all /index.html) Pseudocode: ``` for each file in glob("**/index.html"): dom = parse(file) h1_text = dom.querySelector("h1").innerText.trim() first_h2 = dom.querySelector("article h2, main h2").innerText.trim() sentences = extractSentences(dom.querySelector("article p, main p").innerText) sent1 = sentences[0] sent2 = sentences[1] # title (50-60 chars) h1_short = truncateAtWord(h1_text, 40) h2_tag = extractNounPhrase(first_h2, maxChars=15) skipTags = {"Contenido","Resumen","Introducción"} if h2_tag and h2_tag not in skipTags: candidate = f"{h1_short}: {h2_tag} | Odoo Expertos" else: candidate = f"{h1_short} | Odoo Expertos" title = enforceMaxChars(candidate, 60) # meta (140-160 chars) combined = (sent1 + " " + sent2).strip() meta = combined if len(combined) <= 160 else (truncateAtWord(sent1, 140) + ".") # uniqueness gate if title in TITLE_REGISTRY: disambiguator = firstUniqueNoun(sent2, exclude=title) title = enforceMaxChars(f"{h1_short} {disambiguator} | Odoo Expertos", 60) TITLE_REGISTRY.add(title); META_REGISTRY.add(meta) dom.setTitle(title); dom.setMeta("description", meta) writeFile(file, dom.serialize()) ``` Key regex for first body paragraph (excludes boilerplate): ```js const bodyP = Array.from(document.querySelectorAll('article p, main > p, .content p')) .filter(p => p.closest('nav,header,.toc,.breadcrumb,script,style') === null) .map(p => p.innerText.trim()) .filter(p => p.length > 60)[0] || ''; ``` ### 5 worked examples **Ex 1** — `/odoo-hosting/mejor-hosting-odoo-2026/` - New title (55c): `Mejor Hosting Odoo 2026: Panorama | Odoo Expertos` - New meta (158c): `El mercado de hosting para Odoo evolucionó en 2026. Con Odoo 18 e IA integrada, las opciones van desde 29€/mes hasta enterprise gestionado.` **Ex 2** — `/odoo-hosting/cloudpepper-vs-odoo-sh-2026/` - New title (58c): `Cloudpepper vs Odoo.sh 2026: Precios | Odoo Expertos` - New meta (155c): `La elección entre Cloudpepper y Odoo.sh determina costos y funcionalidad de tu Odoo. Comparamos precios, rendimiento y soporte para empresas en 2026.` **Ex 3** — `/odoo-hosting/odoo-community-vs-enterprise-hosting-2026/` - New title (60c): `Odoo Community vs Enterprise: Diferencias Clave 2026` - New meta (148c): `La decisión entre Community y Enterprise afecta costos de hosting, RAM necesaria y capacidades operativas. Guía con tabla de funciones y precios 2026.` **Ex 4** — `/odoo-hosting/comparativa-precios-odoo-2026/` - New title (57c): `Precios Hosting Odoo 2026: 15 Proveedores | Expertos` - New meta (152c): `Desde 12€/mes en VPS hasta 500€ en enterprise: comparamos precios reales de 15 proveedores de hosting Odoo en 2026 con análisis de costos ocultos y TCO.` **Ex 5** — `/odoo-hosting/odoo4projects-hosting-review-2026/` - New title (55c): `Odoo4projects Review 2026: Análisis | Odoo Expertos` - New meta (156c): `Odoo4projects: desde 29€/mes, usuarios ilimitados, IA integrada y soporte en español. Review completa con precios, pros/contras y comparación con Odoo.sh.` --- ## 4. Cluster grouping for the 13 existing vs/review slugs ### Cluster A — "Best Hosting Picker" (commercial / navigational) **Pillar:** `/odoo-hosting/mejor-hosting-odoo-2026/` Targets: "mejor hosting odoo", "hosting odoo recomendado", "qué hosting usar para odoo" Spokes (exist, need deepening): - `/odoo-hosting/mejores-proveedores-hosting-odoo-2026/` (ranked list) - `/odoo-hosting/mejores-proveedores-hosting-odoo-2025/` (historical — see §5: 301 to 2026 or archive) - `/odoo-hosting/opiniones-hosting-odoo-2026/` (social proof) - `/odoo-hosting/odoo4projects-hosting-review-2026/` (deep-dive single provider) - `/odoo-hosting/comparativa-precios-odoo-2026/` (price angle) Pillar links to all 5 spokes; each spoke links back to pillar + 2 siblings. ### Cluster B — "Head-to-Head Comparisons" (commercial / decision) **Pillar:** `/odoo-hosting/odoo-community-vs-enterprise-hosting-2026/` Targets: "odoo community vs enterprise", "qué edición odoo elegir" Spokes: - `/odoo-hosting/odoo-vs-sap-hosting-2026/` (cross-ERP) - `/odoo-hosting/odoo-vs-zoho-books-hosting-2025/` (cross-category) - `/odoo-hosting/cloudpepper-vs-odoo-sh-2026/` (provider-vs-provider) - `/odoo-hosting/odoo-gratis-vs-pago-diferencias-2025/` (free vs paid licensing) Pillar choice rationale: users can't choose a provider before they've chosen an edition. ### Cluster C — "Alternatives & Escape Routes" (informational / commercial) **Pillar:** `/odoo-hosting/alternativas-odoo-sh-2026/` Targets: "alternativas odoo sh", "opciones hosting odoo" Spokes: - `/odoo-ia/alternativas-odoo-ia-comparativas-2025/` (AI-specific alternatives; dual-link to Cluster B is fine) - `/odoo-hosting/odoo-gratis-vs-pago-diferencias-2025/` (shared with Cluster B) Thinner cluster — candidates to add once content quality is up: "odoo sh review 2026", "self-hosted odoo vs odoo sh", "cloudpepper review 2026" (none exist as ES-root yet). --- ## 5. Cannibalization flags **Direct cannibalization to consolidate or 301:** - `/odoo-hosting/mejores-proveedores-hosting-odoo-2026/` vs `…-2025/` — same query, year-separated; both crawled-not-indexed. **Action:** keep 2026, 301 the 2025 slug to 2026, archive 2025 content as a "market evolution" section inside the 2026 page. - `/odoo-hosting/mejor-hosting-odoo-2026/` vs `/odoo-hosting/mejores-proveedores-hosting-odoo-2026/` — heavy SERP overlap; both crawled-not-indexed. **Action:** explicit differentiation — "mejor" = single buyer's-choice recommendation; "mejores-proveedores" = ranked list with methodology. Make the pillar/spoke link relationship explicit. - `/odoo-hosting/opiniones-hosting-odoo-2026/` vs review sections of `…/odoo4projects-hosting-review-2026/` — no true cannibalization, but the opiniones page must link to the review page for every provider it mentions (currently zero cross-links). - `/odoo-hosting/odoo-gratis-vs-pago-diferencias-2025/` — hosting-located but the query is also served by licensing content in `/odoo/`. **Action:** narrow this page to *hosting cost implications only*; move general licensing differences to an `/odoo/` article with a cross-link. - `/odoo-ia/alternativas-odoo-ia-comparativas-2025/` — once rewritten (§2 #10), scope strictly to AI-specific alternatives (SAP AI, MS Dynamics AI), not general Odoo alternatives — otherwise will compete with Cluster B pillar once that gains authority.