Skip to content
UK Consumer Complaint Index

Methodology — no secret sauce

Here’s exactly how we compute every star and every badge. If you have the same regulator data, you can reproduce every number on this site.

Back to all datasets

What this index is — and isn’t

The UK Consumer Complaint Index is a public, free aggregation of complaint data published by UK regulators and ombudsman schemes. Every figure is verbatim from the source. We do not collect our own complaint data; we do not estimate, model, or interpolate.

The index is a research tool. It tells you how a provider compares to its peers on the metrics the regulator publishes. It does not tell you whether a specific complaint will be upheld, how a regulator will rule on a case, or what compensation you are owed. For that, talk to the regulator directly or use one of NoReply’s free tools.

Data sources

Every metric on the index has a regulator at the bottom of it. Click through to the source — every figure should match.

RegulatorScopeCadenceLicence
OfcomTelecoms — broadband, mobile, pay-TV, landlineQuarterlyOGL v3.0
OfgemEnergy supply (gas + electricity retailers)QuarterlyOGL v3.0
Financial Ombudsman ServicePer-firm uphold rates, case volumes (financial services)Half-yearlyOGL v3.0
Financial Conduct AuthorityPer-firm complaints — banking, insurance, mortgages, investments, creditHalf-yearlyOGL v3.0
Civil Aviation AuthorityAirline passenger complaints, ADR uphold rates & awardsAnnual (+ quarterly snapshots)OGL v3.0
Energy Ombudsman / TPO / CISASPrivate redress schemes — link-out onlyAnnualFair-dealing quote

Composite scoring formula

Each provider gets a composite score between 0 and 1, where 1 is the best in the sector. We compute it in three steps.

Step 1

Normalise each metric within its sector

For every metric we collect, we find the best and worst values published in that sector & period. We then map every provider’s value to a 0-to-1 scale.

  • Lower is better (complaints rates, uphold rate): normalised = 1 − (value − sectorMin) ÷ (sectorMax − sectorMin)
  • Higher is better (resolution speed, next-day resolution): normalised = (value − sectorMin) ÷ (sectorMax − sectorMin)

A note on uphold rate. The Financial Ombudsman publishes the % of complaints resolved in the consumer’s favour. A high uphold rate could mean “this firm gives consumers a fair shake” or “this firm originally rejected lots of valid complaints”. We treat a high uphold rate as a negative signal for the firm, because it means the firm originally rejected a complaint the regulator subsequently agreed with. The raw uphold rate is always shown alongside the composite so you can judge for yourself.

Step 2

Weighted average

Composite = the weighted average of the metrics that exist for this provider × period. Default weights:

  • Complaints rate — 0.5. Direct signal of complaint volume relative to size. Heaviest weight.
  • Uphold rate — 0.3. Complaint-handling quality signal. Capped because a firm with very few complaints can post an extreme uphold rate by chance.
  • Resolution speed — 0.2. Customer-experience signal. Weighted lowest because regulator deadlines (the 8-week rule) compress the spread between firms.

When a metric is missing for a sector (CAA, for example, doesn’t publish a resolution-speed metric), we renormalise the active weights so they still sum to 1.

Step 3

Star rating & tier

Stars: compositeScore × 5, rounded to one decimal. A 0.84 composite renders as 4.2 stars.

Tier: based on rank within sector & period.

  • Rank 1 → Gold
  • Rank ≤ 3 → Silver (top 3)
  • Rank ≤ ceil(rankOutOf × 0.25) → Bronze (top 25%)
  • Score above sector mean → Standard
  • Otherwise → Below average

Worked example

Imagine a four-airline aviation league for 2025 with two metrics: complaints per million passengers (lower is better) and uphold rate (lower is better).

AirlineComplaints / M paxUphold %CompositeStars
Airline A100 (best)20% (best)1.005.0
Airline B30040%0.6253.1
Airline C50060%0.3751.9
Airline D900 (worst)80% (worst)0.000.0

For this two-metric example with no resolution speed, the active weights renormalise to 0.5 / 0.5 + 0.3 / 0.5 = 0.625 / 0.375. Tiers: Airline A → Gold (rank 1), B → Silver (rank ≤ 3), C → Bronze (top 25% with rank ≤ ceil(4 × 0.25) = 1, so this would actually fall to Standard if its score is above the mean — tie-breaking falls to score against sector mean, 0.5 here). The real algorithm in lib/data/regulators/scoring.ts is the source of truth.

Refresh cadence

Each regulator publishes on its own schedule. Crons run after each publication window so figures update within a few days of release.

  • Ofcom — quarterly, mid-week publication
  • Ofgem — quarterly
  • FOS — half-yearly (H1, H2)
  • FCA — half-yearly (H1, H2)
  • CAA — annual + quarterly snapshots from FY25 onwards

If a regulator hasn’t published a fresh dataset within 1.5× the expected cadence, the page shows a banner: “regulator hasn’t published since [date]”. We don’t guess.

Licensing

All Ofcom, Ofgem, FOS, FCA and CAA datasets are released under the Open Government Licence v3.0. That’s why we can republish them. Attribution: source name, URL and licence are surfaced on every metric and on every CSV/JSON download.

Private ombudsman schemes (Energy Ombudsman, The Property Ombudsman, CISAS) are not OGL. We quote headline figures only, link directly to the source, and never include those rows in downloadable datasets or the embed widget.

Spot an error?

Email index@usenoreply.com with the URL and a link to the source. We’ll fix it.

Back to all datasets

All figures sourced from UK regulators under Open Government Licence v3.0 unless noted. Numbers are verbatim from the regulator’s published dataset; composite scores are computed using the public methodology at /data/methodology. Spot an error? Email index@usenoreply.com.