What a leu buys, read off the menus

How this is worked out

A ranking that will not say where its numbers come from is asking to be believed rather than read. This is where they come from, what is thrown away before you see it, and how much of the catalogue any of it covers.

At the foot of the page is what the numbers turned out to say — one set of figures, every size, the same price in 37 cities.

On sale
2399
priced somewhere we look
Ranked on value
647
27% of what is on sale
Restaurants
276
Cities
38

What is measured

Two ratios, and the same two said as money. Calories per leu is the energy of a portion divided by what it costs. Protein per leu is the same with the protein. The cost of 100 kcal and the cost of 10 g of protein are those two turned upside down, which reorders nothing and reads better for some people.

Two more lenses sort by the calories a portion holds and by its protein. Value for money is one question and whether something is a meal is another: the top of protein per leu is often the cheapest item on a menu carrying eight grams of it.

Two lenses go the other way and put the least first, each on a share of the portion's weight rather than on grams. Least carbohydrates asks what part of the portion is carbohydrate, and least sugar what part of it is sugar, so a plate of food is not beaten by a mouthful of the same thing. The grams of carbohydrate -- what a dose is worked out from -- are on every row whichever lens is chosen; on these two the grams of sugar are beside them.

Least first is the one order that brings a wrong figure to the top instead of burying it, so these two leave out drinks and sauces, anything no category places -- an extra of 50 g of cheese carries less carbohydrate than any meal, by the nature of being an extra -- and any product whose own figures disagree: more sugar than the carbohydrate it is part of, or energy more than 30% away from what its protein, carbohydrate and fat add up to. They are the chains' figures, sorted, and not dietary advice.

Which units the two ratios are written in is a choice kept in your browser rather than in the address, like the theme. It reorders nothing: the cost of 100 kcal is the reciprocal of calories per leu.

The ranking is worked out when you ask for it, never stored. A promotion that ends at midnight stops counting at midnight, with nothing scheduled to make it so.

Nothing is held back from it by price. The ranking had a floor for a while -- seven lei, stated in a box on the page -- and it is gone: a figure that quietly removes a tenth of the catalogue is a figure the reader has to know about before the list means anything, and most never pressed it. What can be held back instead is a whole category, by an editor, and sauces were the first: a 100 ml pot of dip is 691 kcal for 14 lei and beat anything anybody would call lunch. A category taken out is not offered in the filter either, and its products stay on their own pages and in the offers.

What a product is

The platform gives the heading a chain printed above a shelf, and the chains agree neither with each other nor with themselves: SOSURI, "Cartofi, Snacks și Sosuri", and 136 more. Filtering by those would be filtering by one chain's vocabulary.

So each product is filed under one of thirteen categories, from that heading and from its own name: a heading counts for more, because it is what the chain meant, and the name settles the headings that name three things at once. A product neither places is left unfiled and keeps its chain's own heading rather than being guessed at. An editor can also put a product under up to two more of them, and filtering by either finds it there too: McDonald's Hamburger, filed under For children by its Happy Meal shelf, is also under Burgers. It is still counted once, under its own category, and ranked once.

Where the numbers come from

Menus, prices and stock come from the delivery platform the chains publish on, read five times a day in each of 38 cities, at the hours menus change. Each restaurant states its own menu, so a price belongs to a branch rather than to a brand, and a product's price here is the least any branch is asking for it. Choosing a city quotes that city's own price.

Nutrition comes from the product's own screen on that platform, where a restaurant declares it. It is asked for one product at a time, only for products nothing is known about, and at most forty in a run: menus are cheap to read and declarations are not.

Discounts are read from the same menus, per restaurant: a branch running something at half price does not change what another branch charges. The platform states no dates for them, so an offer here starts when it was first seen and ends on the first read that no longer carries it. The ones running now are on a page of their own, gathered back from the branches into offers.

Declarations are entered per restaurant, and branches of one chain disagree. The same products at the same prices carry protein in one city and leave it blank in another, so every city is read and a product with something missing is asked about elsewhere.

How it is read

Only what the platform shows anybody who opens it: the pages of its website, and the requests that website makes for a visitor with no account. Nothing is ordered, nobody signs in, and nothing about any customer is read. Requests go one at a time with a pause of a second or two between them, and the reader waits longer whenever the platform says it is being asked too much.

The chains' own nutrition documents are fetched once a week. Both readers go by the same name, which says what is asking and links to this page: Mozilla/5.0 (compatible; LeuLaFarfurie/1.0; +https://leulafarfurie.com/method).

What is thrown away

These figures are typed in at the restaurant's end, and some of them are impossible. A product declaring more than 100 g of macronutrients per 100 g of food, more than 40 g of protein, more than 10 g of salt or more than 900 kcal is not describing food; the highest legitimate protein across four chains is 22.4 g. Nothing near those limits is a nutritional opinion.

One fault looks like an opinion and is not: a chain reporting 1.4 g of protein beside 14.9 g of salt for fried chicken has that row's two columns the wrong way round. The energy is kept, since it is stated separately and agrees with its own macronutrients, and the protein and the salt are dropped. The product stays in the calorie ranking and leaves the protein one.

Some restaurants declare the whole portion under a heading that says per 100 g. Which one a restaurant means is settled by proof rather than by correlation: one product whose figures cannot describe 100 g of food settles it for the whole restaurant, and a branch with nothing to prove it takes what another branch of its chain established.

What is not here

Subscriber-only prices are read and not quoted: an offer conditional on a subscription would rank a product at a price most people cannot pay.

Portions are quoted, never assembled. Where a menu states one weight it is used; where it lists several, one per component, nothing is recorded, because adding them up would publish a number the chain never did. That is why a large part of some menus carries a price and no figures.

The exception is a recipe somebody wrote down. A menu is a burger, a side and a drink, the platform declares nothing about the menu and frequently declares all three, and no reader of text can match them up because a menu names a choice rather than a product. So an editor names the parts, the figures are added up from them, and every page that shows one says it was added up rather than declared. A total comes out only where every part carries a figure, and a declaration about the menu itself replaces the sum the moment one appears.

A weight is not always needed, though. Where a restaurant has been proved to state whole portions rather than per 100 g, its figures already are the portion, and a product whose weight nobody wrote down is ranked on them. The checks that catch a crossed protein and salt column are arithmetic on a weight, so without one that pair is dropped: the product is ranked on calories and left out of the protein ranking.

Prices are shown as the branch charges them, without delivery fees, which depend on where you are rather than on what you order.

Every figure on the site says when it was last confirmed, and a price nobody has seen for a fortnight says so on the row.

Allergens

What a product contains comes from the chain's own document, the one the law obliges it to publish, and from nowhere else: the platform's menus say nothing about allergens. It is the fourteen the regulation names, as the chain states them beside each product, and what the chain says a product may carry traces of. The names a document prints are matched to the menu's the same way its figures are.

None of it is shown until a person has checked that the names were matched to the right products. That is done once per document, and again whenever a document is read and says something different. So far that is 14 of the 14 chains whose documents are read.

A product no approved document speaks for is marked as not known, and not known is not free from: it means nobody has said. Avoiding an allergen hides what a document says contains it, and what it says may contain it when traces count too. What nobody has declared stays in the lists, marked, because most restaurants declare nothing. Where a document leaves unclear whether it means an allergen or a trace of one, it is read as containing it.

What you avoid is kept in a cookie on your device and nowhere else, and can be changed here. It repeats what the chains publish, it is not medical advice, and a restaurant can tell you more than its document does.

Chains read

Burger King, Dabo Doner, Domino's, Fryday, Jerry's Pizza, KFC, McDonald's, Mesopotamia, Noodle Pack, Pizza Hut, Popeyes, Salad Box, Spartan, Starbucks, Taco Bell.

What the numbers say

Everything above is how the figures are made. These are what they turned out to show, found while reading 15 chains off one platform in 38 cities. Each figure in them is worked out as this page is drawn, so a piece stands or falls with the number in it.

One set of figures, every size

What happens to a ranking when a chain declares the same energy for every size?

Salad Box prices 15 products from 15.99 lei to 17.99 lei, which is 1.1 times the money. All of them are declared at 141 kcal, with the same protein, the same carbohydrate and the same fat. Their names say what they are: Fresh de morcovi, Fresh de mere, Fresh de grapefruit, Fresh de portocale, Fresh de grapefruit cu mar si portocale, Fresh de morcov cu portocale si grapefruit, Fresh de grapefruit cu morcov, Fresh de grapefruit cu mar si morcov, Fresh de mar cu morcov, portocale si grapefruit, Fresh de grapefruit cu mar, Fresh de morcov cu mar, Fresh de grapefruit cu portocala, Fresh de morcov cu portocale, Fresh de mar cu morcov si portocale, and Fresh de portocale cu mar.

That is not a chain being careless with a decimal. It is a figure stated per 100 g arriving on a menu that sells by the portion, and nothing on the page can tell the difference: the number comes attached to a product, the product has a price, and a ranking divides one by the other.

What the ranking makes of it
8.8 kcal / leu, the smallest
7.8 kcal / leu, the largest

One food, one declaration, and the ranking separates the two ends of it by 1.1 times on value — entirely on the price, since the figures do not distinguish them.

The cheapest member looks like the best value on the menu and the dearest like the worst, and both figures are wrong: each is under-credited by however much its portion weighs over 100 g, which is exactly the thing the sizes differ by. A reader following this ranking would order the smallest of every family and go home with the least food for their leu of anybody in the queue.

It is not one chain's habit either. 2 families of products across Salad Box and Noodle Pack are priced apart and declared identically. They are found by the declaration rather than by the name: four figures repeated to the gram across products a menu charges differently for is not a coincidence.

Chain Sold as Declared Cheapest Dearest
Salad Box Fresh de morcovi, Fresh de mere, Fresh de grapefruit, Fresh de portocale, Fresh de grapefruit cu mar si portocale + 10 more 141 kcal 15.99 lei 17.99 lei
Noodle Pack Fried Rice Crispy picant, Fried Rice Crispy nepicant, Rice Pack Crispy picant, and Rice Pack Crispy nepicant 750 kcal 38.99 lei 41.49 lei

Nothing here corrects it, and that is deliberate. Scaling a declaration by the area of a pizza would be inventing the number rather than reading it, and an invented number that looks like a measured one is worse than a figure that is plainly a chain's own. The fix is the chain's document rather than our arithmetic, and until there is one, a pizza's place in this ranking says as much about how its energy was declared as about what is on it.

The same price in 37 cities

Is anything actually cheaper somewhere else?

Half of this application exists because of an assumption: that a burger costs different money in Bucharest and in Oradea. Menus are read city by city, a price belongs to the branch that quoted it, and the ranking can be narrowed to one city so that it answers at that city's prices.

Of the 2,095 products sold in more than one city, 1,736 cost exactly the same in every one of them — 82.9% of them, to the ban, across as many as 37 cities. The assumption was wrong.

Which is worth saying plainly rather than burying: a platform that quotes one national price is a platform where the cheapest branch and the nearest branch are the same branch. What differs between cities is not the price but the menu — what is sold there at all, and what is open at this hour. That difference is real and the city pages are still the place to see it.

359 products do vary, and they are the interesting part. The widest is DABO MIX 330g at Dabo Doner: 31.99 lei where it is cheapest and 54.27 lei where it is dearest, a gap of 22.28 lei on the same order.

Product Chain Cheapest Dearest Dearer by
DABO MIX 330g Dabo Doner 31.99 lei 54.27 lei 70%
MENIU DABO FALAFEL Dabo Doner 22.00 lei 41.99 lei 91%
MENIU DABO CU SUNCA SI CASCAVAL Dabo Doner 41.91 lei 59.06 lei 41%
PIDE CU ȘUNCA ȘI CAȘCAVAL 270g Dabo Doner 16.99 lei 32.84 lei 93%
MENIU DURUM VITA & CURCAN ROMANIA 430g Dabo Doner 61.91 lei 76.20 lei 23%
MENIU DABO MIX XXL Dabo Doner 80.49 lei 94.77 lei 18%

Most of them are fifty bani on a large meal, which is a branch rounding rather than a city being expensive. What is left is a short list of orders where the price is plainly not set centrally, and that is what a city filter is for: not hunting a cheaper town, but seeing whether the thing you want is sold where you are, and catching the few orders where somebody local still decides.

What you avoid

Pages that list food leave out what a chain declares to contain these. What nobody has declared stays, marked as not known. Kept in a cookie on this device and nowhere else. It repeats what the chains publish, and a restaurant can still tell you more.

Allergens
Gluten
Crustaceans
Eggs
Fish
Peanuts
Soy
Milk
Tree nuts
Celery
Mustard
Sesame
Sulphites
Lupin
Molluscs