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

183 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.