2026-07-27-seo-audit.md
countries/tn/reports/2026-07-27-seo-audit.md
SEO Audit — tunisie-electricite.com — 2026-07-27
Diffed against reports/2026-07-03-seo-audit.md. git log origin/develop --since=2026-07-03 -- sites/tunisie-electricite.com departments/tunisia-energy returns nothing — none of the 13 static pages or annuaire templates changed since the last audit, so those scores carry forward unchanged (re-verified live, not just assumed). However, this run expanded scope to the /coupures/{gouvernorat} and /coupures/{gouvernorat}/{municipality} power-outage pages (feature a288f76624, merged 2026-06-29) — never audited before — and found a major, high-leverage gap. See §5.
1. Live site health
All 16 checked URLs returned 200 OK, 0.13–0.38s:
| URL | Status | Time |
|---|---|---|
/, /tarifs, /tarifs-gaz, /steg, /coupures, /annuaire, /sitemap.xml, /robots.txt |
200 | 0.15–0.33s |
/steg/coupures, /steg/facture, /steg/numero-vert, /steg/raccordement, /steg/raccordement-gaz, /steg/service-client, /steg/solaire, /mentions-legales |
200 | 0.14–0.38s |
No availability issues. robots.txt correctly allows /coupures/* and references the sitemap.
2. Page audits (13 static pages, re-verified live — scores unchanged since 07-03)
| Page | Score | Note |
|---|---|---|
/tarifs |
95 | title 65, meta 140 |
/tarifs-gaz |
93 | title 64, meta 159 |
/coupures |
92 | title 66, meta 156 |
/steg |
91 | title 52, meta 157 |
/steg/numero-vert |
90 | title 57, meta 148 |
/steg/service-client |
88 | title 61, meta 146 |
/steg/facture |
87 | title 56, meta 153 |
/steg/raccordement |
86 | title 56, meta 149 |
/steg/raccordement-gaz |
84 | title 76 chars (>65), unresolved 2 runs in a row |
/mentions-legales |
82 | meta 159, low-priority legal page |
/steg/solaire |
82 | title 71 chars (>65), unresolved 2 runs in a row |
/steg/coupures |
80 | still no on-page schema beyond breadcrumb |
/ (homepage) |
76 | title 56, meta 148 (both fine) — still the only static page with zero structured data |
Directory templates (/annuaire/*, 1 + 24 + 261 = 286 pages): unchanged, ~85/100, BreadcrumbList confirmed present.
3. Directory spot-check
/annuaire/sfax, /tunis/carthage, /annuaire — all 200, unique title/H1, BreadcrumbList present. /tunis/carthage title correctly appends the postal code ((2016)) — verified against the template, not a bug.
4. Fix-tracking — 2 items from 07-03 report still open, unchanged
- Homepage has 0 structured data (no Organization/WebSite JSON-LD) — still open, 2nd run flagged.
/steg/raccordement-gaz(76 chars) and/steg/solaire(71 chars) titles still over the 65-char guideline — still open, 2nd run flagged.
ogImage site-wide (0 pages) and FAQ accordions on 5 /steg/* pages — still open, 3rd run flagged, unchanged.
5. New finding — power-outage pages (/coupures/{gouvernorat}[/{municipality}])
These 374 pages (24 governorate + 350 municipality, feature merged 2026-06-29, never audited before) are directly relevant to the outage/délestage search demand flagged as opportunity #1 in the 2026-07-15 business review. They are well-built (invokable controllers — cacheable, live outage feed, BreadcrumbList + FAQPage JSON-LD, internal cross-links, og:title/og:description present) but have two systemic, template-level issues:
a) Title and meta description exceed length guidelines on 100% of pages — a single hardcoded template string in each Blade file, computed precisely ([...string].length, not byte count):
| Template | Pages | Title length | Meta length |
|---|---|---|---|
coupures/_gouvernorat.blade.php |
24 | 66–73 chars (guideline ≤65) | 167–174 chars (guideline ≤160) |
coupures/_municipalite.blade.php |
350 | 66–106 chars | 166–207 chars |
Worst outliers are municipalities with compound names, e.g. "El Achech Boujarboue El Aouadna Majel Eddarj (Sfax)" → 106-char title, 207-char meta. Since the string is built from one template per file, fixing 2 files fixes all 374 pages — this is the single highest-leverage mechanical fix currently available on the site (374 pages vs. 2 for the static-page title outliers).
b) None of the 374 pages are in sitemap.xml. sites/tunisie-electricite.com/config/sitemap.php has explicit generators for /annuaire (1+24+261) but no generator was added for /coupures/{gouvernorat} or /coupures/{gouvernorat}/{municipality} when the outage feature shipped — confirmed by reading the config (comment even explains why /annuaire/* needed manual generators: underscore-prefixed templates bypass auto-discovery; the same underscore-prefixed pattern applies to coupures/_gouvernorat.blade.php and coupures/_municipalite.blade.php but was never added). Live check: grep -c '/coupures/' sitemap.xml → 0. Given these pages exist specifically to capture outage-related search demand — and the business review flagged a live outage crisis as the top opportunity this month — missing sitemap entries directly delay/reduce discovery and indexing of exactly the pages built to capture that demand. Fix is mechanical: add two generator closures to config/sitemap.php reading departments/tunisia-energy/data/outage-governorates.php and outage-municipalities.php, mirroring the existing /annuaire generators.
Top actions (ranked by impact/effort)
- [Mechanical] Add
/coupures/{gouvernorat}and/coupures/{gouvernorat}/{municipality}tositemap.xml— 374 pages currently undiscoverable via sitemap, directly tied to this month's #1 business opportunity (outage crisis). 2-generator-function fix inconfig/sitemap.php. - [Mechanical] Shorten the title/meta template strings in
coupures/_gouvernorat.blade.phpandcoupures/_municipalite.blade.php— 100% of 374 pages exceed both guidelines; worst cases (106/207 chars) will truncate badly in SERPs. Drop the" : signaler et suivre en direct (STEG)"suffix pattern to something shorter, and shorten the meta template sentence. - [Mechanical] Add Organization/WebSite JSON-LD to the homepage — only static page with zero structured data, flagged 2 runs running.
- [Mechanical] Trim the 2 static-page title outliers:
/steg/raccordement-gaz(76 chars) and/steg/solaire(71 chars) — flagged 2 runs running, same low-effort pattern already applied elsewhere. - [Non-mechanical] ogImage site-wide (0 pages, static AND now confirmed also 0/374 on outage pages) — flagged 3rd run in a row now, needs image generation, not a quick text edit; worth escalating to a dedicated
/generate-article-imagepass rather than re-flagging weekly.
Still open, out of scope for this read-only skill: the Closure-route route:cache issue in sites/tunisie-electricite.com/routes/web.php (/annuaire, /annuaire/{gouvernorat}, /{gouvernorat}/{delegation}, /{gouvernorat} still Closures) — flagged 4 runs running now. Note: the newer outage routes (/coupures/{gouvernorat}, /coupures/{gouvernorat}/{municipality}) were correctly built as invokable controllers, so this is not spreading — it's an isolated legacy debt in the original directory feature.
Chain decision
5 mechanical items found (≥2 threshold). Checked gh pr list --state open --search "countryos/tn" --json title,headRefName,url → no open seo-fixes PR. Triggering countryos-trigger tn:seo-fixes implement the mechanical items from today's audit report.