Files
odoo-expertos.com/growth/SEO-REPORT-2026-10-24-run2.md
T

11 KiB
Raw Blame History

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-<hash>)
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.