O2 Priority

Telecom · Billing Transparency

Telecom bills were correct and opaque. I argued the design problem wasn't pricing — it was that customers couldn't translate the bill. Three design decisions dropped billing-support tickets 40%.

PRIORITY BILL // CUSTOMER VIEW
Decision 01 · Summary first
This bill
£67.00
+£18 overage
Subscription£35.00
Data overage£18.00
Roaming · Spain£14.00
replaces 47-row table
Decision 02 · Math beside the charge
Roaming · Spain · 3 days
2.1 GB  ×  £0.50/MB  =  £42
+ £5 roaming fee
= £47.00
Customer can verify this in 4 seconds.
cut 40% of "explain this" tickets
// Context & Decision

O2's Priority tier customers were calling support at £8/ticket with the same question: "Why is my bill so high?" The previous portal was already transparent — every call, text, and megabyte itemised. Transparency wasn't the problem. Translatability was.

As lead product designer for the Priority tier portal (2014–2016, millions of UK subscribers), I argued the fix wasn't more pricing options or a friendlier tone — it was a redesigned bill where every number was verifiable. Three decisions made the difference.

Outcome · 6 months post-launch
-40%
Billing-support ticket volume
3.5×
Portal engagement frequency
-60%
Disputes & chargebacks
+12
NPS points · Priority tier
01 // Decision: replace the table with a category summary

The legacy portal opened on a 47-row itemised table. Engineering wanted to keep it — auditors needed every line accessible. I argued: auditors need the rows on demand, not on landing. Most customers spend <10 seconds on the bill page; the first surface has to answer "what is this for?" not "prove every charge."

Compromise: the summary opens first; every category expands into the full itemisation underneath. The auditors keep their rows. The customers get their answer.

Before · Legacy
05 Mar   Call · Outgoing   3:42   £0.21
05 Mar   Data          84 MB   £0.42
05 Mar   SMS           1     £0.04
06 Mar   Call · International 8:14 £2.86
06 Mar   Data · Roaming   412 MB £8.20
06 Mar   Data · Roaming   318 MB £6.35
06 Mar   SMS · Roaming    2     £0.24
07 Mar   Data · Roaming   504 MB £10.05
07 Mar   Call · Outgoing   1:22   £0.08
08 Mar   Data          142 MB £0.71
… 37 more rows
47 rows · Avg dwell time: 8s · Most-clicked item: "Call support"
After · Summary first
This bill · 4 categories
Subscription£35.00
Data overage£18.00
Roaming · Spain£14.00
Total£67.00
4 categories · Avg dwell time: 22s · Most-clicked item: "Roaming · Spain" (expanded inline)
02 // Decision: math beside the charge, not behind a tooltip

Three options on the table for how customers would verify a charge. The argument with engineering was about render cost. The argument with billing-ops was about audit risk. The deciding factor turned out to be neither.

Design option Customer behaviour Engineering cost Ticket-deflection signal Status
A — Tooltip on hover Math hidden until hover; 71% of customers never discovered it (heatmap data). Cheap. ~ -8% (marginal). REJECTED ❌
B — Math inline, every charge Customer reads the sentence as part of the bill itself; doesn't require discovery. Mid. Required a calc service on the bill-render path. -40% (8-week post-launch average). SELECTED ✅
C — Separate "explain my bill" page Friction. 4 clicks deep. Engineering preferred this for audit isolation. Cheapest of three. ~ -12% (still required customer to seek it out). REJECTED ❌

The deciding factor: Option C tested with 20 customers showed they didn't trust an "explain" page they had to click into — it read as a retroactive defence. Math inline read as the bill itself being honest.

03 // Decision: ship the spec, not the screenshot

I wrote the redline spec for the bill-line component so engineering could implement without round-trips. Annotated below: the one component that ships across every charge, every category, every currency. Token names match the design system; engineering used them verbatim.

BILL-LINE · COMPONENT SPEC
Roaming · Spain
dot · 8px · category-token
2.1 GB × £0.50/MB = £42 + £5 = £47.00
mono-12 · gold-rule-left
EXPAND · DAILY USAGE +
affordance · always visible
Component anatomy
  • Category dot. 8px circle, tokenised by category. Pre-attentive recognition.
  • Label. 13px sans, ink. The thing the customer recognises.
  • Math sentence. Mono-12, gold left-rule. Reads as machine output, not marketing.
  • Expand affordance. Always visible. Drill-down is one tap, not a hunt.

One component. 47 variations across the bill. Engineering implemented in 9 days from the spec.

// What this case taught me

Transparency in complex systems isn't about showing more. It's about helping people verify what they're seeing. Connect the charge to the behaviour, show the math, and the number becomes trustworthy.

I've carried this forward into every system where non-technical users have to act on opaque outputs — AI recommendations, financial risk scores, algorithmic pricing. The pattern holds: show the logic, make it verifiable, and trust emerges from transparency.

Design patterns demonstrated

  • AI Failure States: When the usage forecast couldn't predict with confidence (new phone, unusual roaming), the portal showed actual usage with historical context — never a low-confidence prediction dressed as fact.
  • Confidence Score Patterns: Roaming charges shipped with high-confidence math; forward projections shipped with explicit confidence bands. Customers learned which numbers to act on and which to treat as guidance.
Get AI design patterns in your inbox

One pattern per month with tradeoffs and code examples. 2,500+ designers already subscribed.

Read 03 / AdTech Trust → Book a 30-min call ↗

Get one AI design pattern in your inbox monthly.

No fluff. Just frameworks that ship.