Case study Healthcare, Australia and New Zealand
One source of truth for treatment pricing
Treatment prices were typed into pages by hand and had drifted apart, so a patient could find different figures for one treatment. Conflicting figures undermine trust at the point of enquiry. Price changes meant a hunt through the site.
- Client
- A multi-clinic healthcare group
- My role
- Designed the pricing records and built the shared price component used across the site
- Disciplines
- Content architecture, Component architecture, Conversion optimisation, CMS architecture
Client anonymised. Details are generalised and contain no confidential figures.
Context
The group offers a range of treatments through its clinics in Australia and New Zealand, and many patients want a sense of what a treatment costs before they get in touch. Price information appeared on treatment pages and in other places that mention a treatment, such as landing pages and FAQs, and each instance was written and updated separately. Prices change from time to time, and each market prices in its own currency.
Constraints
- Prices differ by market, so every page had to show the right amount and currency for AU or NZ.
- Health advertising and consumer rules expect prices to be clear, with conditions shown alongside.
- Some treatments can't be priced before a consultation, so the component needed an honest alternative to a figure.
- Updating a price had to be a content edit, not a developer task or a search through every page.
- No page could show a stale price or an empty gap at any point during the rollout.
Diagnosis
Before changing anything, I needed every place a price appeared. I crawled both sites for currency amounts and pricing phrases, then logged each instance against the treatment and market it referred to. Putting the instances for each treatment side by side showed the problem quickly.
- One treatment, several figures. When a price was updated, it was usually changed where someone remembered it. Older copies elsewhere stayed as they were.
- No shared framing. One page gave a starting price where another gave a range. What the price included was worded differently each time, or left out.
- Answers in the wrong place. Some treatment pages said nothing about cost, while an older page further from the enquiry form still did.
- No owner. Prices lived in body copy, so nobody could say which version was current without asking around.
A patient who sees two prices for one treatment has a reason to doubt both, and doubt at that point stops enquiries. A patient who sees no price goes looking elsewhere, and third-party sites will fill the gap with figures the group doesn’t control. On a regulated healthcare site, a wrong price in front of a patient is also a compliance exposure.
Maintenance was the quieter cost. Every price change meant a manual search, with no way to know it was complete.
Approach
I treated price as data rather than copy. A price written into a paragraph can only be corrected by finding the paragraph. A price held in one record is corrected once.
One record per treatment, per market
Each record holds what a price statement needs and nothing that belongs to the page around it:
- the amount and its currency
- the price type: fixed, starting from, range, or set at consultation
- what the price includes, and any conditions, written once
- the date it was last checked
Consistency as a rule
Every page that mentions a price uses the same component, reading from the same record. A page can decide where the component sits and how much detail it shows, but not what it says. If the wording needs to change, the record changes and every page follows.
Honest when there’s no figure
Some treatments can’t be priced until a clinician has assessed the patient. For those, the component says so plainly and explains what the first consultation covers, rather than leaving cost unmentioned. A clear statement that pricing is set at consultation answers the question better than silence.
On treatment pages the price sits close to the primary action. Cost is a deciding question for many patients, so the answer belongs near the point where they decide.
Implementation
The pricing records
I set the records up in the CMS as structured fields, one entry per treatment per market. Currency formatting is handled by the component, not typed by hand, and conditions are a field of their own so they can’t be dropped from one page and kept on another.
The component
One template partial in HTML/CSS/JS renders every price statement on the site. Given a treatment and the page’s market, it looks up the record and outputs the price with its conditions beside it. A compact variant serves listings and supporting pages, and a full variant serves treatment pages. Both were laid out for phones before desktop.
If a record is missing, the component renders nothing rather than a placeholder, and the gap shows up in a pre-release check instead of on the live page.
Moving across
I replaced hand-typed prices one page type at a time. Before removing each figure from body copy, I compared it with the record. Where they disagreed, the price went back to the people who set it for confirmation, so the migration surfaced conflicts instead of quietly picking a winner.
A release only went ahead once:
- no hard-coded price remained in page copy
- every page matched its record, conditions included
- each market showed its own currency
- enquiry clicks next to a price were tracked in GA4 the same way on every page
Outcome
Structural outcome: what changed in how the site works
Each treatment's price now lives in one record per market, and every page that mentions it renders the same shared component from that record. Changing a price takes one edit instead of a manual search through the site. Patients now see the same figure and the same conditions wherever they come across it.