Documentation
Market data against your own costs
Why the market view is the public explorer, the single place public observations join your purchasing, and why that join is weaker than it looks.
Last reviewed against the product on .
The market surface at /app/market is not a screen of its own. It is a redirect to the public food market data explorer, which is deliberate: the market data is the same for everyone and nothing in it is scoped to your organization. This page is about what that public data can say about your costs, and about the single place in the product where the two are joined.
Two different kinds of number
Everything on this site is one of two things, and most misreadings come from treating one as the other.
| Aspect | Market observation | Your purchase record |
|---|---|---|
| Where it comes from | A statistical agency's published series | A file you imported |
| What it prices | An item the provider defines, at a level it chose | The line as it appeared on your invoice |
| Who it describes | A country, region or named market | Your organization only |
| Currency | Recorded as published, never converted | Recorded as supplied, never converted |
| Who can see it | Anyone, at /data | Your organization, behind sign-in |
Measured from the market_observation and purchase_record tables in src/db/schema.ts.
A market observation has no knowledge of your supplier, your contract or your delivery schedule. What the market price data is covers the levels it arrives at and why mixing them is wrong.
The one place the two are joined
Public observations and your own purchasing meet in exactly one calculation, on the analytics page. Your purchase rows are totalled by item and currency, and that total is used in two ways: as a weight that pushes movements in the things you actually buy up the priority order, and as the baseline the impact column is calculated from.
- What the join matches on
- Item name and currency
- nothing else is used to decide that two things are the same
- Conversions applied
- None
- no currency, unit or pack-size conversion at this join
- Share of priority from your spend
- 30%
- relative to your own largest matched item, not to anyone else
Measured from getMarketAnalytics in src/lib/analytics/queries.ts.
Why the match is weaker than it looks
Both names are reduced the same way, by lowercasing them and collapsing punctuation to single spaces, and then compared for exact equality. That is the whole of it, and it fails in both directions.
It misses matches that a person would make. A provider publishing under one wording and an invoice listing the same goods under another wording do not meet, so an item you buy heavily can carry no spend weight at all and sit far down the priority order.
It also makes matches a person would not. Names agreeing says nothing about grade, preparation, pack format or quality, and the join does not check any of them. The database has a canonical item column for this purpose and nothing in the application reads it, so there is no synonym list and no curated mapping behind the match.
Currency is never crossed
Currency is recorded exactly as it arrives on both sides and is never converted. A market observation in one currency will not join to purchasing in another, even for the same item. An index carries no currency at all, so an index row can never receive a spend baseline and its impact is always a movement rather than an amount.
What to use each one for
Use the market data for direction and timing. A sustained movement at producer or wholesale level is a reason to expect a conversation with a supplier, and it is evidence you can put in front of them because it comes with its source link.
Use your own purchase records for anything involving money you actually paid. The movements in those are calculated separately and on much stricter terms, described in how price changes are detected.
Where to look next
The coverage page lists every country and provider with its freshness, and methodology sets out how observations are normalised before publication. For the rules applied to your own imported prices, start with the import contract.