True Inflation

How the index is built

What True Inflation measures, how each number is produced, and where the method is weak. Figures marked “live” below are read from the index tables when this page is generated (last complete night: 2026-11-03).

1. What is measured 2. Collection 3. Price sanity at insert 4. Matching products 5. A store's change 6. Food-only filter 7. A country's figure 8. Global average 9. Thin nights 10. Gaps and later revisions 11. Structural breaks 12. Mirror stores 13. Dropped countries and restarts 14. Category breakdown 15. Global product comparison 16. The real cost: what the government takes 17. What is never done 18. Known limitations 19. Coverage by country

1.What is measured

A chained, night-over-night change in the shelf prices of food products, per store and then per country, in each country's own currency. It is not a price-level comparison between countries and not a cost-of-living index: there is no fixed basket and no household weights. Exchange rates play no part in the index.

2.Collection

Each store's website or app is scraped once a night. Since 3 September 2026 every store's night is recorded with its status and row count, and a night recorded as partial or failed is never used, either as a measurement or as the baseline the next night is compared with. Nights before that date have no such record; they are checked only by the slice rule below and the thin-night rule (section 9).

A scrape can also end cleanly with only a slice of the catalogue (a few categories, or one promotion page). A run that offers fewer than half the store's usual number of products (the median of its last 14 runs, once it has at least 5) is therefore recorded as partial even when the scraper reported success. Earlier slices found in the history by the same rule are excluded from the index in the same way. Their rows are kept.

3.Price sanity at insert

Since 3 September 2026, a product whose price more than doubles, or falls by more than half, against the same store's previous scrape is treated as a probable scraper error and is not stored. The comparison is only made when that previous scrape is at most 7 days old; across longer gaps ordinary price movement can exceed the band, so nothing is rejected. When a large share of a store's catalogue trips the rule at once (a unit or currency change on the site, or the scraper reading the wrong field), the night is recorded as partial and left out of the index. Prices scraped before that date were stored as scraped; the same band is still applied to them when the index reads them (section 4), but a whole night of wrong prices was not caught at the time.

4.Matching products

A price is compared only with the identical product in the same store on the previous usable night: exactly the same name, weight and unit. There is no fuzzy matching and no grouping of similar products. Prices must be positive, and the pair must lie strictly between 0.5× and 2× (the same band again, at index time). Units stay as the store publishes them; US stores keep ounces and pounds.

Consequence: shrinkflation is not counted. When a pack shrinks at the same price, it becomes a new product with no history, so the index records no change for it. The index measures price changes of unchanged products, not changes in what the same money buys.

5.A store's change

For each store and night, the change is the geometric mean (Jevons) of the matched price ratios: exp(mean(ln(pnow/pbefore))) − 1. It is symmetric, so a promotion that cuts a price and later restores it nets to zero rather than drifting upward. A night with fewer than 10 matched products gives no reading. The 7-day and 30-day views compare against the newest usable night at least 7 or 30 days earlier, and give no reading when that baseline is more than 2 days further back. The same floor applies to them: a 7-day or 30-day change resting on fewer than 10 matched products is not shown for that store.

6.Food-only filter

Products are kept or dropped by name, using a multilingual list of 720 patterns that removes alcohol, household goods, personal care, pet food and similar items. It is pattern-based and therefore imperfect: some non-food items still get through, notably in stores whose catalogues mix groceries with stationery, toys, merchandise or medicine. In samples of such stores a noticeable share of the remaining “other” items is still non-food. A few scrapers also skip a store's non-food departments at the source.

7.A country's figure

Each night, the country's change is the average of its stores' changes, weighted by how many products each store matched — not by market share or by what households buy. A large online catalogue therefore counts for more than a small one. The nightly changes are compounded from the country's first measured night (or its restart, section 13), which is set to 0%. Countries therefore start on different dates (see the coverage table), and their cumulative figures cover different periods.

8.Global average

Where a global average is shown, it covers one common window. Its start is the date by which three quarters of the countries had begun (or restarted) their lines. For each country that had begun by then, the change from its level on that date to its latest value is taken, and the global figure is the plain, unweighted mean of those changes: every country counts the same, whatever its size. Countries that began later are left out, and the app says how many. It is a summary, not an index.

9.Thin nights

A night on which fewer than 0.6× the usual number of stores reported (the median of the 14 nights before it) is excluded, both as a measurement and as a baseline, so the night after it is compared with the last good night. The rows are kept; they are simply not used.

Excluded night (live)Stores reportingUsual (median)
2026-08-0172195
2026-08-069193
2026-09-0191177
2026-09-0747172
2026-09-1145177
2026-10-0148190

10.Gaps and later revisions

When a store misses nights, the change it measures across the gap is spread evenly (geometrically) over the published nights inside the gap instead of landing on a single night. A store that comes back after weeks therefore does not produce an overnight jump. Nothing is spread across a structural break, or back to a country's first night.

A change measured across missed nights moves the country line as much as that many ordinary nights would, so a long gap needs a larger sample than one night does. When the gap spans 2 or more missed index dates, the change is used only when at least 50 products matched across it. Below that minimum the gap contributes nothing: the store simply picks up again from the night it returns. A store that misses fewer index dates than that (typically a single night) needs only the ordinary minimum of 10 products (section 5).

Published values can change. Because of this spreading, earlier points of a country's series are revised when a store returns from a gap. A gap change also rests on whatever products matched across it, which can be a small sample.

11.Structural breaks

Some nights mark a change in how a store was measured — the scraper switched from promotional to regular prices, or the site served a different branch — rather than a change in prices. On these listed nights the store's change is set to 0%.

12.Mirror stores

12 store tables turned out to copy another store's prices (the site ignored the branch or country requested). They are excluded from the index, from every count on this site, and from the global comparison, for their whole history.

13.Dropped countries and restarts

A country is dropped from the current ranking when none of its stores has a measured change within 7 days of the newest index night. Its history is kept, and it returns when a store does.

When a country has no measured change from any store for more than 14 days, and no store's later change is measured from before that hole, its line restarts at 0% on the first night after the hole instead of being spliced across it. What follows such a hole is usually a different basket, often a different retailer; chaining across it would count the empty weeks as 0% and stitch two shops into one series. A hole that a returning store bridges with a measured change is not a restart (section 10). The rows before a restart stay in the database; they are not part of the published line.

A country whose stores matched a median of fewer than 200 products a day over the last 30 index nights is flagged as thin in the app.

14.Category breakdown

The per-category view uses the same matching, food filter, gap spreading and geometric mean, split by a category assigned to each product when it is scraped (by a multilingual name classifier), with at least 3 matched products per category and night. The minimum sample for changes measured across 2 or more missed index dates (section 10, at least 50 products, counted over the store's categorised products) and the restart rule (section 13) apply to this view as well. Products without a category are left out of this view, and categories are not re-weighted to the country line, so they need not add up to it.

15.Global product comparison

The cross-country comparison of staples (eggs, ground beef, butter, milk, bananas) and global brands works differently from the index. It shows one current shelf price per product and country, converted to US dollars, and is chosen like this:

Each country's figure is one local product, so it is not a basket, and coverage differs by product. A country with no candidate left is shown without that product rather than with a wrong one.

Exchange rates. Current prices are converted at the latest rates from open.er-api.com; if that service is unreachable, a fixed table of approximate rates is used instead. Price histories use the daily rates stored for each date, from the same service and, for older dates, the open currency-api. Both are market reference aggregators that track the official rates; they are not any central bank's published fixing. Where a parallel-market rate differs from the official one, the dollar figure overstates what the price is worth locally. These requests are made by the server and carry no visitor data.

16.The real cost: what the government takes

Next to shelf prices, the app shows what food really costs you in each country: the 100 you pay at the till, plus what the government takes from you on top. For example: “Canada: $100 of groceries really costs you $179. You pay $100 at the till. The government takes another $79 from you in taxes and borrowing.”

How 179 is worked out.

  1. Take everything the government raises in a year — taxes, social security contributions and its other income — as a share of everything the country produces (GDP).
  2. Add what the government borrows that year, also as a share of GDP. Borrowing counts because it is paid back later out of taxes. A government that saves instead lowers the figure.
  3. Divide that total by what people spend (household spending), again as a share of GDP. Because both are shares of the same GDP, GDP drops out: this says, for every 100 that people spend, how much the government takes on top.
  4. Round it to a whole number and add it to 100. That is the real cost.

In round numbers, for Canada (2024 government figures, 2025 spending): the government raises 42 and borrows 2 for every 100 the country produces, and people spend 56 of that 100. (42 + 2) ÷ 56 × 100 = 79. So 100 of groceries really costs 100 + 79 = 179. The app uses the exact published figures, not these rounded ones.

Where the figures come from.

Figures more than 3 years apart are never put together. For 14 countries the IMF's figure covers only part of government (central government only, or the public sector including state-owned companies, by the IMF's own notes). There the bigger of the IMF and World Bank figures is used, because it leaves less out.

How sure we are. Each country is marked H (high), M (medium) or L (low). H: the figures cover all of government. M: an approximate figure — this country's government figures are incomplete (those 14 countries). L: people spend under 35% of GDP, a sign that GDP itself is inflated — usually by foreign companies' profits booked there; the real cost is not affected, but the country's figures are less certain. Where the published figures cannot be put together, the app shows an older estimate instead and marks it as one we can no longer check. On the ranking, low-confidence countries carry a ~.

What this number is not.

17.What is never done

Stored prices are never deleted or overwritten to make the index look better. Since 3 September 2026, a price is not stored in the first place when it fails the price-sanity rule at insert (section 3); earlier prices were stored as scraped and are screened by the same band at index time (section 4). A stored value found to be wrong is corrected to the right value rather than removed. Exclusions (partial and slice nights, thin nights, breaks, mirrors, restarts) are applied when reading, not by removing rows, so every such judgement stays reversible.

18.Known limitations

Faults that are found are corrected; the index is then recomputed for the affected period.

19.Coverage by country

(live) 72 countries measured in the 7 nights to 2026-11-03. Stores = stores with a measured night in that week; products = store-product price comparisons on 2026-11-03, summed over the country's stores (a chain scraped in several cities counts its catalogue once per city table). “Measured since” is the country's first measured night; where a restart applies (section 13), the published line begins later.

CountryStoresPrice comparisonsMeasured sinceLast measured
Argentina 5 18,371 2026-03-19 2026-11-04
Australia 3 11,283 2026-03-17 2026-11-04
Austria 3 222 2026-03-17 2026-11-04
Bangladesh 1 — 2026-03-19 2026-11-01
Belgium 4 13,595 2026-03-19 2026-11-04
Brazil 4 14,104 2026-03-19 2026-11-04
Bulgaria 2 295 2026-03-19 2026-11-04
Canada 2 50,039 2026-03-19 2026-11-04
Chile 3 25,880 2026-03-19 2026-11-04
China 1 87 2026-03-19 2026-11-04
Colombia 4 27,926 2026-03-19 2026-11-04
Costa Rica 1 6,555 2026-03-19 2026-11-04
Croatia 3 9,196 2026-03-19 2026-11-04
Cyprus 1 257 2026-03-20 2026-11-04
Czech Republic 3 8,492 2026-03-17 2026-11-04
Denmark 2 2,727 2026-03-17 2026-11-04
Ecuador 2 7,287 2026-03-19 2026-11-04
El Salvador 1 5,276 2026-03-19 2026-11-04
Estonia 4 23,436 2026-03-19 2026-11-04
Finland 2 — 2026-03-19 2026-11-04
France 5 1,365 2026-03-15 2026-11-04
Germany 7 24,576 2026-03-15 2026-11-04
Greece 3 10,765 2026-03-19 2026-11-04
Guatemala 2 11,861 2026-03-19 2026-11-04
Honduras 3 11,836 2026-03-19 2026-11-04
Hong Kong 1 88,054 2026-03-19 2026-11-04
Hungary 4 8,997 2026-03-19 2026-11-04
Iceland 1 5,514 2026-03-19 2026-11-04
India 1 2,795 2026-03-19 2026-11-04
Indonesia 1 12,295 2026-03-19 2026-11-04
Ireland 3 13,692 2026-03-19 2026-11-04
Israel 1 13,207 2026-03-19 2026-11-04
Italy 5 22,737 2026-03-16 2026-11-04
Jamaica 0 — 2026-05-26 2026-10-19
Japan 1 6,025 2026-03-17 2026-11-04
Kenya 1 2,940 2026-05-26 2026-11-04
Latvia 3 17,441 2026-03-19 2026-11-04
Lebanon 1 — 2026-05-27 2026-10-31
Lithuania 3 18,794 2026-03-19 2026-11-04
Malaysia 1 8,065 2026-03-19 2026-11-04
Malta 1 129 2026-03-21 2026-11-04
Mexico 3 41,920 2026-03-19 2026-11-04
Myanmar 1 2,854 2026-05-26 2026-11-04
Netherlands 4 36,555 2026-03-17 2026-11-04
Nicaragua 1 3,668 2026-03-19 2026-11-04
Nigeria 1 8,281 2026-05-26 2026-11-04
Norway 5 20,119 2026-03-15 2026-11-04
Pakistan 1 4,645 2026-03-19 2026-11-04
Panama 1 4,292 2026-03-19 2026-11-04
Peru 4 18,494 2026-03-19 2026-11-04
Philippines 1 — 2026-03-20 2026-10-31
Poland 2 847 2026-03-17 2026-11-04
Portugal 2 484 2026-03-20 2026-11-04
Romania 4 5,748 2026-03-19 2026-11-04
Russia 2 492 2026-09-06 2026-11-04
Saudi Arabia 1 12,269 2026-03-21 2026-11-04
Serbia 4 12,172 2026-03-19 2026-11-04
Singapore 1 10,854 2026-03-19 2026-11-04
Slovakia 1 — 2026-03-20 2026-11-01
Slovenia 3 760 2026-03-19 2026-11-04
South Africa 1 6,710 2026-03-19 2026-11-04
South Korea 1 14,267 2026-03-19 2026-11-04
Spain 7 20,509 2026-03-16 2026-11-04
Sri Lanka 1 2,332 2026-06-16 2026-11-04
Sweden 24 171,085 2026-03-04 2026-11-04
Switzerland 3 2,111 2026-03-17 2026-11-04
Taiwan 1 40,391 2026-03-20 2026-11-04
Thailand 2 31,481 2026-03-17 2026-11-04
Turkey 2 6,821 2026-03-20 2026-11-04
United Arab Emirates 0 — 2026-03-23 2026-08-26
United Kingdom 9 74,774 2026-03-15 2026-11-04
United States 38 275,452 2026-03-10 2026-11-04
Uruguay 1 4,972 2026-03-19 2026-11-04
Vietnam 1 4,808 2026-03-20 2026-11-04