Methodologie

Deze pagina beschrijft precies wat we meten en hoe — inclusief de plekken waar de methode wringt. Geen “geavanceerde algoritmes”: een productcatalogus met reguliere expressies en bandbreedtes, een database-query, en een aantal keuzes die we liever uitleggen dan verstoppen.

Omfietser in cijfers

7

winkels waarvan we prijzen bijhouden

5

winkels in de boodschappenmanden

± 67.000

actieve producten

24

unified categorieën

± 4,8 miljoen

prijspunten sinds april 2025

± 3 keer

ververst per week

Waar de data vandaan komt

We houden prijzen bij van zeven winkels: Albert Heijn, Jumbo, PLUS, ALDI, SPAR, SPAR express en Kruidvat. Alle prijzen worden omgerekend naar een standaardeenheid — per kilo, per liter of per stuk — zodat verpakkingsgrootte de vergelijking niet vertekent.

De boodschappenmanden gebruiken maar vijf van de zeven: Albert Heijn, Jumbo, PLUS, ALDI en SPAR. Kruidvat en SPAR express blijven buiten de mandberekening, om twee concrete redenen:

  • Kruidvat is een drogisterij. Van de 7.353 producten die we er bijhouden, voert Kruidvat vrijwel geen boodschappen: nul in Aardappel, groente, fruit, nul in Zuivel, eieren, boter, nul in Vlees, vis. Een boodschappenmand daar prijzen zou een drogist tegen een supermarkt afzetten.
  • SPAR express is een gemaksformule op tank- en stationslocaties met ongeveer 1.100 artikelen en geen dekking in meerdere mandcategorieën. De prijzen weerspiegelen een andere winkelformule, geen volwaardige supermarkt.

Beide blijven gewoon in de database staan en hebben een eigen winkelpagina — ze worden alleen niet meegeteld in de mandtotalen.

De data wordt gemiddeld ongeveer 3 keer per week ververst. Dat is geen vast schema van “elke zoveel uur”, en zeker geen realtime voorraadsysteem — het is simpelweg hoe vaak het in de praktijk gebeurt, en we noemen liever dit dan een preciezer getal dat we niet kunnen waarmaken.

Hoe we producten matchen

We proberen niet om “hetzelfde product” bij vijf winkels te vinden. Twee redenen, allebei empirisch.

Ten eerste verkopen de winkels grotendeels andere producten; huismerken domineren het budgetsegment. Ten tweede hebben we wél een tabel met kruisverbanden tussen vergelijkbare producten, maar die tabel is te dun én te rommelig om er één koptekst-prijsverschil op te baseren.

Te dun. De tabel bevat 48.759 paren, waarvan 28.357 op het niveau dat we “identiek” noemen. Neem je bij een product alles wat daar als identiek aan genoteerd staat, dan dekt zo’n groep hoogstens 4 van de vijf mandsupermarkten — geen enkele groep dekt ze alle vijf.

Te rommelig. Op datzelfde “identieke” niveau staan koppelingen die aantoonbaar niet kloppen: de Yum Yum Japanese chicken flavour instant noodles van Albert Heijn staat er genoteerd als identiek aan de Yum Yum Bami Soep Shoyu Saus van PLUS — hetzelfde merk, een ander product. Een overeenkomst-score helpt daar niet tegen, want op dat niveau draagt élke rij precies dezelfde score: die score onderscheidt niets.

In plaats daarvan is elk mand-item een specificatie: een productcategorie, een eenheid, een regex-patroon voor wat wél moet matchen, een regex-patroon voor wat niet mag matchen, een aannemelijke bandbreedte voor verpakkingsgrootte en een aannemelijke bandbreedte voor de prijs. Bij elke winkel nemen we het goedkoopste product dat aan de specificatie voldoet, inclusief aanbiedingen — dus de prijs die je er vandaag voor betaalt. De opzet met specificaties in plaats van identieke producten volgt de Consumentenbond, en het is de enige aanpak die deze data eerlijk aankan. Op één punt wijken we bewust van ze af: hun prijspeiling is uitdrukkelijk exclusief aanbiedingen, en die van ons niet. Zij meten het prijsniveau van een winkel; wij laten zien waar je vandaag het goedkoopst uit bent.

Een echt voorbeeld uit de itemcatalogus:

key:        'halfvolle-melk'
unit:       'l'
include:    'halfvolle melk'
exclude:    'choco|karne|koffie|geit|lactosevrij|poeder'
packMin:    0.9   packMax: 2.0   // een huishoudpak, geen 6-pack
priceMin:   0.4   priceMax: 2.0  // alles daarbuiten is een datafout

Elke regel in de catalogus is met de hand tegen de echte productdata getoetst: het gematchte product per winkel moest herkenbaar hetzelfde soort ding zijn.

De regels

  • Aanbiedingen tellen wél mee. We laten de prijs zien die vandaag op het schap staat, actie en al. Dat maakt de vergelijking gevoeliger voor de dag waarop je kijkt — een winkel kan vandaag de goedkoopste zijn en volgende week niet — en dat is precies wat we willen tonen. De Consumentenbond doet het andersom en meet zonder aanbiedingen, omdat zij het structurele prijsniveau van een keten meten en niet de prijs van vandaag.
  • Biologische producten tellen niet mee. Dit zijn budgetmanden; een biologische variant is een andere productkeuze. De uitsluiting zit centraal in de database-query (één regel voor “bio” of “biologisch” in de titel), niet in elk van de 76 itemregels apart — toen dat nog per item ging, wonnen een biologische melk en een biologische spaghetti stilletjes hun eigen rij.
  • Het goedkoopste kwalificerende product wint. Bij elke winkel gaat het om het goedkoopste product dat aan de specificatie voldoet — wat een prijsbewuste boodschapper feitelijk zou kopen.
  • Bandbreedtes voor verpakking en prijs. Geen tuning voor de mooiste uitkomst, maar filters tegen concrete fouten. Zonder verpakkingsband “won” ALDI de ui-vergelijking met een zak van 5 kilo tegen €0,40 per kilo — goedkoper per kilo, maar geen vergelijkbare aankoop naast een pak van 1 kilo. Zonder prijsband stond een afwasmiddel-navulling van 500 ml in onze data genormaliseerd als 250 liter, wat €0,01 per liter opleverde en die rij zou hebben gewonnen.
  • Ontbreken bij één winkel = overal geschrapt. Een item dat we niet bij alle vijf de supermarkten kunnen prijzen, telt bij géén van de vijf mee. Zo dekken alle vijf totalen precies dezelfde set producten. Geschrapte items worden niet stilgehouden: ze staan apart vermeld op elke mandpagina.

Drie manden, drie vragen

Nederland heeft geen officiële standaardboodschappenmand. Wij rekenen er drie apart door op dezelfde echte prijzen, en zetten ze bewust niet op één hoop — “goedkoopste supermarkt”, “minimaal benodigd budget” en “boodschappeninflatie” zijn drie verschillende vragen met drie verschillende antwoorden.

  • Consumentenbond-stijl — welke supermarkt is het goedkoopst? Eén eenheid van elk item, per winkel het goedkoopste kwalificerende product.
  • Nibud-stijl — wat kost een gezonde week eten? Dezelfde items, in de hoeveelheden die het Voedingscentrum aanbeveelt voor één volwassene van 19–50 jaar. Dit is een representatieve deelmand, geen volledig dieet, en dus niet gelijk te stellen aan de Nibud-norm van € 272 per maand.
  • CBS-gewogen — hoe verhouden de winkels zich op wat mensen écht kopen? Elke CBS-productgroep telt naar rato van zijn aandeel in de Nederlandse bestedingen aan voeding. De uitkomst is een index, geen eurobedrag.
Bekijk alle drie de manden en de losse prijzen

Wat we bewust niet publiceren

Soms is er wél een getal te maken, en kiezen we ervoor dat niet te doen. Het duidelijkste voorbeeld: bananen staan helemaal niet in de mand. Albert Heijn en ALDI prijzen een hele tros (“1 stuk”), Jumbo prijst één losse banaan, en alleen PLUS en SPAR prijzen per kilo. Onze data bevat geen omrekening tussen tros, stuk en kilo, dus elke keuze zou verschillende hoeveelheden met elkaar vergelijken. Een bananenprijs was makkelijk te produceren geweest — en zou fout zijn geweest.

Twee vergelijkbare gevallen: volkorenbrood wordt per stuk geprijsd omdat Albert Heijn en ALDI geen kilo-geprijsd heel brood voeren, terwijl SPAR volkorenbrood juist alléén per gewicht verkoopt — SPAR heeft daardoor geen match en het item wordt als gat gerapporteerd, niet geforceerd over onvergelijkbare eenheden. En wasmiddel matchte lange tijd bij vier winkels, tot bleek dat “wasmiddel” een substring is van “afwasmiddel”: de vergelijking zette afwasmiddel bij Albert Heijn af tegen wasmiddel bij de rest. Na correctie vallen Albert Heijn en ALDI weg, omdat beide vloeibaar wasmiddel alleen als aantal wasbeurten registreren, nooit als flesvolume — vier winkels werden drie, en die drie kloppen.

De regel is steeds hetzelfde: waar de data geen eerlijke vergelijking toestaat, publiceren we liever niets dan een misleidend getal.

Bekende beperkingen

Deze zijn reëel, en we vertellen ze liever zelf dan dat een lezer ze ontdekt.

  1. Een breed assortiment wint van een discounter. PLUS voert bijna 17.000 producten en kan bij bijna elk item een spotgoedkope huismerklijn inzetten; ALDI voert er bewust maar zo’n 2.000 en biedt meestal precies één optie. Onze methode “goedkoopste kwalificerende product” bevoordeelt daardoor structureel winkels met een breed assortiment. Dat is een eigenschap van de methode, geen meting van wie goedkoper is voor een echt volle winkelwagen.
  2. We prijzen een schap, geen winkel. De gewone aanbiedingen tellen mee, maar een persoonlijke loyaliteitskorting, reiskosten en voorraad niet. Een prijs die in de data staat, kan in het schap niet meer op voorraad zijn, en een actie kan aflopen tussen ons meetmoment en jouw bezoek.
  3. De itemlijst is klein. 76 specificaties tegenover een database van ± 67.000 producten. De lijst uitbreiden blijft de belangrijkste geplande verbetering.
  4. De categorie-indeling is de onze, niet die van de winkels. Producten worden bij het inladen in 24 unified categorieën ingedeeld. Fouten in die indeling werken door in de manden.
  5. Een grote prijsspreiding maakt een item minder vergelijkbaar. Betaalt de duurste winkel meer dan ongeveer 2,2× de goedkoopste voor hetzelfde item, dan matcht de specificatie waarschijnlijk verschillende dingen bij verschillende winkels. Dit wordt gemarkeerd in de uitkomst, niet verborgen.
  6. De CBS-koppeling is een benadering. Het CBS splitst vlees en vis, en groente en fruit; onze categorie-indeling volgt die knip niet altijd hetzelfde. Elk item krijgt zijn CBS-groep individueel toegewezen — een inschatting, en die toewijzing staat voor iedereen inzichtelijk in de itemcatalogus.