New: /odoo/odoo-{bolivia,honduras,guatemala,chile,mexico,paraguay}-implementacion-local-2027/
Not templated filler. Each page answers what actually differs in that country:
- l10n module verified in the Odoo 19 community addons tree: l10n_bo, l10n_hn,
l10n_gt, l10n_cl, l10n_mx exist; l10n_py does NOT (404). Paraguay's page is
therefore about the absence of an official localisation and what that costs
in maintenance, not a copy of the others.
- No l10n_*_edi module exists in the community tree at all, so every page states
that e-invoicing is Enterprise or third-party — the cost most budgets miss.
- Partner links go to the official Odoo directory filtered by country (verified
200): bolivia-28, honduras-94, guatemala-88, chile-44, mexico-150,
paraguay-179. No individual firms are named: partner status changes, and an
unverified endorsement is the same defect as the testimonials we removed.
- One affiliate CTA per page (utm_campaign=country-2027), disclosed.
- Article + FAQPage + BreadcrumbList schema per page.
Wired in: 2025 pages link forward to their 2027 counterpart (5 of them; Paraguay
has no 2025 page and says so), /odoo/ hub links all six, sitemap-es.xml +6 URLs.
Countries chosen by actual GSC demand: odoo bolivia 88 impr/3 clicks, odoo
honduras 86, guatemala 51 across three queries, then chile/mexico/paraguay.
/odoo-ia/ (279 impressions at position 6.8 for 'odo ia', zero clicks):
- H1 answers the query instead of describing the page: 'Odoo IA: que hace la
inteligencia artificial en Odoo (y que no)'.
- Hero stats '60+ Recursos / 85% Automatizacion / 24/7 Operacion' replaced with
the three honest routes: nativo / integracion / fuera. '85%' had no source.
- 'Empieza por aqui': five curated entry points, so the hub is a guide and not
only a list of 55 links.
- Hosting CTA with utm_medium=hub-cta and a disclosure.
- FAQ (5 questions) + matching FAQPage schema. Answers are conditional on
version and edition; no feature list is asserted, because odoo.com has no AI
page to verify one against.
Separately, a real defect found while checking the render: 1,714 script blocks
across 840 pages called document.write(null) or set innerHTML = null, so the
header and footer rendered the literal text 'null'. Replaced with
createHeader()/createFooter(), which restores the real navigation on every
affected page.
The page ranked 4.9-7.7 for 6 queries (~400 impressions) and earned zero clicks.
The snippet said 'the history of Odoo'; the searcher is asking whether they can
use this Belgian thing where they live.
- Head: 'Es belga, y asi se usa en LATAM'. Description leads with the answer
(Belgium, 2005, Fabien Pinckaers) and the LATAM payoff (Community ships
accounting localisation).
- 'Odoo en 30 segundos' fact block above the fold: Belgium/2005, founder,
282 M EUR revenue 2023 (+33%), 2,200+ staff, 5.26 B USD valuation (Nov 2024),
50 official apps + 50,000 community.
- LATAM section: Community ships l10n for MX/CL/AR/PE/CO/BR (verified in the
Odoo 19.0 addons tree). Electronic invoicing explicitly NOT claimed as
included - it varies by country, Enterprise or OCA.
- CTA to Odoo4projects Sao Paulo with utm_campaign=empresa-odoo-historia and a
disclosure line.
Every number is sourced: Wikipedia (2005, 282 M EUR, 2,200 staff, 5.26 B USD
valuation) and odoo.com (50 apps, 50,000 community apps).
Broken internal links: 1,370 -> 0 occurrences.
- 1,068 resolved context-aware: the same dead path needs a different destination on
each locale, so resolution is per (page, target), not per string. Old-site routes
(/contacto/, /servicios*, /consultoria*, /implementacion*, /recursos*) go to the
page's own locale home or /odoo/ hub; legacy /odoo-ai/ paths are rewritten to
/odoo-ia/; locale pages linking a root slug get their own locale's version.
- 301 remaining point at inline body links to pages that were planned but never
written (35 locale hosting articles, 5 old /odoo-ai/ slugs, dead sections). Those
fall back to the same-language section hub rather than 404.
Empty PT page: pt/odoo-ia/odoo-sistema-reservas-booking-ia-2025/ was 0 bytes and
returned an empty 200 from the PT sitemap. Removed it, its <url> block and every
hreflang alternate pointing at it; the 5 PT pages that linked to it now point at
/pt/odoo-ia/.
Canonicals: 23 relative -> absolute (a relative canonical carries no host, and apex
and www both answer 200). 62 pages had a second canonical added in the previous pass
because theirs was written href-first; duplicates removed, every page now has
exactly one. 404.html deliberately has none.
English homepage: title, description and H1 aligned to the 'odoo experts' query.
Three pages carry six of the 17 queries that rank on page 1 with zero clicks
(1,090 impressions, 23% of the site's total). The snippets were machine
slug-dumps ('Empresa Odoo Historia Fundacion 2025 | Odoo Expertos') followed by
a ' - <slug> | ES' artifact that wasted half the description.
- /odoo/empresa-odoo-historia-fundacion-2025/ -> '¿De dónde es Odoo? Origen y
quién lo creó' (targets: odoo de donde es 154@5.3, de donde es odoo 115@4.9,
odoo origen 60@7.7, odoo de que pais es 32@6.8, odoo de donde es originario
25@4.5, quien creo odoo 21@6.4)
- /odoo/odoo-honduras-implementacion-local-2025/ -> 'Odoo en Honduras:
facturación DEI y localización' (odoo honduras 81@9.4)
- /odoo-ia/ -> 'Odoo IA: qué automatiza y cómo empezar' (odo ia 279@6.8 plus
the .odo ia / ,odo ia variants)
Title, description, og:title and og:description updated together. Every claim in
the new copy is supported by the page body.
No visible change — links, canonicals and dead tags only.
- 155 path rewrites (case drift from the provider move): /Odoo-Hosting/ ->
/odoo-hosting/, /odoo-ai/ -> /odoo-ia/, /Odoo/... -> /odoo/...; applied in
href/src, og:url and JSON-LD alike. The origin is case-sensitive, so these
were live 404s.
- canonicals: 93 pointed at a case variant that 404s, 43 pointed at a path that
no longer exists; the first now point at the real URL, the second are
self-canonical. Cross-locale canonicals were left alone (strategy, not a bug).
- removed 1,197 dead <link rel=alternate icon href=/favicon.ico> (file never
existed), 96 dead /styles/*.css links (Next.js leftovers) and 3
/_vercel/insights scripts (previous host's analytics).
- deleted unused duplicates: index-optimized.html, index-performance.html,
add-performance.html, a 2.1 MB duplicate portrait, and the old build scripts
(server-upstash*.js, server-optimized.js, minify-assets.js, optimize-all.js,
fix-canonicals.ps1).
broken internal links: 4,029 -> 1,370 occurrences.
js/plausible-events.js classifies every outbound click:
Affiliate Click — host in AFFILIATES map, or rel=sponsored
Outbound Click — any other external link
props: network, destination, destination_path, placement (utm_medium),
link_text, lang. Internal links, in-page anchors, mailto: and tel: are ignored;
data-plausible-skip opts an element out. Adding a new partner is one line in
AFFILIATES. Loaded on 1206 pages before </body>.
Create the two goals in Plausible (Settings -> Goals -> Custom event) named
exactly 'Affiliate Click' and 'Outbound Click' for them to show as conversions.
plausible.office.odoo4projects.com is a self-hosted CE instance: it serves
/js/script.js and /js/plausible.js, but /js/pa-VLJpcZHbeLiw9Ub8C_MgG.js returns
404, so the snippet you supplied loaded no tracker and would have recorded
nothing. Site id now travels in data-domain (apex + www report as one site).