Methodology and data sources
How prices get from supermarket shelves to the numbers on this site.
Where the data comes from
Since the introduction of the euro, Bulgarian retail chains with an annual turnover above 10 million leva are required by law (Euro Introduction Act, art. 55b) to report their individual shelf prices every day to the Consumer Protection Commission (КЗП). The Commission publishes them as daily open-data archives at kolkostruva.bg/opendata.
Each archive contains one file per reporting company with, for every store: the settlement, the store, the product name and code, the Commission's basket category, the regular price and the promotional price. We import every archive once a day and keep every observation permanently. We do not scrape retailer websites.
The portal only lists the last two weeks of archives, so our history starts on the day we began importing. Reports also cover drugstores, pharmacies and non-food items; we keep food only.
From thousands of listings to one product
Retailers describe the same thing in many ways — “Домати на кг”, “ДОМАТ ЧЕРВЕН”, “Домати клас I”. We group listings into a small set of canonical products (for example “Tomatoes, per kg”) using the Commission's category code, keyword rules and reviewed aliases.
We are deliberately conservative. Cow and sheep cheese, fresh and long-life milk, ground coffee and beans, whole chickens and fillets are always separate products. Anything ambiguous is left out until a person has reviewed it. This means each product's price is based on a subset of all listings — but on listings that are genuinely comparable.
Pack sizes are converted to a common unit (500 g at €2 becomes €4 per kg). We never convert between weight and volume, and listings with an unclear pack size (“approx. 1.4 kg”, or a bottle size together with “6 pcs”) are excluded.
The headline price: the median
For every product and day we compute the median, average, minimum and maximum regular shelf price across all stores — nationally, for each city and for each retail chain — together with the number of prices, stores and retailers.
The median is the headline price: half of the stores charge less, half charge more. Unlike the average, it is not pulled up or down by a single store's promotion or by an odd price. The average is shown as secondary information.
Suspicious prices are flagged, never deleted
Each day, before any statistic is computed, every price is checked against that day's median for the product:
- more than 10× the median (typically a pack price read as a per-kg price),
- more than 90% below the median (typically a per-100 g price or a typo),
- outside a plausible price range for the product (an impossible unit conversion),
- more than 3× above or below the median (very likely a mislabelled item).
Flagged prices stay in the permanent history with the reason, but are left out of all statistics.
How price changes are measured
A change compares today's median with the median on an earlier day: (current price − previous price) ÷ previous price. If there is no data for the exact earlier date (weekends, holidays, missed reports), we use the nearest earlier day with data within a tolerance — up to 4 days for 1D, 3 for 7D, 7 for 30D, 14 for 3M and YTD, and 31 for 1Y. If no such day exists, we show “—” rather than guess.
A median can also move without any shop changing a price — for example when a large chain skips a day of reporting. On real data we have seen medians move by 25% overnight for exactly this reason. So every change is cross-checked against a like-for-like measure: the same products in the same stores on both dates. If the two disagree, or there are fewer than three prices on either date, the change is not published and we explain why.
Food Basket Index
The basket contains 32 everyday foods with fixed weights reflecting their importance in household food spending. Its index moves with the like-for-like price changes of those foods, so it never jumps because of reporting gaps, and equals 100 in the base period. An index of 108.4 means the same basket costs about 8.4% more than in the base period.
It is an independent indicator calculated by this platform with its own selection of products, weights and method — not an official inflation index.
Currency
All prices are in euro. Bulgaria adopted the euro on 1 January 2026; where a source reports leva we convert at the fixed rate of 1.95583 BGN per EUR and keep the original value.
Limitations
Prices are what retailers report; we cannot verify them on the shelf. Some companies have submitted another company's file under their own name — we detect identical files and leave them out rather than guess. The basket index is an illustration of everyday costs, not an official consumer price index.