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).
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.
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.
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.
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.
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.
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.
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.
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.
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 reporting | Usual (median) |
|---|---|---|
| 2026-08-01 | 72 | 195 |
| 2026-08-06 | 9 | 193 |
| 2026-09-01 | 91 | 177 |
| 2026-09-07 | 47 | 172 |
| 2026-09-11 | 45 | 177 |
| 2026-10-01 | 48 | 190 |
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).
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%.
hktvmall — 2026-04-15hktvmall — 2026-04-16auchan — 2026-09-18carrefour-ar — 2026-10-07carrefour-ar — 2026-10-0812 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.
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.
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.
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.
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.
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.
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.
Faults that are found are corrected; the index is then recomputed for the affected period.
(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.
| Country | Stores | Price comparisons | Measured since | Last 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 |