2026-07-03-seo-audit.md
countries/tn/reports/2026-07-03-seo-audit.md
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
- Meta descriptions ≤160 chars — ✅ confirmed. Measured all 13 with a node script (repo has no python3): all now 140–159 chars. Was 163–224.
- BreadcrumbList JSON-LD on the 3 annuaire templates — ✅ confirmed.
_index,_gouvernorat,_delegationall carry it now (spot-checked live on 3 delegation pages + 1 governorate page, see §3). - Contextual body links added to thin pages — ✅ confirmed. Non-nav
hrefcounts in body:/steg/coupures5,/steg/solaire4,/steg/raccordement-gaz4,/steg/service-client5 (all were ≤1 before). - Homepage links to core sections — ✅ confirmed.
/now links to/steg,/tarifs,/tarifs-gaz,/coupuresin body copy. - Outlier titles shortened +
/tarifs-gazbreadcrumb parity — ✅ confirmed./stegtitle 85→52 chars,/steg/coupurestitle 87→50 chars./tarifs-gaznow has the sameBreadcrumbListas/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)
- 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, theOrganizationschema already exists on/stegand can be adapted or aWebSiteschema added. - 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/stegand/steg/coupureslast week. - ogImage site-wide (nice-to-have, unchanged since last report): still 0 pages have one — social share previews are blank across the entire site.
- 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/solairehave natural Q&A content but no FAQ block. - Routing hygiene, still open (out of scope for this skill, flagged 3
runs in a row now):
sites/tunisie-electricite.com/routes/web.phpdefines/annuaire,/annuaire/{gouvernorat},/{gouvernorat}/{delegation}and/{gouvernorat}as Closures, which disablesroute:cacheplatform-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.