Introduction
Most UK grocery data projects start with Tesco, Sainsbury's and Asda. But comparison apps, CPG brands and analysts quickly find gaps without the next tier. This guide explains what Ocado product data, Morrisons product data and Waitrose product data you can collect from public pages – and how to make the three chains comparable.
Short answer: From public, logged-out product pages on Ocado, Morrisons and Waitrose you can usually collect product name, brand, pack size, shelf price, unit price, promotions, member or loyalty prices where displayed, ingredients, nutrition, allergens, ratings and stock flags. Match products across chains by barcode where shown, otherwise by brand, size and variant.
Below we compare the three chains, list the fields that matter, show how to match products, explain loyalty versus shelf prices and cover compliance and build-vs-buy choices.
Who are Morrisons, Waitrose and Ocado in 2026?
All three sit below the 'big four' on market share, but each matters for a different reason. According to Worldpanel by Numerator figures for the 12 weeks to 6 September 2026, reported by AJ Bell, Morrisons held 8.4% of the market, Waitrose 4.5% and Ocado 2.2%. Ocado's sales grew 13%, making it the fastest-growing grocer in that period.
Ocado's growth is not new. Worldpanel data for the 12 weeks to 22 February 2026, covered by Grocery Gazette, showed Ocado growing 15.1% while Waitrose reached its highest share in three years. Ocado is online-only, and M&S products make up about a third of its revenues, according to Retail Gazette.
- Morrisons – a national full-line supermarket with a large own-label and fresh range, sold in stores and online.
- Waitrose – the premium grocer within the John Lewis Partnership, with a strong own-label range ('Essential Waitrose', 'Waitrose No.1') and specialist lines.
- Ocado – a pure online grocer offering a wide branded range plus M&S food, with no physical stores.
Together they cover the value-to-premium spectrum, which is why any serious price comparison or shelf-share study needs them alongside Tesco and Sainsbury's.
How do the three chains differ for data collection?
Each site is built differently, so the same field can appear in different places or formats. The table below summarises what we typically see on public product pages. Always check the live site, because layouts change often.
| Feature | Ocado | Morrisons | Waitrose |
|---|---|---|---|
| Channel | Online only | Stores + online | Stores + online |
| Range focus | Wide branded range + M&S food | Mainstream, strong own label and fresh | Premium own label, specialist and organic |
| Shelf price and unit price | Shown on listings and product pages | Shown on listings and product pages | Shown on listings and product pages |
| Loyalty / member price | Offer badges; check for member-only labels | More Card prices where shown | myWaitrose member offers where shown |
| Multi-buy promotions | Yes, as offer text | Yes, as offer text | Yes, as offer text |
| Nutrition, ingredients, allergens | Usually on product page | Usually on product page | Usually on product page |
| Ratings and reviews | Shown on many products | Shown on many products | Shown on many products |
| Barcode (EAN) visible | Not always – often only in page code or images | Not always | Not always |
| Postcode needed | Prices may vary by delivery area | Some range and slots depend on postcode | Some range and slots depend on postcode |
The practical lesson: plan for three separate parsers and one shared output schema, rather than one 'UK supermarket scraper'. Ocado product data, for example, often needs a delivery-area check that a Morrisons store-range page does not.
The 10 data fields that matter most
Whether you are building a comparison app or a brand dashboard, these fields form the core of usable Ocado product data and its Morrisons and Waitrose equivalents.
- Product ID and URL. The retailer's own SKU or product ID, plus the page URL, so every row is traceable.
- Name, brand and own-label flag. Needed to separate branded lines from 'Morrisons', 'Essential Waitrose' or M&S items.
- Pack size and unit. Weight, volume or count, split into a number and a unit for clean maths.
- Shelf price. The standard price any shopper sees when logged out.
- Unit price. Price per kg, litre or item as displayed – and recalculated by you as a check.
- Promotion and loyalty price. Multi-buys, 'was/now' prices and member prices, each stored in its own column.
- Availability. In-stock or out-of-stock flags, and the postcode used, if any.
- Nutrition and ingredients. Per-100g values, ingredient lists and allergen statements in bold.
- Ratings and review counts. Average star rating and number of reviews – a public proxy for popularity, not sales.
- Category path and timestamp. Aisle and shelf hierarchy plus the exact collection time.
| Field | Example format | Notes |
|---|---|---|
| retailer | ocado / morrisons / waitrose | Fixed codes |
| product_id | Retailer SKU string | Primary key per chain |
| product_name | Text | Keep the raw title |
| brand | Text | Normalise spelling |
| is_own_label | true / false | Derived from brand |
| pack_size_value / pack_size_unit | 500 / g | Parsed from title or spec |
| shelf_price_gbp | Decimal | Logged-out price |
| unit_price_gbp / unit_basis | Decimal / per kg | As displayed |
| promo_text | Text | e.g. multi-buy wording |
| loyalty_price_gbp | Decimal or empty | Only if publicly displayed |
| in_stock | true / false | Plus postcode if used |
| ean | 13-digit string or empty | Only where publicly shown |
| rating_avg / review_count | Decimal / integer | Popularity proxy |
| collected_at | ISO timestamp | UK time zone |
How to match products across Morrisons, Waitrose and Ocado
Matching is where most UK comparison projects succeed or fail. A product is only comparable if you are sure it is the same item, in the same size, on each site.
Step 1: Match by barcode where it is public
The EAN (barcode) is the most reliable key. Some product pages show it, and some expose it in structured data. Where it is not public, do not try to work around restrictions to get it – move to step 2.
Step 2: Match by brand, size and variant
For branded goods, normalise the brand, the pack size and the variant (flavour, fat level, pack count). 'Heinz Baked Beans 4 x 415g' should only match the same multipack, not a single tin.
Step 3: Map own-label equivalents
Own-label products never share a barcode across chains. Instead, group them by category, size and tier – value, standard or premium. This is how analysts compare 'like for like' baskets. Our guide to branded vs private-label price analysis shows the approach.
Step 4: Score and review
Give each match a confidence score and send low scores to a human check. A small, clean matched set beats a large, noisy one.
Loyalty prices vs shelf prices – and why unit pricing matters
Loyalty pricing has changed how UK grocery prices should be read. Tesco has Clubcard Prices and Sainsbury's has Nectar Prices; you can compare those in our Tesco, Asda and Sainsbury's price parity data page. Morrisons and Waitrose run their own member schemes, so a 'price' can mean two different numbers.
- Store both prices. Keep shelf price and member price in separate columns. Never overwrite one with the other.
- Label the condition. Record the badge text, such as 'with More Card' or 'myWaitrose offer', so analysts know who gets the price.
- Collect only what is public. Capture member prices only when they are displayed to logged-out visitors. Do not log in to member accounts.
- Recalculate unit prices. Check the displayed unit price against your own price ÷ size calculation to catch errors.
Unit pricing is also a regulatory topic. In the UK, unit-price display rules sit in the Price Marking Order, and the Competition and Markets Authority (CMA) has looked at how grocers show unit prices, including on promotions and loyalty prices. Consistent unit-price data helps you spot where displays differ across chains.
Use cases for UK supermarket product data
- Grocery comparison apps. Show shoppers matched baskets across Ocado, Morrisons and Waitrose, with shelf and member prices side by side.
- CPG and FMCG brands. Check price, promotion and availability compliance for your lines across all three chains every day.
- Category and pricing analysts. Track own-label price gaps between value and premium grocers over time.
- Nutrition and allergen teams. Compare ingredients, allergens and per-100g nutrition across own-label equivalents.
- Assortment and shelf-share research. Count brand presence by category, plus rating counts as a popularity proxy (not sales).
- Market researchers. Combine chain-level data with Morrisons grocery datasets or Ocado grocery datasets for time-series studies.
Legal and compliance basics
Responsible collection protects you and the retailers. These are the rules we follow and recommend:
- Public, logged-out data only. No account logins, no member areas, no checkout pages.
- Respect terms and robots.txt. Review each site's terms of use and robots.txt before starting, and follow them.
- Polite rate limits. Spread requests over time, cache results and avoid peak-hour load.
- No personal data. Do not collect reviewer names or profiles; keep ratings and review text at aggregate level where possible.
- No security workarounds. Never bypass CAPTCHAs, paywalls or access controls.
- Postcode use with care. If a public page asks for a postcode to show local range, use a generic business postcode and record it – do not book or hold delivery slots.
This is general guidance, not legal advice. Check with your own legal team for your specific use.
Build vs buy: choosing a data approach
| Factor | Build in-house | Use a managed provider |
|---|---|---|
| Set-up time | Weeks per chain for parsers and QA | Faster start using existing pipelines |
| Maintenance | Your team fixes breaks when sites change | Provider monitors and repairs |
| Product matching | You build EAN and fuzzy matching | Matching and review often included |
| Loyalty price handling | You design the schema | Agreed schema with separate price columns |
| Cost profile | Engineering time and infrastructure | Subscription or per-feed pricing |
| Best for | Teams with scraping engineers and one or two chains | Teams needing daily feeds across many chains |
Food Data Scrape delivers daily or weekly UK grocery feeds as CSV, JSON or API. Ocado product data is usually the first feed teams ask for, given Ocado's growth. Our Waitrose grocery data API page lists the delivery options, and coverage can extend to Tesco, Sainsbury's and Asda for a full market view. for any coverage counts before publishing.
Get a free sample dataset – see matched Ocado, Morrisons and Waitrose product data with shelf prices, unit prices and loyalty prices in one file.
Questions
Frequently Asked Questions
Public Ocado pages usually show product name, brand, pack size, price, unit price, offers, ingredients, nutrition, allergens and ratings. Exact fields vary by product, so check a sample first.
Only where they are displayed publicly to logged-out visitors. We store them in a separate loyalty-price column with the badge text, and never log in to member accounts.
By EAN where it is public, then by normalised brand, size and variant. Own-label items are grouped by category, size and price tier, with low-confidence matches reviewed by people.
No. Sales volumes are not public. We offer public proxies instead, such as review counts, ratings, bestseller badges, search rank and stock status.
Daily is common for prices and promotions; weekly often suits nutrition and range data. The right cadence depends on your use case and on polite rate limits.
Collecting public, non-personal product data is common, but you must follow each site's terms, robots.txt and UK law. Take legal advice for your specific use.
Get a Free Food Data Sample in 48 Hours.
Tell us your platforms, target markets and required fields — we'll map exactly what's possible with food data scraping, recommend the right approach, and send a working sample so you can verify quality before any commitment.
Request a strategy call
Thanks — our data team will reach out within 48 hours with your sample.

