
Rules and ethics
VAT and GBP pricing on UK ecommerce SEO landing pages explained
Ecommerce SEO landing pages in the UK must show VAT-inclusive GBP prices under HMRC rules, and match schema.org Offer markup to those prices.
What to take away
- Ecommerce SEO landing pages for UK consumers should show VAT-inclusive GBP prices, because HMRC treats the displayed price of most goods as the VAT-inclusive price.
- The same figure must appear in your schema.org Offer markup, or Google can pick a different number for the snippet.
- Consumer Contracts Regulations 2013 require the total price, including VAT, before the shopper commits.
- Google Search Central treats structured data as a claim about the page, not a substitute for visible content.
- Price ranges, sale prices and from-prices break snippet accuracy more often than any other field.
- Test the rendered page, the markup and the snippet together, not the CMS field alone.
How HMRC VAT rules shape prices shown on ecommerce SEO landing pages
HMRC sets the VAT rate and the rules on when a sale is taxable. Standard rate VAT applies to most goods and services sold to UK consumers. Reduced and zero rates apply to a narrower list, such as most food, children's clothing and some energy-saving materials.
If you sell standard-rated goods to a consumer, the price on the landing page is a VAT-inclusive price in practice. The shopper pays that figure, which includes the VAT due on the sale. HMRC's general VAT guidance is in VAT Notice 700, The VAT Guide, which covers the rules on charging, reclaiming and recording VAT.
That has a direct effect on ecommerce SEO landing pages. The number in your title tag, meta description, on-page copy and structured data must be the number the shopper pays. A landing page that quotes a net price to a consumer, then adds VAT at checkout, invites complaints and, in some cases, enforcement.
Business-to-business sales work differently. If you sell to VAT-registered businesses, you can show VAT-exclusive prices provided you make the position clear. Many UK trade suppliers show both figures side by side.
The rate you pick changes the price you show
Not every product attracts the same rate. A children's car seat and an adult car seat can sit at different rates. A cake and a catering platter can too. The rate you apply decides the displayed figure, so the pricing decision starts with classification, not with design.
HMRC's guidance, “VAT rates on different goods and services”, lists the rates and explains which goods and services qualify. Merchandisers should check it when classifying products before a landing page goes live, particularly for mixed baskets where one item carries a reduced rate.
Where the pricing decision sits in the build
On a typical UK store, the VAT rate lives in the product record, the price rule lives in the pricing engine, and the displayed figure lives in the template. The landing page inherits all three.
If the pricing engine stores net prices and the template adds VAT at render, the visible figure is correct but the raw data feed is not.
That mismatch is the root of most snippet errors later. Fix it at the record level, not in the template. A merchandiser working through an ecommerce SEO launch review should treat the pricing field as a launch blocker, not a cosmetic detail.
VAT-inclusive versus VAT-exclusive display for consumer audiences
For consumer audiences, the displayed price is the VAT-inclusive price. That is the default position under UK consumer law and the practical expectation of shoppers. A landing page that shows £24.99 and charges £29.99 has failed, whatever the small print says.
VAT display by audience
UK consumer
- Display convention
- VAT-inclusive GBP
- What shopper pays
- Displayed figure
- Label needed
- No
VAT-registered business
- Display convention
- VAT-exclusive or both
- What shopper pays
- Displayed plus VAT
- Label needed
- Yes
Mixed audience
- Display convention
- Both, clearly labelled
- What shopper pays
- Depends on status
- Label needed
- Yes, next to price
VAT-exclusive display is legitimate in two main cases. The first is business-to-business selling, where the buyer can reclaim the VAT. The second is a clearly labelled trade or wholesale section that consumers do not reach by accident.
VAT-inclusive versus VAT-exclusive
Display convention
- UK consumer
- VAT-inclusive GBP
- VAT-registered business
- VAT-exclusive or both
- Mixed audience
- Both, clearly labelled
- Export outside the UK
- Usually VAT-exclusive
What the shopper pays
- UK consumer
- The displayed figure
- VAT-registered business
- Displayed figure plus VAT
- Mixed audience
- Depends on status
- Export outside the UK
- Local taxes may apply
Making the distinction legible
If you serve both audiences, label the switch. "Ex VAT" and "Inc VAT" toggles are common on UK trade sites. The label must sit next to the price, not in a footnote. Screen readers and price-parsing tools both need the label in the markup.
Avoid a toggle that changes the number but leaves the structured data untouched. That is the single most common cause of a snippet showing a different price from the page.
What shoppers infer from the figure
A UK shopper reading £19.99 assumes that is the total for the item, before delivery. Delivery charges are a separate pre-contract duty. If delivery is mandatory and unavoidable, the total price includes it, and that total belongs on the landing page.
This is where ecommerce SEO landing pages and checkout pages often disagree. The landing page says £19.99. The basket says £23.98 with delivery. Neither figure is wrong, but the landing page should say what the basket will say, or explain the delivery charge before the shopper commits.
GBP currency signals and pricing clarity for UK shoppers
Currency is a ranking and trust signal as much as a formatting choice. A UK shopper landing on a page priced in dollars or euros hesitates. A page priced in GBP with a clear VAT position does not.
Use the pound sign, not the code, in visible copy. Use both in structured data. The ISO 4217 code GBP is the form software reads. The symbol is the form people read. Search engines and price-comparison tools read the code; shoppers read the symbol.
Place the currency signal where it matters: the title tag, the meta description, the H1 area, the price block and the Offer markup. Do not scatter it. The symbol belongs where a shopper looks for a price, not in every block of copy.
Locale signals beyond the symbol
Currency sits alongside other locale signals. Delivery times in days, sizes in UK conventions, addresses in UK format and phone numbers in UK format all reinforce that the page is for a UK audience. None of these replace the price, but they support it.
For stores selling across the four nations, avoid flag imagery that implies one. A Union flag or a neutral UK label works better than a national flag on a page serving England, Scotland, Wales and Northern Ireland.
When to show a converted price
If you sell in GBP but ship internationally, show the GBP price as the primary figure. A converted estimate can sit beneath it, clearly marked as indicative. Converted prices change daily, and a stale conversion on a landing page undermines the accuracy of the GBP figure above it.
Stores that run this well usually keep one source of truth for price and one for currency. Everything else, including the landing page copy, is derived. That discipline is worth building into your building an ecommerce SEO strategy rather than bolting on later.
Schema.org Offer markup and VAT-inclusive price fields
Schema.org Offer markup tells search engines what is for sale, at what price, in what currency and under what conditions. For a product page, the Offer usually sits inside a Product. The key fields are price, priceCurrency, availability and priceValidUntil.
Offer markup field checks
- Price field carries VAT-inclusive figure
- priceCurrency set to GBP
- No currency symbol inside price field
- priceValidUntil is in the future
- AggregateOffer used for price ranges
- Markup price matches visible page price
The price field should carry the VAT-inclusive figure for consumer-facing pages. priceCurrency should be GBP. If you show a price range, use lowPrice and highPrice inside an AggregateOffer rather than a single price.
Here is a worked example for a UK store selling a £29.99 kettle, VAT included:
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Stainless steel kettle, 1.7 litre",
"offers": {
"@type": "Offer",
"price": "29.99",
"priceCurrency": "GBP",
"availability": "https://schema.org/InStock",
"priceValidUntil": "2027-01-31"
}
}
The price string is 29.99, not £29.99. The currency lives in its own field. The visible page shows £29.99. Both describe the same amount.
Common field errors
- Price written with a currency symbol inside the price field.
- priceCurrency set to GBP while the visible price is in euros.
- priceValidUntil in the past, which can suppress the rich result.
- AggregateOffer used for a single-price product.
- Net price in the markup and gross price on the page.
Each of these produces the same outcome: a snippet that disagrees with the page. Google's guidance on which markups it supports is set out in the structured data markup gallery.
Keeping markup and template in step
Generate the markup from the same price object the template uses. If the template reads a gross price and the markup reads a net price, they will drift. A single price object, rendered twice, removes the class of bug entirely.
What Google Search Central says about structured data for products
Google Search Central publishes the documentation that governs how structured data is read and how rich results are generated. The core position is consistent: structured data must describe content that is visible on the page. Markup that claims a price the page does not show is a mismatch.
Google's broader documentation on how it handles page content sits in the Google Search Central documentation. It covers crawling, indexing, snippets and structured data as one system. The pricing rules are not a separate discipline from the rest of SEO.
For product pages, Google supports several markup types. Product, Offer, AggregateOffer and Review are the relevant ones for pricing. Breadcrumb and Organisation markup support the page but do not carry price.
What Google does with a price in markup
Google may use the markup price in a rich result, in a merchant listing or in a price snippet. It may also ignore the markup and use the visible price. When the two agree, the outcome is stable. When they disagree, Google tends to trust the visible page, and the rich result may be dropped.
That is the practical argument for keeping the two in step. The markup is not a ranking trick. It is a structured restatement of what the shopper sees.
Validation and monitoring
Run the Rich Results Test on a sample of landing pages after every pricing release. Check the URL Inspection tool for the rendered markup on live pages. Set up Search Console monitoring for Merchant listings and Product snippets so a drop in valid items is visible.
A merchandiser who treats markup validation as part of the pricing change process catches errors before they reach the snippet. One who treats it as a separate task does not. This is the same discipline that underpins reliable ecommerce SEO key metrics: one source of truth, measured consistently.
Snippets, price ranges and the risk of mismatched markup
A price snippet is generated from a mix of page content and structured data. When the two agree, the snippet is accurate. When they disagree, the snippet can show a price the shopper cannot buy at.
Single Offer vs AggregateOffer
Single Offer
- Use when
- One price
- Fields
- price
- Example
- £12 only
- Risk
- Understates or overstates
AggregateOffer
- Use when
- Variants span a range
- Fields
- lowPrice, highPrice
- Example
- £12 to £24
- Risk
- Accurate range
Mismatches cluster around a few patterns. Sale prices are the most common. The page shows £19.99 reduced from £29.99, the markup still carries £29.99, and the snippet shows the old figure. The shopper clicks, sees a different price and leaves.
Price ranges cause a second cluster. A product with variants at £12, £18 and £24 should use an AggregateOffer with lowPrice 12 and highPrice 24. A single Offer with price 12 understates the range. A single Offer with price 24 overstates it.
The from-price problem
"From £12" is a common UK retail convention. It is legitimate when at least one variant is available at that price. It becomes misleading when the cheapest variant is out of stock and the entry price is higher. The markup should reflect the price a shopper can actually pay today.
If your landing page uses a from-price, keep the lowPrice field aligned with the cheapest available variant. Recalculate it when stock changes, not on a fixed schedule.
Sale prices and priceValidUntil
A sale price needs a validity window. Set priceValidUntil to the date the sale ends. A stale date can suppress the rich result or, worse, leave a discounted price in the snippet after the sale has ended.
Test this on the day the sale ends, not the day it launches. The end of a promotion is where most pricing markup fails.
Consumer Contracts Regulations 2013 duties on pre-contract pricing information
The Consumer Contracts Regulations 2013 set out what a trader must tell a consumer before a distance contract is formed. Price is central to that duty. The total price, including VAT, must be given before the shopper commits.
The full text sits in the Consumer Contracts Regulations 2013. The regulations cover online sales, and they apply to the landing page as much as to the checkout, because the landing page is where the shopper forms an expectation of price.
Where the total price cannot be calculated in advance, the trader must explain how it is calculated. Delivery charges fall into this category when they vary by address. The landing page should state that delivery is calculated at checkout, not leave the shopper to discover it.
What the regulations mean for landing page copy
What the regulations mean
- Show the total price including VAT for consumer sales.
- State delivery charges, or how they are calculated, before the order.
- Make any additional charges clear and opt-in, not pre-ticked.
- Give the trader's identity and geographic address.
- State cancellation rights and the cancellation period.
Pre-ticked boxes for extras are a specific breach. So is burying a mandatory charge in a later step. Both practices also damage trust, which affects conversion more than any snippet does.
Enforcement context
The Competition and Markets Authority enforces consumer protection in this area. The Advertising Standards Authority covers pricing claims in ads, including paid search copy. A landing page that advertises one price and charges another can attract attention from either body.
For ecommerce SEO landing pages, the safe pattern is simple: the advertised price is the total price, and the markup says the same. Everything else follows from that. Research into what shoppers actually query, such as the work covered in ecommerce SEO customer interviews, tends to show that price clarity is a larger trust factor than price level.
Testing landing pages against HMRC and search documentation
Testing has three layers: the visible page, the markup and the snippet. A page can pass the first and fail the third. Treat them as separate checks.
Three-layer pricing test
- Render page as UK consumer, confirm VAT-inclusive GBP
- Inspect structured data, confirm price and priceCurrency
- Run Rich Results Test and URL Inspection
- Compare live snippet against page price
- Re-check after any pricing or promotion change
A pre-launch checklist
- Displayed price is VAT-inclusive and in GBP for consumer audiences.
- Structured data price matches the displayed price exactly.
- priceCurrency is set to GBP.
- AggregateOffer used where variants span a price range.
- priceValidUntil is in the future and matches the promotion end date.
- Delivery charges stated or explained before the order step.
- Trader identity and address present on the page.
Where testing usually stops too early
The common failure is testing the CMS field rather than the rendered output. A template can override a field, a pricing rule can adjust a figure, and a currency switcher can change the display without touching the markup. Only the rendered page shows the truth.
Build the check into the release process. If a pricing change cannot ship without a markup check, the mismatch class of bug disappears. That is worth more than any single snippet fix.
It is also the kind of discipline that makes an ecommerce SEO product comparison meaningful, because you can compare how tools handle price data rather than how they describe themselves.


