# SEO report — odoo-expertos.com — 2026-10-24 (run 2) Data sources, all executed this run: `website_stats.py` (n8n webhook: Search Console 447 queries + Plausible, range 2026-01-01 → 2026-10-24), `audit_site.py . /tmp/seo_audit.json`, `git log`, `grep` counts over the working tree, and live `curl` of the URLs named below. Previous report: `growth/SEO-REPORT-2026-10-24.md`. **Why "run 2":** that previous report was committed at 19:41 UTC today; this run started at 19:42 UTC. Same calendar date, so reusing the filename would have destroyed the only prior report. It is preserved untouched; this file is the newer snapshot. ## Executive summary Nothing moved this week: this run has zero elapsed time since the previous report — three minutes — so it contains no new search data, and every number below is a re-read of the same snapshot, not a trend. The site still stands at **4,745 impressions, 9 clicks, CTR 0.19%, average position 24.7**, with the money cluster (`hosting*`, 33 queries) at **position 27.5, 538 impressions, 1 click** — that is the number that matters and it is unchanged because the time window is unchanged. What this run did add is fresh evidence rather than fresh traffic: the technical defect counts reproduce exactly (1,370 broken internal link occurrences, 0 missing assets, 23 relative canonicals, 18 pages without canonical), the two confirmed live 404s still 404, and the fabricated proof is wider than last week's report stated — **113 pages carry an ISO 27001 claim and 80 carry a SOC 2 claim**. Do not read any of this as a week-over-week result; the first run that can show movement is the next one. ## Scorecard "Last week" is the 2026-10-24 report. "This week" is this run. Both read the same webhook snapshot, so every change is 0 by construction — not a measurement of stagnation. | metric | last week (2026-10-24) | this week (2026-10-24) | change | |---|---|---|---| | GSC impressions | 4,745 | 4,745 | 0 — same snapshot | | GSC clicks | 9 | 9 | 0 | | GSC CTR | 0.19% | 0.19% | 0 | | GSC average position | 24.7 | 24.7 | 0 | | Money-cluster position (`hosting*`) | 27.5 (33q, 538 impr, 1 click) | 27.5 (33q, 538 impr, 1 click) | 0 | | Plausible visitors | 2 | 2 (2 visits, 3 pageviews) | 0 | | Affiliate clicks | n/a | n/a | n/a — no `Affiliate Click` goal configured | Affiliate clicks remain n/a for the same reason as last week, re-verified this run: the Plausible goal block (`event:goal`) returns a single row, `Visit /` with 1 visitor, and nothing else. The custom events in `js/plausible-events.js` cannot appear until the goals are created in the dashboard. The north-star metric is unmeasured, not zero. Commission on odoo4projects.com is not visible from this environment and is not reported. The 2 Plausible visitors are both from the week of 2026-10-19 (United States, Paraguay) and are consistent with owner/test traffic. ## What shipped Every commit in the window is dated 2026-10-24 — the whole backlog landed today, in the hours before this run. `git log --oneline --since="8 days ago"` returns 15 commits; the ones that were supposed to move something: | commit | what it did | metric it was supposed to move | |---|---|---| | `a6cff06` | fixed 2,659 dead internal URLs, repaired canonicals, dropped dead host leftovers | broken internal link occurrences; crawl path health | | `8b80c6c` | removed three unreferenced assets (unused CSS, image probe) | none claimed — hygiene | | `1dde14a` | added the first SEO report | none — reporting | | `cd5d7ef` | logged week 1, advanced plan to week 2 | none — bookkeeping | | `d82af02` | added `.agents/product-marketing.md` (ICP, proof policy, positioning) | none directly; unblocks copy decisions | | `6d25fc8`, `58b8234`, `86f152d`, `3c961ab` | attempted then reverted `/growth` routing config | none — see open risks, the effort failed | | `21b274f` | tracked outbound clicks as Plausible custom events | affiliate clicks (blocked: no goal) | | `3bd7001` | pointed Plausible at `/js/script.js` | data collection (was 404ing on `pa-`) | | `1c50992` | Plausible tag on 1,206 pages | visitors | | `129595d` | affiliate CTA on 6 language hosting hubs | outbound clicks | | `4171a31` | UTM tags on outbound links | attribution | Affiliate link hygiene re-verified this run: 479 `href="https://odoo4projects.com..."` links, 0 without `utm_source=odoo-expertos.com`. ## Verdicts on last week's action items | # | action item | verdict | |---|---|---| | 1 | Create `Affiliate Click` / `Outbound Click` goals in Plausible | **not done** — goal block still returns only `Visit /`. Too early to measure otherwise; nothing shipped. | | 2 | Rewrite title + meta for page-1 zero-click queries | **not started** — no commit touching titles in the window. Too early. | | 3 | Strip fabricated testimonials / ISO / SOC 2 / "200+ proyectos" / placeholder phone | **not done** — 113 pages still carry ISO 27001, 80 carry SOC 2, 12 carry "200+ proyectos", 6 pages still carry `tel:+123****7890`. Still scheduled week 2. | | 4 | Consolidate ~40 near-duplicate `/odoo-hosting/*` pages per locale | **not started** — scheduled weeks 8–10. | | 5 | Fix remaining 1,370 broken internal link occurrences (679 targets) | **no change** — `broken_internal_count` is still 1370. Keep open. | | 6 | Fix the `odoo experts` brand query | **not started** — still 75 impressions @ 13.7, 0 clicks. | | 7 | Fill or remove the 0-byte PT page | **not done** — still live: HTTP 200, 0 bytes. | | 8 | Resolve 23 relative canonicals and 18 pages without a canonical | **no change** — `canonical_not_www: 23`, `no_canonical: 18`. | Nothing was reverted and nothing was claimed as a win. ## Opportunities Identical to the previous snapshot because it *is* the previous snapshot; re-read from the webhook this run. No query is new since last week. **Page-1 zero-click queries** (position ≤ 10, 0 clicks, ≥ 20 impressions): 17 queries, **1,090 impressions** — 23.0% of all impressions. Top by volume: | query | impressions | position | clicks | |---|---:|---:|---:| | odo ia | 279 | 6.8 | 0 | | odoo de donde es | 154 | 5.3 | 0 | | de donde es odoo | 115 | 4.9 | 0 | | odoo honduras | 81 | 9.4 | 0 | | .odo ia | 66 | 7.6 | 0 | | odoo origen | 60 | 7.7 | 0 | | odoobot que es | 56 | 8.8 | 0 | | hosting economicos | 30 | 3.9 | 0 | These are snippet failures, not content failures: the pages already rank and get ignored. At 1.5% CTR the 1,090 impressions would yield ~16 clicks over an equivalent window. **Position 8–20 queries** (≥ 10 impressions): 34 queries, 1,094 impressions, 6 clicks. Largest by volume: `odoo ia` 118 @ 15.0 (0 clicks), `odoo bolivia` 84 @ 8.4 (3), `odoo honduras` 81 @ 9.4 (0), `odoo experts` 75 @ 13.7 (0), `demo odoo` 63 @ 12.4 (1), `odoo demo` 63 @ 17.0 (0), `cloudpepper` 50 @ 11.2 (1). `cloudpepper` is a competitor-brand query ranking in the middle of page 2 with a click already — the only comparable page on the site is the one that wins it. Head-term anchors unchanged: `odoo hosting` 298 impressions @ 31.5 (1 click), `hosting odoo` 85 @ 28.5 (0), `odoo beratung` 155 @ 51.5 (0). ## Action items for the coming week Ordered by expected value. Items 1–3 finish work already scheduled rather than starting new work. **1. Create the `Affiliate Click` and `Outbound Click` goals in Plausible — S — unblocks everything else.** The north star has been unmeasurable for two runs. This is a dashboard setting, not a code change. Proves it: the `event:goal` block returns rows named `Affiliate Click` and `Outbound Click` with non-null event counts. **2. Strip the fabricated proof — S — scheduled week 2, now overdue.** Scale is larger than last week's report said: ISO 27001 on 113 pages, SOC 2 on 80, "200+ proyectos" on 12, `tel:+123****7890` on 6, plus the "María González" and "Alejandro Ruiz" testimonial blocks. Edit the shared templates, not 113 files. Proves it: page-count of ISO/SOC 2 strings and placeholder `tel:` links reaches 0, and impressions on the affected URLs do not fall. **3. Rewrite title + meta description for the four biggest page-1 zero-click queries — M — scheduled weeks 3–6.** `odo ia` (279 impr), `odoo de donde es` (154), `de donde es odoo` (115), `odoo honduras` (81). Proves it: CTR on those four queries. **4. Fix the 1,370 broken internal link occurrences — M — open two runs.** Most are navigation-template links (`/contacto/`, `/servicios`, the `/odoo-ai/` → `/odoo-ia/` path error), so the fix is a handful of templates. Proves it: `broken_internal_count` from `audit_site.py` drops toward 0. **5. Write the week-2 entry in `growth/WEEKLY-LOG.md` and advance `state.json` — S.** Two consecutive runs have produced identical numbers and no measurement row; without the log the loop has no memory of what it decided. Proves it: a week-2 row exists with a measured column. ## Open risks All re-checked this run; none stale. - **Fabricated proof at scale.** 113 HTML files contain "ISO 27001", 80 contain "SOC 2", 12 contain "200+ proyectos", 6 contain `tel:+123****7890`, 1 contains the "María González" testimonial, 1 contains "Alejandro Ruiz". Neither certification is verifiable from anything in this environment. - **Two confirmed live 404s.** `https://www.odoo-expertos.com/servicios` → 404 (153 bytes); `https://www.odoo-expertos.com/odoo-ai/odoo-chatbot-ai-atencion-client-2025/` → 404 (153 bytes). Both still linked internally. - **Empty page is indexable.** `https://www.odoo-expertos.com/pt/odoo-ia/odoo-sistema-reservas-booking-ia-2025/` → HTTP 200 with `size_download 0`, listed in the PT sitemap. Soft-404 candidate. - **1,370 broken internal link occurrences** across 679 unique targets; audit also reports `h1_not_one: 19`, `pages_without_title: 1`, `pages_without_description: 1`. - **Canonical host ambiguity.** `canonical_not_www: 23` relative canonicals on `en/` and `fr/` pages; `no_canonical: 18`. Apex and www both serve 200 with no redirect, so the canonical resolves to whichever host the crawler used. Leave the intentional cross-locale canonicals alone — touching them re-indexes ~150 pages. - **hreflang coverage 26%.** 317 of 1,202 HTML files carry an `hreflang` tag; 1,111 carry an absolute `https://www.` canonical (the remaining 91 are relative, absent, or another host form). Cross-locale canonicalised pages without hreflang give Google no signal that a translation exists. - **Sitemap gap.** `sitemap_url_count: 1191` against 1,202 HTML pages — 11 pages in no sitemap. Partly legal/404 pages by design, not verified page by page. - **Internal strategy is public.** `https://www.odoo-expertos.com/growth/PLAN.md` → HTTP 200, 7,426 bytes. Routing config had zero effect (four commits, one revert); `robots.txt` `Disallow: /*.md$` is advisory only. - **No attribution.** Affiliate clicks unmeasured (no goal), commission not visible here. ## Next review date 2026-10-30 (Friday). That run should carry the first genuine week-over-week comparison, and is the first that can hold items 1–3 above to account.