How we score keywords
Every keyword gets a composite score between 0 and 1. The formula is calibrated, transparent, and applied identically to every site. Here it is, with every lookup table and a full worked example.
Score = 0.25·CTR_gap
+ 0.15·Intent_norm
+ 0.25·SERP_Weakness
+ 0.25·Position_Accessibility
− 0.10·Effort_normWorked example
Throughout this page we score a single real-world keyword end-to-end:
- Keyword
- échafaudage roulant 3m
- GSC position
- 12
- GSC CTR
- 0.008 (0.8%)
- Intent
- commercial
- Content type
- service_detailed (500–1500 words)
- Top-10 SERP
- 2 directories, 1 article (2022)
CTR gap
weight: 25%Is the page under-performing the CTR its position predicts?
We compare the actual CTR reported by Google Search Console to the expected CTR for that position (desktop, Google FR benchmarks). The gap is normalized by the maximum possible gap — the expected CTR at position 1 — so it lands in [0, 1].
When actual CTR matches or exceeds expected, the gap is 0 — the keyword is already converting. When it's far below expected, the signal lights up: the snippet, title, or rich-result coverage is leaving clicks on the table.
| 1 | 0.30 |
| 2 | 0.20 |
| 3 | 0.15 |
| 4–5 | 0.08 |
| 6–10 | 0.04 |
| 11–20 | 0.015 |
| > 20 | 0.005 |
position = 12 → expected_CTR = 0.015
gap = max(0.015 − 0.008, 0) = 0.007
CTR_gap = 0.007 / 0.30 = 0.02
CTR_gap = 0.02Intent
weight: 15%Does the keyword express commercial or transactional intent?
Transactional and commercial queries drive revenue; informational queries drive traffic. We weight them accordingly using DataForSEO's intent classification. This is the smallest weight in the formula — intent modulates priority but never dominates it.
| informational | 0.00 |
| navigational | 0.25 |
| commercial | 0.70 |
| transactional | 1.00 |
intent = commercial → Intent_norm = 0.70
Intent_norm = 0.70SERP weakness
weight: 25%How weak is the top-10 competition?
A SERP dominated by directories, outdated articles, video-only results, or pages missing the keyword from their title is a vulnerable SERP. We scan the top 10 and sum signed weights — capped to [0, 1]. High-authority domains (DR > 50) subtract from the score: they are hard to displace regardless of snippet weakness.
| Directory / local pack / compare-sites | +0.25 |
| Video result | +0.20 |
| Article > 2 years old | +0.15 |
| Keyword missing from title | +0.10 |
| Local-pack dominant SERP (≥3 packs) | +0.10 |
| Domain rank > 50 | −0.15 |
+0.25 (directory #1)
+0.25 (directory #2)
+0.15 (article from 2022, > 2 years)
────────────────────────
SERP_Weakness = 0.65
SERP_Weakness = 0.65Position accessibility
weight: 25%How reachable is the top-3 from the current position?
Page 1 positions 4–10 are the sweet spot: on-page work alone is usually enough to climb. Positions 1–3 already captured most of the traffic upside, so we down-weight them. Positions > 50 are ignored for short-term triage — they require backlinks or new content.
| position ≤ 3 (already won) | 0.20 |
| position ≤ 10 (sweet spot) | 1.00 |
| position ≤ 20 (page 2) | 0.80 |
| position ≤ 50 (needs backlinks) | 0.40 |
| position > 50 (out of reach) | 0.10 |
position = 12 → 12 ≤ 20 → Position_Accessibility = 0.80
Position_Accessibility = 0.80Effort
weight: −10%How expensive is the content needed to compete?
This is the only negative weight: heavier content formats subtract more from the score. A service page rewrite is cheap; a 3,000-word guide is not. Effort caps the enthusiasm when two keywords look equally winnable but one costs five times as much to ship.
| service_page (< 500 words) | 0.10 |
| service_detailed (500–1500 words) | 0.30 |
| article (1500–3000 words) | 0.50 |
| comprehensive_guide (3000+ words) | 0.80 |
content_type = service_detailed → Effort_norm = 0.30
Effort_norm = 0.30Composite score
Multiply each normalized signal by its weight, subtract the effort term, and read the result against the tier thresholds.
Score = 0.25·0.02
+ 0.15·0.70
+ 0.25·0.65
+ 0.25·0.80
− 0.10·0.30
= 0.44Score Breakdown
A score of 0.44 lands in the Opportunity tier — plan for it, not immediate. The thresholds, fixed in product logic:
| score ≥ 0.50 | Quick Win — act this week |
| score ≥ 0.30 | Opportunity — plan for it |
| score ≥ 0.15 | Monitor — watch it |
| score < 0.15 | Not actionable — ignore |
Calibration
The weights and lookup tables were calibrated on March 25, 2026 against the level-echafaudage.com dataset (DR 5, FR market, 1,200+ ranking keywords). The formula is identical for every site we score — we do not tune per-account.
Data sources: Google Search Console (real CTR and position via read-only OAuth), DataForSEO (SERP composition, search volume, intent classification, content age). No third-party scoring black-boxes.
AI Overview penalty: when the SERP contains an AI Overview block, the composite score is multiplied by 0.85 — a 15% haircut reflecting the click suppression we measured on impacted queries.
The scoring functions are deterministic and pure. Same inputs, same score, always.
Run your own site through this formula
Drop a domain in — we'll score every keyword using the exact formula above and show you the Quick Wins, Opportunities, and At Risk pages in under a minute.
Run your audit →