The tourist trap costs 85 cents

What 33,000 menu prices say about who really overcharges in Amsterdam, and for what

Author

Dei Martinez Elurbe

Published

July 3, 2026

I have lived in San Sebastián, Alicante, Barcelona and now Amsterdam: four cities that spend their summers being visited. I would dare to say I can spot a tourist trap when I see one. Amsterdam’s locals certainly can; the standing advice here is that if value matters to you, you do not sit down on the Damrak, the tourist strip between Central Station and Dam Square.

I wanted to know what that instinct is actually worth, so I measured it: about 900 restaurant menus collected from the public web, 33,000 priced dishes cleaned and classified, and a statistical model whose only job is to refuse unfair comparisons: never a steakhouse against a snackbar, never a dessert against a main.

The tourist trap is real. It costs about 85 cents on a twenty-euro main.

I had expected the trap to be far larger: the kind of price gap that blows you away. It is not. Spotting a trap and sizing one, it turns out, are different skills, at least in Amsterdam. This was not the story I set out to tell, and it is better. Because if location is not what decides your bill, something else is, and that something is sitting in plain sight, printed on the menu.

The trap is real, and it is small

Comparing restaurant prices across a city is easy to do wrong. Centre restaurants are not the restaurants of Bos en Lommer: different dishes, different kinds of place, different ambitions. Compare averages and you mostly measure what kind of restaurants stand where. So the model compares like with like only, pizzerias against pizzerias, starters against starters, and asks what tourist intensity alone adds to the price of the same kind of dish.

The answer: about +4% per big step into tourist territory. In dishes you can picture: a €17.50 pizza picks up a bit under €2 between the city’s calmest and busiest corners. A main course that costs €20.60 in the hotel-dense heart of town runs about €18.50 out in Zuidoost. That is the whole gradient. The title’s 85 cents is one rung of that ladder, quiet street to noticeably touristy one; the two euros is the whole climb. And the premium follows tourist beds, not tourist photo spots: it tracks where hotels and Airbnbs are dense, while being around the corner from the Rijksmuseum, by itself, adds nothing.

Eighty-five cents surprised me. I had expected a headline villain and found small change, and a result that surprises you is a result you should try to break. So I attacked it with the most Dutch instrument imaginable: the bitterbal, the bite-sized deep-fried snack served with beer in cafés across the country. Most cafés buy near-identical bitterballen from the same few suppliers, which makes it a commodity: the same product at every bar, so any price difference is the setting, never the food. No chef, no recipe, no portion mystery. Across 138 venues, the price per piece climbs with tourist exposure exactly as the model says it should. The size of it in practice: a plate of eight costs about €9.75 in the city’s quietest third and €10.93 in the busiest. The difference is one bitterbal. Order eight in the centre, pay for nine.

Figure 1: The gradient on a map: what location alone does to the same dish, neighbourhood by neighbourhood (blue cheaper than the city average, red dearer; colour scale capped at ±8%). Hover or tap a neighbourhood for its name and premium. End to end the gap is about 11%: call it €2 on a €20 main.

So why does dinner in the centre feel so much more expensive than 4%? Because it is. Just not through a surcharge on your plate. The centre selects what gets sold in it: steakhouses show up there 2.6 times as often as in the rest of the city, and the selection runs both ways: the centre’s 309 venues include 32 steakhouses and not one tagine kitchen, while Nieuw-West holds no steakhouse and half the city’s tagine. Any local can finish the story: the visitor with one evening in town rarely leaves the centre, and rarely gambles that evening on an unfamiliar menu. My data cannot prove the motive. It can only show the footprint, and this is what one looks like. The trap is not on the price tag. It is in which menu you are handed. That distinction runs through everything that follows.

The plate decides. The room whispers.

Here is the whole project in one exercise. I tell you nothing about a dish somewhere in Amsterdam, and you must guess its price. Your honest guessing band runs from €4 to €28.50: a range, not a number, and wide enough to be right nine times out of ten.

Now I give you one fact: it is a beef carpaccio, served as a starter. Your best guess becomes €15, and your band collapses to €11.50 to €23.

Now I give you two more: the venue is a café, and it stands in Noord. Your guess slides down to about €12, and the whole band slides with it, to roughly €9 to €18. But it is still nine euros wide. Knowing the place moved your guess. Only knowing the dish shrank it.

Three horizontal price bands: knowing nothing spans 4 to 28.50 euro; knowing it is a carpaccio starter spans 11.50 to 23; adding cafe in Noord shifts the band down to about 9 to 18 without narrowing it. Dots mark the best guess on each band.
Figure 2: The guessing game, drawn. Each new fact about the dish or the venue moves or shrinks your guessing band, the range wide enough to be right nine times out of ten. The one that does the real work is knowing what the dish is.

Play the same game with all 33,000 prices at once and the exercise becomes numbers: of everything that separates one price from another in this city, what the dish is accounts for 59%; which venue serves it, 17%; where that venue stands, about 3%. The rest is the ordinary scatter of individual menus. In one line: the plate outweighs the postcode twenty to one. In euros: swap your friet for a dorade and the bill moves about €19. Take the same carpaccio to a clearly more expensive venue and it moves about €4. Move that venue across town and it moves a euro or two. What you pay is what you order, not where you sit. And the carpaccio’s remaining range is not geography either: that same €11.50-to-€23 band exists, almost untouched, inside every single borough.

The room does whisper, though, and what it whispers is worth hearing:

  • A café serves the same dish for 11% less than a restaurant. Same carpaccio, same city, smaller bill. The best money-saving move in Amsterdam is not choosing a neighbourhood; it is choosing a café over a restaurant.
  • Fancy shows up in menu language before it shows up in the bill, and it speaks two dialects. The first is the one you would expect: venues that write long, loving descriptions charge a few percent more for the same dish. The second nearly fooled me: the modern fine-dining menu that has stopped writing sentences at all (“krab · lavas · courgette”). To my model those three quiet words looked plain, so it filed some of the city’s most expensive kitchens among the cheap ones. I caught it because I know what fancy menus look like these days. Separate the two dialects and both signals sharpen; the wordless menu alone carries about +7%. Climb the ladder from plain wording to standard, to flowery, to barely-there: the same dish gets steadily dearer. The model needed a restaurateur’s eye more than it needed another parameter.

And then there is the part I kept circling back to: where the upscale premium actually lands. What protects a price is an anchor: a dish familiar enough that you would notice the markup. The anchored dishes barely move no matter how ambitious the venue, and that includes the classic desserts; a tiramisu is pinned by the whole city’s tiramisus, just like the carpaccio. The premium lives where the anchor is missing. The clearest case in the data is the bread course, where the upscale premium runs to +21%: nobody walks in knowing what “housemade sourdough and whipped butter” should cost. We just know that baking good sourdough is a skill, and we are ready to pay for it. And at the far end of the menu sits the dessert nobody can price because nobody has seen it before: the composed, plated, passionfruit-tiramisu kind, which clusters at the wordless-menu kitchens already carrying that +7%. Pricing power, the freedom to charge more, lives where the diner has no anchor.

The going rate for everything

Because every dish in the dataset carries an identity card (what it is, what protein, how it is made, how it is served), the whole city collapses into a price atlas: 200 dish-types, each with a typical price and an honest range. Carpaccio: €15, and 9 out of 10 of them cost between €11.50 and €23. A margherita pizza: €16 (€9.90 to €22.30). A pasta carbonara: €18.50 (€13.50 to €27). Friet: €5.80 (€2.50 to €9.60). The bitterbal you already know: €1.33 a piece.

Dot and interval chart of eight recognizable dishes sorted by typical price, from friet at 5.80 euro to fish curry at 21.80, each with its 90 percent range.
Figure 3: The going rates: typical price and the range 9 in 10 of them actually land in, for eight dishes everyone can picture.

The ranges are not sloppiness, and they are not a map: cross the city and a dish’s band barely moves; the cheap and the dear version are usually a walk apart, not a city apart. They are the anchor idea again, made visible. A pizza is anchored twice over: everyone already knows what a pizza should cost, and however premium the toppings, it is still a pizza. Its price barely wanders. A borrelplank, the mixed snack board ordered with drinks, has no anchor to hold it: the same menu line covers supermarket cheese cubes with worst, the bargain sausage, and an ibérico charcuterie board, and its honest range runs from €10 to €50. When a name neither pins down the product nor calls up a price you already carry in your head, the price is free to wander, and the atlas shows you exactly how far each dish-type does.

The quietest finding is my favourite. Price the same ordinary dinner, a starter with burrata, a pasta main and a cheesecake for dessert, in every part of the city, and it costs €35 to €38 everywhere. Not one borough breaks from the centre by more than the noise in the data. For all the folklore about neighbourhoods, Amsterdam’s kitchens have quietly converged on one price for the standard evening out. The differences that remain live at the edges, with the distinctive dishes and ambitious venues, not in the burrata, the pasta and the cheesecake that most evenings out are actually made of.

What it took, and what it is for

To get here I had to build the instruments, because none of them existed: an identity card for every dish (dish names lie; the word “carpaccio” alone names five different products at five different prices), a working classification of the ~900 venues whose menus can be read from the public web, a pricing model for the tourist premium, and one deep-fried commodity index: the bitterbal, of course. Public data end to end: menus from restaurant websites, OpenStreetMap, the city’s open statistics.

Two honesty notes that matter more to me than any headline. The first: this is a snapshot, June 2026, covering roughly 4 in 10 of Amsterdam’s restaurants, and, by the nature of the method, leaning toward the venues that publish a priced menu online. The second is a story of its own, and one day I may tell it properly: the project’s original flagship, a per-venue value map, a “deal or premium” verdict for every restaurant in town, does not exist, because when I audited it, the numbers behind any single venue could not honestly support verdicts about named businesses. I killed my own favourite product and rebuilt around what the data could defend: dish-types and neighbourhoods, never a named venue.

The menus fought back, for what it is worth. Somewhere in this dataset, a menu prices children by age bracket and by the hour: an 8-to-10-year-old runs €27 for two and a half hours, Tuesday to Thursday. My parser read that, correctly concluded it was not a dish, and moved on. Thirty-three thousand clean prices meant teaching a machine a few thousand judgment calls like that one.

One more thing, and it is the honest reason this project exists. When the model misfiled the city’s most expensive kitchens, what caught it was a restaurateur’s eye, and that eye came from somewhere. My family ran cafeterías in San Sebastián and Alicante, and my aunt has run her restaurant in Alicante for forty years; I worked seven full summers in it. Then came ten years as a research scientist in universities, and since 2023, my own practice. This project is where the two lives finally met: the industry I know from the inside, measured with the care I was trained to.

And here is why I think it matters beyond dinner. Every number above came from the public exhaust of one industry: no bookings, no receipts, no point-of-sale feed. If the menus a city leaves lying around on the public web carry this much signal about pricing power, homogenisation and where margins hide, imagine what the data your company already owns could answer. Those are the questions I want to spend my days on.

The full methods, models and stress tests are one click deeper: the dossiers. If your business runs on menus, baskets or price perception, I would genuinely enjoy comparing notes: dei@deita.eu.

Data: OpenStreetMap, restaurant websites, Open Amsterdam / CBS. Snapshot · June 2026. Methods and code: github.com/deielurbe/amsterdam-menus.