NOVUS / RESTAURANT

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.

A market observation against a purchase record
AspectMarket observationYour purchase record
Where it comes fromA statistical agency's published seriesA file you imported
What it pricesAn item the provider defines, at a level it choseThe line as it appeared on your invoice
Who it describesA country, region or named marketYour organization only
CurrencyRecorded as published, never convertedRecorded as supplied, never converted
Who can see itAnyone, at /dataYour 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.