From 544a75cddd91a26af396c1b316d23422b06fc4f4 Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Sat, 31 Oct 2026 01:02:01 +0000 Subject: [PATCH] SEO report 2026-10-31 (HTML) --- growth/WEEKLY-LOG.md | 2 +- growth/reports/seo-2026-10-31.html | 257 +++++++++++++++++++++++++++++ 2 files changed, 258 insertions(+), 1 deletion(-) create mode 100644 growth/reports/seo-2026-10-31.html diff --git a/growth/WEEKLY-LOG.md b/growth/WEEKLY-LOG.md index 911cac5..a5ad42a 100644 --- a/growth/WEEKLY-LOG.md +++ b/growth/WEEKLY-LOG.md @@ -18,7 +18,7 @@ an unfinished week. | 9 | 2026-10-24 | `9fff72d`: rewrote the page that actually owns `odo ia` — honest head dated 2027, three-layer definition replacing the 'asistente superinteligente' opening, and the affiliate CTA it never had | 434 impressions at 7.8 with 0 clicks, and it is the site's second-largest impression page; the snippet was a slug dump and the copy sold a fantasy instead of answering | CTR on the 6 queries the page owns (`odo ia` 251, `odoo ia` 67, `.odo ia` 59, `,odo ia` 33, `ia odoo` 23); affiliate clicks from utm_campaign=que-es-odoo-ia | CTR 0% → 2%+; first attributable clicks from IA traffic | pending (GSC 2-4 weeks) | keep | | 10 | 2026-10-24 | `0ea414b`: rewrote `/odoo/odoo-demo-prueba-gratuita-2025/` — 4,832 words of invented first-person narration and unsourced statistics replaced with the three real ways to try Odoo, a six-point test checklist and the honest limits of a demo | 230 impressions at 13-18 across 15 demo-intent queries; the page was about demos and contained no demo, and its invented narrator is the exact class of proof we have been removing | CTR on `demo odoo` (66 @ 13.2), `odoo demo` (64 @ 17.7), `odoo demo online` (20 @ 17.5); affiliate clicks from utm_campaign=demo-odoo | position 13-18 → page 1; first demo-intent clicks | pending (GSC 2-4 weeks) | keep | | 11 | 2026-10-24 | `3cc048a`: `/odoo-hosting/` turned from a 100-link directory into a decision page — plan table with verified prices, six pre-purchase checks, one CTA | It ranked 41.1 for `odoo hosting` while its own child `/odoo-hosting/instalar-odoo-hosting-guia-completa-2025/` held position 9.5: the hub answered 'here are 100 guides' to a query that means 'where do I run this and what does it cost' | position for `odoo hosting` and `hosting odoo`; affiliate clicks from utm_campaign=hosting-hub-2027 | 41 → page 2, then 1 | pending (GSC 4-6 weeks) | keep | -| 12 | 2026-10-24 | `abe6d5e`: new `/de/odoo-beratung/` — German consulting page, written in German, opening with when NOT to hire a consultant | 227 impressions of German consulting intent (`odoo beratung` 163 @ 51.4, `odoo berater` 28 @ 47, `odoo erp beratung` 13 @ 45.8) were all landing on `/de/`, a homepage that cannot win a head term. German section: 439 impressions, 0 clicks | position and CTR for `odoo beratung` and `odoo berater`; affiliate clicks from utm_campaign=de-odoo-beratung | 51 → page 2, then 1; first German clicks | **Measured:** visitors +9 (2→11), pageviews +16 (3→19), impressions +594 (4745→5339). Traffic jump confirms the page is working. GSC ranking data needs 2-4 weeks to re-crawl. | keep | +| 12 | 2026-10-24 | `abe6d5e`: new `/de/odoo-beratung/` — German consulting page, written in German, opening with when NOT to hire a consultant | 227 impressions of German consulting intent (`odoo beratung` 163 @ 51.4, `odoo berater` 28 @ 47, `odoo erp beratung` 13 @ 45.8) were all landing on `/de/`, a homepage that cannot win a head term. German section: 439 impressions, 0 clicks | position and CTR for `odoo beratung` and `odoo berater`; affiliate clicks from utm_campaign=de-odoo-beratung | 51 → page 2, then 1; first German clicks | **Measured (2026-10-31):** page has **0 impressions / 0 rows** in GSC five days after launch; `/de/` and `/de/odoo/` link to it. Earlier note in this row claimed a +9 visitor jump "confirms the page is working" — withdrawn: Plausible cannot attribute those visitors to this URL, and GSC shows no impressions. | keep, re-measure | | 13 | 2026-10-26 | `f2f19fe`: `/en/odoo-hosting/` rebuilt as decision page — price table ($214/$395/$595/>$950), six pre-purchase checks, trial CTA with utm_campaign=hosting-hub-2027-en | The EN hosting hub ranked for 'odoo hosting' but answered nothing above the fold — a directory of links, not a decision. Adding a price table, 6 checks, and trial CTA will answer 'where do I run this and what does it cost' and lift position | position for 'odoo hosting' / 'hosting odoo' in EN; affiliate clicks from utm_campaign=hosting-hub-2027-en | 51 → page 2, then 1; first EN affiliate clicks | pending (GSC 4-6 weeks) | keep | --- diff --git a/growth/reports/seo-2026-10-31.html b/growth/reports/seo-2026-10-31.html new file mode 100644 index 0000000..8c336dd --- /dev/null +++ b/growth/reports/seo-2026-10-31.html @@ -0,0 +1,257 @@ + + + + + + +SEO report — odoo-expertos.com — 2026-10-31 + + + +
+ +
+
SEO report
+

odoo-expertos.com

+
2026-10-31 · week 14 · Search Console range 2026-01-01 → 2026-10-30
+
+ website_stats.py — Plausible + GSC + audit_site.py + git log + live curl checks +
+
+ +
+ The number that matters: 8 clicks from 5,399 impressions (0.15% CTR), and the + money cluster (79 hosting query rows, 772 impressions) earns 3 of them at position 37.1 — still + nothing arriving at the host with intent. Clicks are one lower than last week's + snapshot on a range that grew by six days: Search Console restated historical clicks, so this is + not a loss, but it is also not growth. The real movement is technical: broken internal links + 1,370 → 0 and relative canonicals 23 → 0, both confirmed by a full audit. Six planned changes + shipped between 10-24 and 10-26 and every ranking verdict on them is still inside the 2–6 week + re-crawl window — including the German consulting page and the EN hosting hub, which have + 0 impressions each in GSC so far. +
+ +
+
Impressions
5,399
+654, but the range grew 6 days
+
Clicks
8
last week 9 — GSC restatement
+
CTR
0.15%
page 1 would be 1.5%+
+
Avg position
30.3
money cluster 37.1
+
Plausible visitors
35
36 visits · 49 pageviews
+
Affiliate clicks
n/a
still no goal configured
+
+ +

Scorecard

+

Last week's column is read from the seo-metrics JSON of growth/reports/seo-2026-10-24.html, not recomputed. Both columns come from the same GSC export shape — a cumulative range starting 2026-01-01 — so impressions gains include six extra days of history and are not period-over-period growth.

+ + + + + + + + + + + +
MetricLast weekThis weekChange
GSC impressions4,7455,399+654 — range extended, not a trend
GSC clicks98−1 on a longer range: GSC restated past clicks
GSC CTR0.19%0.15%denominator up, clicks down
Average position24.730.3584 query rows vs 447 — wider tail counted
Money cluster (hosting*)27.537.179q · 772 impr · 3 clicks (was 33q · 538 · 1)
Plausible visitors23535 visits · 49 pageviews — 15 visitors this week
Affiliate clicksn/an/agoal block still returns only Visit /
+

Affiliate clicks remain unmeasured, not zero. The event:goal block lists one page goal (Visit /, 2 visitors) and no Affiliate Click — the custom event may be firing without a configured goal, and no read access to Plausible exists here to check. Revenue is not reported in this document.

+ +

What shipped

+ + + + + + + + + + + + +
CommitChangeMetric it was meant to move
f2f19fe 10-26/en/odoo-hosting/ rebuilt as a decision page: price table, six pre-purchase checks, trial CTAposition for odoo hosting; EN affiliate clicks
abe6d5e 10-25New /de/odoo-beratung/ in German, opening with when not to hire a consultantposition + CTR for odoo beratung
3cc048a 10-25/odoo-hosting/ turned from a link directory into a plan/price decision pageposition for odoo hosting, hosting odoo
0ea414b 10-25Demo page: 4,832 words of invented narration → three real ways to try OdooCTR on demo odoo at position 13.6
9fff72d 10-25Page owning odo ia rewritten around a three-layer definitionCTR on 6 odo ia queries, 292 impressions at 6.5
e3883d5 10-25Six 2027 country pages (BO, HN, GT, CL, MX, PY) on verified localisation factsclicks on odoo bolivia / odoo honduras
582a93e 10-241,370 broken internal links → 0; PT stub removed with sitemap and hreflang blocks; 23 relative canonicals made absoluteaudit counts; crawl paths
689bcaf 10-24Fabricated testimonials, ISO/SOC badges and placeholder phone removed from the six homepagesguardrail: impressions must not fall
+ +

Verdicts on last week's actions

+ + + + + + + + + + + + +
ActionVerdictEvidence
1. Create Affiliate Click / Outbound Click goalsnot doneGoal block returns only Visit /, 2 visitors. The north-star metric is still unreadable.
2. Rewrite title + meta for the page-1 zero-click queriesflat17 rows still earn 0 clicks on 1,034 impressions (was 1,090). Cumulative range means no clean before/after; snippet work shipped 2e0882d.
3. Strip fabricated testimonials, ISO/SOC badges, placeholder phonekeptShipped 689bcaf. Guardrail holds: no impression collapse visible, but the range also grew, so this proves nothing yet.
4. Consolidate the ~40 near-duplicate hosting pages per localenot startedodoo hosting 35.4 and hosting odoo 38.4 — both still page 4. Weeks 8–10 were used for country pages instead.
5. Fix the remaining 1,370 broken internal links (679 targets)movedaudit_site.py: broken_internal_count 1,370 → 0, missing_assets_count 0.
6. Fix the odoo experts brand queryflat85 impressions at 15.4 and 0 clicks across 4 rows (was 75 at 13.7, 0 clicks).
7. Fill or remove the 0-byte PT pagedoneFile gone, no longer in sitemap-pt.xml, live URL returns 404 (was 200 with an empty body).
8. Resolve relative canonicals and missing canonicalsmovedRelative canonicals 23 → 0. Pages without a canonical 18 → 2 (audit; one is the deliberate 404 page).
+ +

Technical health

+ + + + + + + + + + + + + +
ItemLast weekThis weekNotes
Broken internal link occurrences1,3700audit broken_internal_count
Unique broken targets6790full scan
Relative canonicals230head-scanned across all pages
Pages without a canonical1821 is the deliberate 404 page
Canonicals pointing at a 40400no regression
hreflang pages31731726% of 1,208 pages — unchanged
Pages with exactly one H1—1,190 / 1,20818 pages break the one-H1 rule
Sitemap URLs1,1911,197+6 country pages
HTML pages1,2021,208+6 country pages, −1 PT stub
+

Everything above is from audit_site.py run against the working tree at HEAD 5eaadd9. Pages without a description: 1. Duplicate titles and descriptions: 0. Images without alt: 0. Orphan assets: 10 (unreferenced files, no SEO effect).

+ +

Ranking opportunities

+ +

Page 1, zero clicks — 17 queries, 1,034 impressions

+ + + + + + + + + + + + + + + + +
QueryImpressionsPositionClicks
odo ia2926.50
odoo de donde es1445.30
de donde es odoo1115.20
odoo honduras779.30
.odo ia567.40
odoo origen558.10
odoobot que es478.80
odoo de que pais es367.10
,odo ia356.80
odoo experts269.30
odo ia248.00
odoo inmobiliaria239.40
+

Selection rule: position ≤ 10, clicks 0, impressions ≥ 20, on the (query, page) rows GSC returns. 1,034 impressions with 0 clicks; at 1.5% CTR that would be about 15 clicks; the failure is the snippet, not the ranking.

+ +

Positions 8–20 — 18 rows, 695 impressions, 2 clicks

+ + + + + + + + + +
ClusterQueriesImpressionsClicksAvg posExample
LatAm2100010.8odoo honduras 77 @ 9.3
Brand / company4176011.8odoo origen 55 @ 8.1
AI / Odoo IA5170010.7odoo ia 55 @ 12.2
Demo296114.7demo odoo 72 @ 13.6
Hosting / deployment286112.1cloudpepper 47 @ 11.2
+

Head terms to watch: odoo hosting 360 impr · 35.4 · 1 click (was 298 · 31.5); hosting odoo 222 · 38.4 · 0 (was 85 · 28.5); odoo beratung 187 · 52.3 · 0 (was 155 · 51.5). Row counts grow because the export now returns a page dimension per query.

+ +

Action items

+ +
+

1Create the two Plausible goals

+

Nothing in this report can be tied to commission until Affiliate Click exists as a goal. One dashboard setting, no code. Proves it: the event:goal block returns Affiliate Click with non-null events. This is the third week it has been open.

+
Effort Sunscheduledmetric: goal rows ≠ null
+
+ +
+

2Get the two new money pages out of zero impressions

+

/en/odoo-hosting/ and /de/odoo-beratung/ both return 200, sit in their sitemaps, and have 0 rows and 0 impressions in GSC five days after launch. Confirm indexation in GSC URL Inspection, then add in-language internal links from the locale home and the locale odoo/ hub. Note: the week-12 log claims a +9 visitor jump "confirms the page is working" — the page-level GSC data does not support that; the jump is not attributable to it.

+
Effort Sfinishes PLAN weeks 14–16metric: impressions > 0 on both URLs
+
+ +
+

3Fix the snippet on the two biggest zero-click pages

+

/odoo/empresa-odoo-historia-fundacion-2025/ — 608 impressions at 7.6, 0 clicks — and /odoo-ia/que-es-odoo-ia-guia-basica-2025/ — 472 at 7.7, 0 clicks. Together 1,080 impressions and zero clicks: a title/description problem, not a content problem. Proves it: clicks on those two URLs (currently 0).

+
Effort SPLAN weeks 3–6 follow-throughmetric: clicks on those URLs
+
+ +
+

4Stop /odoo-hosting/ losing to its own children

+

The hub holds 243 impressions at position 50.0 with 1 click; /odoo-hosting/instalar-odoo-hosting-guia-completa-2025/ holds odoo hosting at 13.2. The rework did not lift the hub — it fell from the 41.1 the plan recorded. Consolidate the ES children that carry no clicks, 301 them into the hub, then re-measure. Proves it: hub position for odoo hosting.

+
Effort LPLAN weeks 8–10, still openmetric: hub position, currently 50.0
+
+ +
+

5Decide hreflang or drop it

+

317 of 1,208 pages carry hreflang (26%), unchanged for two weeks, while some pages still canonicalise cross-locale. Either annotate the clusters that need it (the six locale homes plus both hosting hubs) or leave it alone deliberately — but an accidental 26% is a signal nobody owns. Proves it: hreflang page count reaching a stated target, not drifting.

+
Effort Munscheduledmetric: hreflang pages by design
+
+ +

Open risks

+ + +
+ Next review: 2026-11-07 — first run where the 10-25/10-26 changes are 10+ days old.
+ Generated by the seo Hermes profile from live tool output. No estimated or invented figures. +
+ +
+ + +