# Full SEO Audit — odoo-expertos.com **Date:** 2026-05-27 **Auditor:** claude-seo v2.0.0 (AgriciDaniel) — orchestrated multi-agent audit **Host:** Vercel (canonical host `www.odoo-expertos.com`) **Site type:** Odoo ERP consulting, multilingual (ES root + EN/DE/FR/PT/AR), ~1,210 pages, static HTML **Output location:** this folder only (`seo-audit-2026-05-27/`). Nothing was written to any other project. --- ## Scope (read first) This is a **bounded, representative audit**, not a 500-page crawl. Analyzed: - All site-wide files: `robots.txt`, sitemap index + all 6 language sitemaps, `llms.txt`, `llms-full.txt` - 6 language homepages (es/en/de/fr/pt/ar) - Category index pages across all 6 languages (`/odoo/`, `/odoo-hosting/`, `/odoo-ia/`) - Representative deep article pages in ES/EN/DE - Homepage screenshots (desktop + mobile, in `screenshots/`) The structural problems found replicate across language siblings and the ~1,210-page template, so the sample is representative of systemic issues. Raw fetched data is in `raw/`. > **PageSpeed note:** Google PSI/CrUX was rate-limited (no API key on the shared quota) at audit time, so Core Web Vitals numbers below are **ESTIMATED from HTML signals**, not measured field/lab data. Re-run with a PSI API key for exact CWV. --- ## Executive Summary **Overall SEO Health Score: ~44/100 — Poor. Significant, systemic issues.** | Category | Weight | Score | Verdict | |---|---|---|---| | Technical SEO | 22% | 54 | Hreflang broken on inner pages; 3 category pages 404 in sitemaps | | Content Quality / E-E-A-T | 23% | 25 | 400+ EN/DE pages serve untranslated/garbled Spanish; fabricated authors | | On-Page SEO | 20% | 35 | 270–300+ char keyword-stuffed titles; orphan articles | | Schema / Structured Data | 10% | 45 | Broken logo domain, www mismatch, DE page ships Spanish schema | | Performance (CWV) | 10% | ~65 (est) | Real optimizations present; CWV not measured (PSI rate-limited) | | AI Search Readiness (GEO) | 10% | 50 | Excellent crawler posture; homepage hype suppresses citability | | Images | 5% | ~60 (est) | Lazy-load claimed; not fully verified | ### Top 5 Critical Issues (fix immediately) 1. **400+ EN/DE pages are not translated** — they serve Spanish (or broken machine-mixed Spanish/German like "Inteligencai Artificail", "ueber", "fuer") under `lang="en"`/`lang="de"`. This is a site-wide quality/deception signal that risks a domain-level downgrade. 2. **3 category index pages 404 while listed in their sitemaps** — `/en/odoo-hosting/`, `/fr/odoo-hosting/`, `/pt/odoo-hosting/` all return 404 but appear as `` entries → poisons sitemap trust + breaks the hub for ~200 pages each. 3. **Hreflang broken on inner pages** — EN inner pages omit `pt` + `ar` (non-reciprocal); DE inner pages point `hreflang="es"` and `x-default` to non-existent `/de/`-prefixed Spanish slugs (404). Category index pages have **zero** hreflang. 4. **Broken/inconsistent Organization logo + URL in schema** — logo points to `www.odooexpertos.com` (no hyphen — domain does not resolve); CollectionPage/breadcrumb URLs use non-www while canonicals use www → entity-consolidation failure. 5. **Homepage is anti-E-E-A-T and anti-citation** — fear/combat hype ("Tus Competidores Usan IA Para Robarte Clientes", CTA "DESTRUIR COMPETENCIA AHORA"), unsourced stats (280% ROI), publisher entity "Apex AI Research Labs LLC", no About/Contact page. ### Top 5 Quick Wins 1. Remove the three 404 `` entries from `sitemap-en/fr/pt.xml` (stops sitemap poisoning today) — then build the missing index pages. 2. Fix the schema logo URL site-wide (`odooexpertos.com` → `www.odoo-expertos.com/favicon.svg`) and switch all schema `url`/`item` to the www host. 3. Add the missing security headers via `vercel.json` (`X-Content-Type-Options`, `X-Frame-Options`, `Referrer-Policy`). 4. Collapse the duplicate robots.txt groups, merge the useful `Disallow: /*?` `/*&` into the FIRST `User-agent: *` group, delete `Disallow: /*#`. 5. Fix `og:locale` on DE/FR/PT category pages (currently `es_ES`) and the truncated `dateModified` in Article schema. ### What's genuinely good - **Canonicalization is correct**: apex `odoo-expertos.com` → 301 → `www`; `http` → 308 → `https`; self-referencing canonicals on www; HSTS present (2-year max-age). - **Homepage hreflang is complete and reciprocal** across all 6 languages incl. `x-default`. - **AI-crawler posture is exemplary** — robots.txt explicitly allows GPTBot, ClaudeBot, PerplexityBot, OAI-SearchBot, Google-Extended, CCBot, Applebot-Extended, etc., and routes them to `llms.txt`. SEO scrapers (Ahrefs/Semrush/MJ12/Bytespider) correctly blocked. - **Static HTML on Vercel** = best possible crawl/AI-ingestion foundation. - **Arabic RTL** done correctly (`` + Noto Sans Arabic). - **Critical CSS inlined + async minified CSS** — real performance work shipped. - **Sitemaps comprehensive**: 1,210 URLs (es 201 / en 206 / de 205 / fr 199 / pt 199 / ar 200) with xhtml:link hreflang annotations. --- ## 1. Technical SEO & Hreflang — Score 54/100 ### [Critical] Three category index pages 404 while listed in their sitemaps `/en/odoo-hosting/`, `/fr/odoo-hosting/`, `/pt/odoo-hosting/` all return **HTTP 404**, yet each appears as a `` entry in its language sitemap. (ES, DE, AR versions return 200; `/en/odoo/`, `/en/odoo-ia/`, `/de/odoo/`, `/de/odoo-ia/` return 200.) - **Why:** Submitting 404s in a sitemap degrades trust in the whole sitemap and can suppress crawl priority. These are hub pages — without them, ~200 inner pages per language lose their category link root. - **Fix now:** Remove the 3 dead `` entries from `sitemap-en/fr/pt.xml` today. **Fix properly:** build the missing index pages (mirror the working DE/AR versions). ### [Critical] Hreflang broken on inner pages (reciprocity + wrong targets) - EN inner pages (e.g. `/en/odoo-hosting/best-odoo-hosting-2026/`) declare only es/en/de/fr/x-default — **`pt` and `ar` are missing**, so ES→PT/AR is not reciprocated. Google discards a non-reciprocal hreflang cluster entirely. - DE inner pages (e.g. `/de/odoo-hosting/bestes-odoo-hosting-2026/`) set `hreflang="es"` and `x-default` to `https://www.odoo-expertos.com/de/odoo-hosting/mejor-hosting-odoo-2026/` — a `/de/`-prefixed Spanish slug that **404s**. Correct target is the root `https://www.odoo-expertos.com/odoo-hosting/mejor-hosting-odoo-2026/`. - **Fix:** Templated fix across the EN template (add pt+ar) and DE template (build es/x-default hrefs from the root, no `/de/` prefix). Affects ~200 pages each. ### [Critical] Category index pages have ZERO hreflang `/odoo-hosting/`, `/de/odoo-hosting/`, `/odoo-ia/` (and likely all category hubs) return 0 hreflang `` tags. Google cannot connect the language versions of these high-equity hubs → they compete with each other. - **Fix:** Add the full 7-entry block (es,en,de,fr,pt,ar,x-default) to every category index ``. ### [High] robots.txt structural errors - **Two `User-agent: *` groups.** Per RFC 9309, only the FIRST matching group applies — so the second block's useful rules (`Disallow: /*?`, `/*&`) are **silently ignored**. Parameterized/duplicate URLs you intended to block are being crawled. - **Duplicate `User-agent: Bingbot`** (Bing section vs AI section, with different Allow rules) and **duplicate `User-agent: CCBot`** — dead/conflicting config. - **`Disallow: /*#`** is meaningless (fragments never reach the server). - **Fix:** One group per agent. Merge `Disallow: /*?` `/*&` into the FIRST `User-agent: *`. Delete the second `*` block, the duplicate Bingbot/CCBot groups, and `/*#`. ### [Medium] Missing security headers Present: `Strict-Transport-Security: max-age=63072000` (good). Missing: `X-Content-Type-Options`, `X-Frame-Options`, `Referrer-Policy`, `Permissions-Policy`, CSP. - **Fix (`vercel.json` headers):** add `X-Content-Type-Options: nosniff`, `X-Frame-Options: SAMEORIGIN`, `Referrer-Policy: strict-origin-when-cross-origin`. ### [Low] http→https→www = 2 redirect hops `http://odoo-expertos.com` → 308 → `https://odoo-expertos.com` → 301 → `https://www…`. Standard, not penalized, but a direct `http-apex → https-www` rule would save one hop. ### What's already good (technical) - Apex→www 301 and http→https 308 correct; **www is the single canonical host**; self-referencing canonicals; HSTS 2yr. - **Homepage hreflang complete + reciprocal** across all 6 languages incl. x-default; valid ISO codes; www hosts. - No `noindex` on any sampled page; viewport tag everywhere; **Arabic RTL** (`dir="rtl"` + Noto Sans Arabic) correct. - Sitemap index → 6 language sitemaps with xhtml:link hreflang annotations; 1,210 URLs total. - robots.txt correctly blocks SEO scrapers (Ahrefs/Semrush/MJ12/Dot) while allowing all search + AI bots. ## 2. Content Quality & On-Page SEO — Score ~30/100 (E-E-A-T 18/100) ### [Critical] 400+ EN/DE pages serve untranslated / garbled content under the wrong `lang` - `/en/odoo/odoo-hosting-cloud-infraestructura-2025/` declares `lang="en"` but H1, H2s, body and meta are **entirely Spanish**. - `/de/odoo-hosting/` ships broken machine-mixed text: title "…Vollstaendiger Leitfaden **de** Lieferanten Cloud … fuer ERP…", body "…necesitas saber **ueber** infraestructura, Lieferanten…", H2 "100+ **Leitfadens** Especializadas". - `/en/odoo-ia/` H1/title/meta all read "**Inteligencai Artificail**" (misspelled, mixed ES/EN: "RPA y Chatbots Smarts", "Predicción of Sales"). - **Why:** Declared-language ≠ content-language is a deception signal; at 400+ pages it risks a **site-wide quality downgrade** and breaks hreflang (language signals contradict content). These pages give zero value to EN/DE users and near-duplicate the Spanish originals. - **Fix (pick one, sitewide):** (a) genuinely translate EN/DE pages; (b) remove EN/DE article pages and keep Spanish-only with hreflang back to ES; (c) 301 untranslated EN/DE paths → Spanish canonical. Only (a) preserves the multilingual investment. **Do not generate more Spanish-slug EN/DE pages.** ### [Critical] Category/directory titles are 270–300+ chars of keyword stuffing e.g. `/odoo-hosting/` title is 271 chars: "Directorio de Artículos Odoo Hosting - Guía Completa de Proveedores Cloud | AWS, Azure, DigitalOcean para ERP | … | 50+ Tutoriales… | Odoo Expertos". `/odoo/` ~250+, `/odoo-ia/` 273, `/de/odoo-hosting/` 277 (and Spanish/German mixed). - **Why:** Google truncates/rewrites at ~60 chars; a 270+ char pipe-stuffed title is a manipulation signal under the Sep-2025 QRG. - **Fix:** Rewrite to 50–60 chars in the target language: `[Primary keyword] — [value] | Odoo Expertos`. ### [High] Article pages are orphans — zero in-body internal links `/odoo/odoo-hosting-cloud-infraestructura-2025/` has 4 hrefs total (favicon ×2, self-canonical, CSS) — **no related-article links, no rendered breadcrumb, no link to parent category**. PageRank cannot flow; with 1,210 pages the architecture is a flat spike. - **Fix:** Add rendered HTML breadcrumb (not just schema), a parent-category link, and ≥3 related-article links per article (templated). ### [High] Homepage copy destroys E-E-A-T H1 "Mientras Lees Esto, Tus Competidores Usan IA Para Robarte Clientes"; H2s "⚔️ ELIGE TU ARMA DE DOMINACIÓN", "🔥 COMPETIDORES SIENDO DESTRUIDOS EN VIVO", CTA "DESTRUIR COMPETENCIA AHORA"; "¡ALERTA! …ROBANDO tus mejores clientes" (confirmed in screenshot). Unsourced "280% ROI" in the title tag; publisher meta = "Apex AI Research Labs LLC". - **Why:** Combat/fear hype + unsourced superlatives is the pattern QRG raters flag as low-trust lead-gen for a B2B ERP buyer. - **Fix:** Factual, keyword-led H1 (e.g. "Consultoría e Implementación Odoo ERP para Empresas — LATAM"); benefit-framed H2s; move urgency to a secondary CTA; source or drop the ROI claim. ### [High] Non-localized URL slugs on EN/DE `/en/odoo-ia/` ("IA" is Spanish), `/en/odoo/…infraestructura…` (Spanish slug). Localized equivalents `/en/odoo-ai/`, `/de/odoo-ki/` 404. - **Fix:** Localized slug convention for new pages; 301 once content is translated. ### [Medium] Thin article bodies (~400–450 words of real content) `/odoo/odoo-hosting-cloud-infraestructura-2025/` ≈610 words incl. chrome → ~400–450 body words on a complex technical topic. H2 outline is good; sections are 1–2 sentences. - **Fix:** Expand each H2 to 200–300 words of genuine guidance. ### [Low] Trust gaps No `/contacto/` or `/sobre-nosotros/` page (both 404); only footer legal links + a Wyoming LLC shell address. Author "Dr. María Elena Rodríguez" has no author page (`/autor/…` 404); homepage author meta = "Apex AI Research Labs LLC" (different entity). Odoo-partner claim unverified. - **Fix:** Real About + Contact pages in nav; verifiable author pages or attribute to the org; link/verify Odoo partner badge. ### What's already good (content) - Homepage hreflang + canonicals correct; page-level `lang` attribute is correct even where content isn't (so the fix is content, not template structure). - Spanish article title/meta well-formed; Spanish article H2 hierarchy is logical and citable. - Legal pages (privacy/terms/legal-notice) + footer address/email present. - Critical CSS inlined + async minified CSS shipped. ## 3. Schema / Structured Data — Score 45/100 What exists: Homepages have `Organization` + `WebSite` (+SearchAction). Category pages have `CollectionPage` (inline `BreadcrumbList` + `Organization` publisher). Article pages have `Article` (JSON-LD) **plus** duplicate Microdata. All use `https://schema.org` (correct). ### [Critical] Broken logo domain — `www.odooexpertos.com` (no hyphen) does not resolve CollectionPage publisher logo = `https://www.odooexpertos.com/assets/logo.png`. The Article publisher uses yet another (`…/logo.png` non-www). Homepage uses `favicon.svg`. → 3 different logo URLs, one pointing at a **dead domain**. No logo passes validation. - **Fix:** One absolute logo URL on the real domain, site-wide (e.g. `https://www.odoo-expertos.com/favicon.svg` or a real 112px+ PNG). ### [Critical] German page ships Spanish schema `/de/odoo-hosting/` (`lang="de"`) CollectionPage `name`="Centro de Recursos Hosting Odoo", breadcrumb "Inicio"/"Hosting Odoo", no `inLanguage`. Misleads entity understanding. - **Fix:** Translate schema strings to German; add `"inLanguage":"de"` (breadcrumb "Inicio"→"Startseite"). ### [Critical] Article schema missing required `image` (+ `mainEntityOfPage`) `/odoo/odoo-hosting-cloud-infraestructura-2025/` Article has headline/author/dates but **no `image`** → ineligible for Google Article rich results. `dateModified` is also truncated/invalid ("202…") → Google ignores the block. - **Fix:** Add absolute `image` (≥1200px) + `mainEntityOfPage`; populate a valid ISO `dateModified`. ### [High] Schema URLs use non-www while canonicals use www CollectionPage `url`/breadcrumb `item` = `https://odoo-expertos.com/…`; canonical = `https://www…`. Entity-consolidation mismatch. - **Fix:** Use the www host in all schema `url`/`item`. ### [High] Duplicate Article markup (JSON-LD + Microdata) on same page → remove Microdata `itemtype`. ### [High] Organization differs ES vs EN homepage with no shared `@id` → define once at root with `"@id":"…/#organization"` and reference it elsewhere (EN's richer address/founder data is otherwise invisible site-wide). ### [Medium] `sameAs: []` empty on all Org blocks → populate (LinkedIn, YouTube, directories) — high value for Knowledge Panel + AI entity resolution. ### [Medium] `WebSite` SearchAction points to `?s=` search that likely doesn't exist on a static site → remove if non-functional. ### Missing opportunities: `BreadcrumbList` on ~240 deep pages; `Service` on homepage; `FAQPage` where question-H2s exist; `inLanguage` on ES/DE blocks. ### What's good (schema): correct `@context`; EN Org is rich (address/founder/parentOrganization/availableLanguage); absolute URLs; ISO dates; no deprecated types. --- ## 4. AI Search Readiness (GEO) — Score 50/100 ### [Critical] Homepage is anti-citation Caps-lock urgency, military metaphors, unsourced stats (280%/65%/400%), no schema/date/author on the highest-authority page → LLMs deprioritize the domain as a source. **Fix:** factual entity-style homepage (see Content §). ### [High] `llms.txt` is spec-valid but link-thin — claims "1,185+ guides" but lists only ~9 URLs; "Key Topics"/"Content Quality" sections are link-free prose. **Fix:** add 8–12 representative URLs per `##` section. ### [High] `llms-full.txt` is ~11 KB (a longer index, not a content dump) — tools that auto-ingest it cache a directory, not substance. **Fix:** generate a real per-language full-text dump (`llms-full-es.txt`, …) with H1 + intro + tables per page. ### [High] No authors/dates on content pages; 2025 vs "2026" freshness inconsistency; missing `Article`/`FAQPage` JSON-LD (overlaps Schema §). **Fix:** bylines + datePublished/dateModified + Article/FAQ schema. ### [Medium] Long interlocked passages — apply "direct answer first" in 134–167-word self-contained blocks (the ES "¿Odoo Cloud vs Hosting Propio?" H2 already does this — extend it). ### [Medium] No off-site entity signals (YouTube/Reddit/Wikipedia). YouTube mentions correlate strongest with AI citations — 3–6 month play. ### [Low] D3 visualizations are client-rendered → invisible to non-JS AI crawlers. Add an accessible HTML data table beside each chart. ### What's exemplary (GEO): robots.txt allows every major answer engine and routes to llms.txt; static HTML = ideal ingestion; llms.txt structurally compliant; 6-language sitemap discovery. Platform estimates: Google AIO 45 · ChatGPT/SearchGPT 50 · Perplexity 55 · Bing Copilot 45. --- ## 5. Performance / Core Web Vitals — Score ~65/100 (ESTIMATED — PSI rate-limited, no field/lab data) > CWV could not be measured (Google PSI/CrUX returned HTTP 429 on the shared quota). Numbers are estimated from HTML/headers. Re-run with a PSI API key or `npx lighthouse ` for real values. Estimated (mobile): Homepage LCP ~2.0–2.8s · INP ~150–300ms · CLS ~0.05. D3 page LCP ~1.5–2.0s · INP ~100–200ms. ### [Critical] `document.write()` injects header/footer/eeat on every content page `` (×3) is parser-blocking, defeats the preload scanner, and causes layout shift when the header pops in. Affects ~990 content pages. **Fix:** render into a pre-sized placeholder div via `insertAdjacentHTML`, `defer` the component scripts, reserve header height (`min-height`). ### [High] 32 KB inline `