+4.14%
CVR uplift (GB, unified basket)
+4.75%
Margin per transaction (all markets)
+20pts
User comprehension vs control
80%
Users who preferred the new design
The CMA gave UK holiday companies a hard deadline to eliminate drip pricing. Most competitors treated it as a legal problem. We treated it as a product problem.
The outcome: +4.14% CVR uplift, positive margin per transaction, and full regulatory compliance ahead of enforcement. The same approach that failed at −8.9% CVR in its first iteration became the most commercially successful transparency test the team had run.
A regulatory deadline with real teeth.
The UK Competition and Markets Authority introduced rules requiring holiday companies to show total prices — inclusive of taxes and resort fees — from the start of the booking journey. From April 6th 2026, the CMA gained direct enforcement powers, bypassing courts to levy fines of up to 10% of global turnover. Warning letters had already gone to 19 travel companies.
EU legislation placed similar demands on the Netherlands. Dutch rules required dynamic calculation of toeristenbelasting (variable municipal tourist tax) per person per night, with explicit messaging that the charge was required by law.
Booking.com and Expedia were already compliant. Key package holiday competitors were not.
The project initially sat inside a broader “Taxes and Fees” compliance stream. It was paused early due to data quality concerns around hotel fee accuracy from third-party suppliers. The executive team then made a call to reframe it entirely.
A compliant solution that creates a worse customer experience is not acceptable.
That principle changed the scope, the sequencing, and what success looked like.
Three problems hiding inside one brief.
A non-standard payment model
loveholidays operates differently to a pure OTA. Customers pay the base package price to us. Tourist taxes and resort fees are paid separately, directly to the hotel on arrival.
We couldn’t show a single “Total Price” and be done with it. We had to communicate a split payment model clearly, without confusing users who expect “total” to mean what leaves their account today.
A data confidence gap
Tourist tax data at destination level was reliable. Hotel fee data from third-party suppliers was not. That gap had direct IA implications: we couldn’t confidently include hotel fees in a headline total if the figure might be wrong.
A technical constraint hiding a design problem
The checkout and search baskets were two separate, hardcoded components. Any compliance update had to be built, tested, and maintained twice. This wasn’t just an engineering problem — it meant any inconsistency in pricing presentation across the journey was structurally locked in.
The commercial guardrail
The business had one hard constraint: achieve at least flat CVR and MPT while meeting compliance. Early experiments confirmed the risk. Tests that included taxes and fees in the headline price showed CVR drops of −5.8% to −10.82%. We had to find a different approach.
I led design across all three workstreams as principal designer, working across two product squads totalling around 12 people: engineers, PMs, legal, and a researcher.
What I owned:
- The design principles that governed the whole programme
- IA decisions across SRP, basket, and checkout
- The decision to kill the first basket redesign after −8.9% CVR and reframe the approach
- Usability test design, facilitation, and synthesis
- The recommendation to unify the basket component as a prerequisite for consistent transparency work
- Stakeholder presentations at exec level
What the team contributed:
- Product managed the regulatory requirements and CMA timeline
- Engineering built and ran the A/B experiments
- Legal reviewed all copy and IA decisions
- A researcher supported the usability testing sessions
What users told us before we touched anything.
Before and during the programme, usability testing surfaced consistent patterns that shaped every major decision.
Hidden information destroys trust.
The original production design put tax information behind hover-only tooltips. On mobile, hover states don’t exist. In testing, users on all devices missed them.
“I wouldn’t think to hover here, so I don’t know what this means.”
“Feels like you’re charging more without telling me why.”
The problem wasn’t just discoverability. Users who did find the tooltips felt the charges were being deliberately obscured. That’s a trust problem, not a UI problem.
One-time education doesn't stick.
We tested a “Know your costs” popover that forced users to acknowledge the transparent pricing before browsing. Comprehension improved. But users who dismissed it immediately lost confidence in what the prices included.
“I clicked it away. Now I’m not sure if these prices include everything.”
“Why does this one say it includes fees, but that one doesn’t?”
Users need persistent reassurance, not a single acknowledgement.
Clarity beats brevity every time.
When we shortened “Local taxes collected by the hotel” to “Taxes & Fees,” clarity dropped. Users wanted the full sentence. The extra words weren’t noise — they were the reassurance.
Order and hierarchy determine comprehension.
“The total looks less important. The big per-person number drew my eye first.”
“Weird to choose transfers after I’ve seen the total.”
The logical flow users expected: understand the cost, then decide on extras. The existing basket reversed that.
What good looked like.
“Good. I know this is the full price.”
“Feels like a receipt. All the info’s there.”
Three attempts. Two failures. One repeatable pattern.
Attempt 1: Inclusive pricing in the headline
The most direct interpretation of CMA compliance: include taxes and fees in the headline price on SRP cards and throughout the journey. Three separate experiments tested this. All failed.
| Experiment | CVR Impact |
|---|---|
| Taxes and fees inclusive pricing | −10.82% |
| Local tax included in total price (test 1) | −5.8% |
| Local tax included in total price (test 2) | −6.5% |
Users weren’t seeing a clearer price. They were seeing a higher price with no context for why. The number went up. Conversion went down.
Attempt 2: Full basket redesign
Rather than changing the headline price, we redesigned the basket to break out the payment split clearly: Holiday Price + Local Taxes and Fees = Total Price.
Experiment G4qzC9mA produced −8.9% CVR, significant at 99.99%. We killed it.
| Funnel Stage | CVR Change |
|---|---|
| P&A to basket handoff | −3.5% |
| Payment to confirmation | −6.2% |
Two friction moments. The new design warned users at P&A with incomplete context, then hit them again at payment with the full breakdown. Neither moment felt resolved.
But the usability test data told a different story. 90% of users understood what was due now versus at the hotel — a 20-point improvement on control. 80% rated the new design as more trustworthy.
The design direction was right. The implementation and sequencing were wrong.
Attempt 3: Information before commitment
Showing tax and fee information on the Price and Availability page — before users commit to a specific hotel — tested well. Experiment 71-yOlKL ran for 39 days across 69,064 conversions. Net CVR: +1.4%.
| Funnel Stage | CVR Change |
|---|---|
| P&A to basket handoff | −1.1% |
| Hotel details to booking handoff | +5.25% |
| Passenger details to payment | +1.55% |
| Payment to confirmation | +0.50% |
Slightly fewer users progressed past P&A. But every downstream stage improved significantly. Early transparency filtered out low-intent users. Those who continued were more committed.
That’s not drop-off. That’s self-selection.
Three interconnected changes, sequenced to build on each other.
1. SRP and P&A: persistent, contextual disclosure
Every SRP card shows “includes taxes and fees” persistently. No popovers for primary disclosure.
Tooltips still exist, but their job changed. They clarify why fees exist and who collects them — not whether they exist. Copy frames charges as mandatory local costs, applicable regardless of which travel company you book with.
Multiple copy variants were tested. The winning direction was clear and factual rather than reassuring or minimising. “Includes £XX fees due at hotel” outperformed “Plus local fees” and significantly outperformed hiding the figure entirely.
2. Basket: a chronological price breakdown
The basket structure became: Pay today (to loveholidays) £X + Pay at hotel (local taxes and fees) £Y = Total trip £Z
This gave users a single scannable view of the full cost picture without requiring arithmetic. The basket moved above ancillaries on mobile, matching the order users expected.
A December 2025 design crit captured the tension we were managing. When a version included “tax recovery charges” as a separate line item, a participant challenged it directly:
“This looks so s*. You know the Ticketmaster thing when you go and buy something and it gives you like 15 different service fees? It’s starting to look like that.”*
That was the right challenge. Transparency doesn’t mean listing every line item. It means giving users a clear view of what they owe and to whom. The goal was a receipt, not an invoice.
3. Basket consolidation: a single unified component
Unifying the checkout and search baskets into one component meant:
- Pricing presentation became consistent across the journey
- Any future change required one build, not two
- Visual hierarchy, typography, and emphasis could be standardised once and applied everywhere
This was the enabler for the final experiment to succeed where the first attempt had failed.
Reframing the brief. When the exec team shifted from “Taxes and Fees compliance” to “Price Transparency,” I worked with product to define what that meant in practice. The principle “a compliant solution that creates a worse experience is not acceptable” became the filter for every subsequent decision. It aligned legal, product, and engineering around a shared outcome rather than separate requirements.
Calling the kill. After G4qzC9mA came back at −8.9% CVR, the pressure to iterate rather than stop was real. I made the call to kill it, regroup, and use the usability data to separate the direction (right) from the implementation (wrong). That distinction shaped the next phase.
Fixing the structural problem. The dual-component basket wasn’t a design problem. But it was blocking every design decision we wanted to make. Naming it early and pushing for it to be resolved as part of this programme removed a constraint that would have limited every subsequent transparency test.
What shipped and what moved.
| Metric | Result |
|---|---|
| CVR uplift (unified basket, GB) | +4.14% |
| MPT uplift (all markets) | +4.75% |
| Middle funnel (offer summary to passenger details) | +3.64% |
| User comprehension (due now vs at hotel) | +20 points vs control |
| Trust rating | 80% preferred new design |
| Regulatory compliance | Achieved ahead of CMA enforcement |
| Device | CVR Uplift |
|---|---|
| Desktop | +7.7% |
| Mobile | +6.8% |
| Tablet | −13.4% (not statistically significant) |
The tablet result appeared negatively in both the P&A and unified basket experiments. It’s a consistent enough signal to treat as an open problem, not an outlier.
Start with a data audit. The hotel fee data gap from third parties created design constraints that emerged late. A confidence review at the start would have shaped the IA earlier and prevented scope changes mid-test.
Run SRP experiments in parallel. Sequencing SRP after basket was logical given the risk profile. But it compressed the timeline on the highest-volume surface. Next time I’d find a way to run both tracks simultaneously.
Pressure-test terminology before it reaches the UI. “Pay at hotel” caused confusion across multiple rounds of testing. The language should have been validated with users at the research stage, not refined through live iteration.
Run a dedicated NL experiment. We applied GB learnings to NL without separate testing. Given that NL already had partial transparency in place and the regulatory requirements had specific local nuances, that market deserved its own validated approach.
Investigate the tablet pattern earlier. Two experiments. Same negative signal. That’s not noise. It should have become a standalone piece of work sooner.
What this changed. By the end of the programme, the team had a repeatable model: additive pricing works, inclusive pricing doesn’t, early disclosure outperforms late disclosure, persistent reassurance outperforms one-time education. Those aren’t just findings from this project — they’re a framework for future pricing work.
Where this goes next. The immediate priorities are a dedicated tablet layout investigation and a full NL validation study. Longer term, the unified basket component creates the foundation for a more modular pricing system — one that can adapt to new fee types or new markets without requiring a full redesign each time.