Reading the data
What this food price data is a price for
Every observation here is a wholesale, producer or index figure from an official source, and none is a retail price. Which one you are reading changes what it means.
- Published
- Figures measured
- Read
- 5 min
- By
- Novus Stream Solutions
A price is never just a price. It is a price for a particular transaction, between particular parties, for a particular quantity. Two figures for the same vegetable on the same day can differ by a factor of three and both be correct, because they describe different transactions. That is the single most useful thing to know before reading anything on this site, so it is worth being exact about which transactions are represented here.
Three economic levels, and none of them is retail
Each stored observation carries an economic level, taken from the provider rather than inferred. On the reading below there were three levels in the data, and retail was not one of them.
- Wholesale observations
- 79,009
- Canada, the United Kingdom, the United States and Japan
- Producer observations
- 8,311
- the EU agri-food feed and FAOSTAT
- Index observations
- 134
- the Australian statistical series
- Retail observations
- 0
- no configured provider publishes at this level today
Measured Sep 7, 2026 from market_observation, grouped by data_level. This data is re-ingested daily, so treat these as a snapshot rather than a live count. Take your own reading
Wholesale is the level a distributor sells at, and it is the one closest to what a kitchen pays a supplier, though it is not the same number. Producer is the farm gate: what the grower received, before packing, freight, storage or anyone's margin. Index is not a price at all, which the next section takes up. The site keeps the three apart everywhere, and the methodology page states the rule plainly: producer, wholesale, retail, CPI and index signals are not blended without an explicit conversion model, and there is no such model here.
The index rows are not prices
An index is a ratio against a base period. It moves like a price and it is not one: it has no currency, no unit and no amount you could pay. The Australian series is the only index source configured, and its rows are stored with no currency for exactly that reason. A percentage change on an index is meaningful. A dollar figure derived from one is not, and the site does not offer to compute you one.
Five currencies, and no conversion between them
- Canadian dollars
- 43,581
- Pounds sterling
- 17,704
- US dollars
- 8,387
- Euros
- 7,437
- Japanese yen
- 211
- No currency recorded
- 10,134
- the index rows, plus a block of UK wholesale rows stored without one
Measured Sep 7, 2026 from market_observation, grouped by original_currency. This data is re-ingested daily, so treat these as a snapshot rather than a live count.
Currency totals are never converted between currencies here, because the data carries no exchange rate. A converted figure would need a rate, a rate date and a rate source, none of which these providers publish alongside their prices, and inventing one would set an unattributed number beside a sourced one. So currency is a dimension a comparison has to match on, not something the site normalizes away. For a cross-currency read, use the percentage movements, which are dimensionless, rather than the levels.
A movement needs two comparable observations
The site groups observations into series before it calculates anything, and two observations are in the same series only when all seven of these match: country, provider, item name as the provider writes it, economic level, market, unit and currency. Change is then the latest value against the one before it, inside that series and nowhere else.
- Comparable series in the data
- 1,440
- Series holding five or more observations
- 1,278
- Series holding two to four
- 50
- Series holding exactly one
- 112
- no movement can be computed for these
Measured Sep 7, 2026 from market_observation, grouped by the seven comparison fields. This data is re-ingested daily, so treat these as a snapshot rather than a live count.
The last row is the interesting one. For those series there is a current value and nothing to compare it against, so the card shows the value and no percentage. That is a deliberate empty state rather than a gap waiting to be filled: the alternative is comparing across a boundary the provider did not intend, which produces a number that looks like information and is not.
Questions this data can settle
- Has the wholesale quote for a named item, in a named pack, in a named country, moved since the last time that source published?
- How old is the newest observation for an item, and how old is the source's publishing cycle willing to let it get?
- Which official body published a given figure, and at what URL?
- Is a movement large relative to the recent history of that same series?
Questions it cannot
- What a consumer pays in a shop. There are no retail rows.
- What your supplier will quote you tomorrow. A published wholesale figure is an official observation of a past period, not an offer.
- Whether food is cheaper in one country than another in absolute terms. That needs a currency conversion and a unit conversion, and this site performs neither.
- What a movement means for your own costs, unless you match the item, level, unit and currency to something you actually buy.
None of this is a complaint about the sources. Wholesale and producer series are what national agencies publish for free, on a schedule, with provenance, and that is a genuinely useful thing to have. It is only worth being precise about which question a figure answers, because the cost of the confusion falls on whoever acts on it. The understanding the analytics page covers what the change, confidence, impact and priority figures each mean once you have the right series in view.
Reproducing these figures
Every number above was read on September 7, 2026. Re-running these gives a different result on a later day, which is the point: the figures are dated so they can be checked rather than trusted.
- Economic levels: group the market_observation table by data_level and count the rows.
- Currencies: group the same table by original_currency, and keep the rows with no currency recorded as their own group.
- Comparable series: group by the seven fields in publicComparisonKey (country, provider, item name, economic level, market, unit, currency) and count the observations in each group.
- Every one of these is visible without a query on /data, which shows the level, unit and currency on each card.
Sources
Read next
Working with sources
One item, many pack sizes
On 2026-09-07 Canada's wholesale feed listed tomatoes under 29 pack descriptions. Why the site keeps every one apart, and how to pick the series you buy.
- Published
- Figures measured
- Read
- 4 min