0% 5h quota used · resets in 2h live · 08/09/2026 12:12 CEST

2026-07-03-seo-audit.md

countries/tn/reports/2026-07-03-seo-audit.md

seo-audit tn written 03/07/2026 19:42 ← previous seo-audit next seo-audit →

SEO Audit — tunisie-electricite.com — 2026-07-03

Diffed against reports/2026-07-02-seo-audit.md. In between, PR #8895 (countryos/tn/2026-07-02-seo-fixes, 4 commits) was merged to develop (2026-07-02T20:55 UTC), implementing all 5 top actions from that report. This run verifies the fixes live and re-measures everything precisely (node script — do not eyeball lengths, per prior lesson) rather than trusting the old table.

1. Live site health

All 16 checked URLs returned 200 OK, response times 0.04–0.08s (faster than last week's 0.1–1.0s reads — no anomalies, likely just cache warmth):

URL Status Time
/, /tarifs, /tarifs-gaz, /steg, /coupures, /annuaire, /sitemap.xml, /robots.txt 200 0.04–0.08s
/steg/coupures, /steg/facture, /steg/numero-vert, /steg/raccordement, /steg/raccordement-gaz, /steg/service-client, /steg/solaire, /mentions-legales 200 0.04–0.07s

No critical availability issues.

2. Fix verification — all 5 top actions from last report confirmed live

  1. Meta descriptions ≤160 chars — ✅ confirmed. Measured all 13 with a node script (repo has no python3): all now 140–159 chars. Was 163–224.
  2. BreadcrumbList JSON-LD on the 3 annuaire templates — ✅ confirmed. _index, _gouvernorat, _delegation all carry it now (spot-checked live on 3 delegation pages + 1 governorate page, see §3).
  3. Contextual body links added to thin pages — ✅ confirmed. Non-nav href counts in body: /steg/coupures 5, /steg/solaire 4, /steg/raccordement-gaz 4, /steg/service-client 5 (all were ≤1 before).
  4. Homepage links to core sections — ✅ confirmed. / now links to /steg, /tarifs, /tarifs-gaz, /coupures in body copy.
  5. Outlier titles shortened + /tarifs-gaz breadcrumb parity — ✅ confirmed. /steg title 85→52 chars, /steg/coupures title 87→50 chars. /tarifs-gaz now has the same BreadcrumbList as /tarifs.

3. Page audits (rescored /100)

Page Score Δ Rating Note
/tarifs 95 +6 Excellent meta now 140 chars
/tarifs-gaz 93 +17 Excellent breadcrumb added, meta 159
/coupures 92 +5 Excellent meta 224→156
/steg 91 +9 Excellent title 85→52, meta 157
/steg/numero-vert 90 +7 Excellent meta 189→148
/steg/service-client 88 +13 Good body links 1→5, meta 146
/steg/facture 87 +13 Good meta 201→153
/steg/raccordement 86 +15 Good meta 197→149
/steg/raccordement-gaz 84 +14 Good body links 1→4, meta 154; new: title 76 chars (>65)
/mentions-legales 82 +10 Good meta 159 (low-priority legal page)
/steg/solaire 82 +17 Good body links 0→4; new: title 71 chars (>65)
/steg/coupures 80 +22 Good body links 0→5, title 87→50; still no on-page schema beyond breadcrumb
/ (homepage) 76 +11 Good 4 core links added; still no schema at all (Organization/WebSite)

Directory templates (1 + 24 + 261 = 286 generated pages): now carry BreadcrumbList JSON-LD — estimated ~85/100 each (+10 from last week).

New minor finding (title length): two titles now exceed the 65-char guideline — /steg/raccordement-gaz (76 chars) and /steg/solaire (71 chars). Neither was touched by the fix PR; low severity (doesn't truncate as badly as the old 85–87-char titles, but still risks SERP truncation).

Internal links: re-checked every static href="/..." against the live page list — zero broken internal links.

4. Directory spot-check

Tested 3 delegation pages (nabeul/hammamet, le-kef/nebeur, medenine/houmet-essouk) plus one governorate page (annuaire/sfax) — all 200, unique title/meta/H1, and BreadcrumbList JSON-LD present (confirmed via grep -c BreadcrumbList on the rendered HTML — 1 match each).

Note for future runs: I initially requested /kef/nebeur and got a false 404 — the governorate slug is le-kef, not kef (per departments/tunisia-energy/data/governorates.json). Confirms the standing lesson: verify slugs against the data file before treating a 404 as real. Also confirmed by reading routes/web.php: /{gouvernorat} alone (no delegation) 301-redirects to /annuaire/{gouvernorat} by design — the /sfax/annuaire/sfax redirect is not a bug, it's the canonical-URL route.

Top actions (ranked by impact/effort)

  1. Add Organization/WebSite JSON-LD to the homepage. It's the only static page with zero structured data (every /steg/* page has at least a BreadcrumbList). Low effort, the Organization schema already exists on /steg and can be adapted or a WebSite schema added.
  2. Trim the 2 new title outliers: /steg/raccordement-gaz (76 chars) and /steg/solaire (71 chars), to under ~65. Same low-effort pattern already applied to /steg and /steg/coupures last week.
  3. ogImage site-wide (nice-to-have, unchanged since last report): still 0 pages have one — social share previews are blank across the entire site.
  4. FAQ <x-accordion :schema> on more /steg/* pages (nice-to-have, unchanged): only /tarifs, /coupures, /steg/numero-vert (+ the 2 dynamic outage templates) have one; /steg/facture, /steg/raccordement, /steg/raccordement-gaz, /steg/service-client, /steg/solaire have natural Q&A content but no FAQ block.
  5. Routing hygiene, still open (out of scope for this skill, flagged 3 runs in a row now): sites/tunisie-electricite.com/routes/web.php defines /annuaire, /annuaire/{gouvernorat}, /{gouvernorat}/{delegation} and /{gouvernorat} as Closures, which disables route:cache platform-wide per the monorepo's CLAUDE.md. Worth a dedicated task to convert to invokable controllers.

Monitoring (not urgent): /coupures and /steg/coupures still overlap topically (general outage FAQ vs. STEG contact/emergency angle). Titles are now distinct enough (66 vs. 50 chars, different angle) that this reads as low cannibalization risk rather than a live issue — no action needed unless GSC data shows both competing for the same query.