Skip to main content
A price list answers a single question: how much does each product cost? What changes is who it costs that much for. The same product can be priced differently in the store, on delivery, at an airport location or inside a combo — and holding that together by hand, product by product, is where money leaks without anyone noticing. This screen exists so you can run many different prices without multiplying the work of maintaining them. Navigate to Restaurant OS → Menu & Products → Price lists.
Price list overview

The short version

1. You already have a list, even if you never created one. It’s called the base list and it holds the standard price for every product. When you set a price on a product’s page, that price lands there.2. Other lists can follow the base. Connect a list to the base and you change a price once for it to reach all of them. Any product that needs its own price sets one and stops following — just for that product.3. Nothing is saved until you confirm it. Everything you edit stays as a draft, you see it on screen before applying, and you can discard the whole thing.4. Promotions live here too. The Sale price column is the price the customer is charged during a discount. A sale on a product also applies inside every combo where that product has no price of its own.

The simple path

You don’t need to understand price lists to start selling. Set the price on the product page and Prices and availability picks it up into the base list. Done. The base list carries the Base list tag and can’t be deleted or deactivated: it’s the catalog price, the floor everything else hangs from.
If you sell at a single price, this is all you need. The rest of this manual is for when the second price shows up.

When the second price shows up

One day delivery costs more, or an airport store carries different costs, or an aggregator takes a commission you need to offset. That’s when you create a second list — and the question that matters is how it’s born.
The difference that costs the most. A copy looks identical to a connected list the day you create it. The difference shows up three months later: the connected one followed the base’s increases, the copy stayed frozen at that day’s prices and nobody noticed.When in doubt, pick connected. You can always disconnect it later.

Connected lists: change once, reach everywhere

A connected list shows the Derived from <base list> tag, and each product carries one of two marks:
  • Formula — that product follows the base list.
  • Fixed — that product has its own price and won’t move when the base changes.
Below the price you’ll see the formula behind it: P is always that same product’s price in the base list.

The point: you can mix

It isn’t all or nothing. A delivery list can follow the base on 137 products and hold its own price on 93. The ones that follow update themselves; the ones you fixed stay exactly where you put them. To send a product back to following the base, use Reset to =P next to the price.

Contextual prices: the same product is worth a different amount inside a combo

This is the case that surprises people most. A side of fries costs $5.70 on its own. But inside the “1 Tira + Batata Média” combo it costs $7.80, and inside “9 por 49,90” it costs $6.20. Three prices for the same product — and until now they lived buried in each combo’s configuration. In the grid, products with this show an “N contexts” tag. Open it and you see every price together, with the percentage against the standalone price:
Contextual prices for the same product
Green when you charge more than the standalone price, red when you charge less. And they’re editable right there: no need to go hunting for the combo.
Why this matters. In a typical operation, most of the revenue goes through combos. If you raise prices and leave the contextual prices alone, the increase never reaches where the money is.

Sale prices: the discount the customer is charged

The Sale price column holds a lower price that is charged: regular 14.90, sale 12.90. Click Add a sale price on the row, type the amount and save with the rest of your drafts. The cell shows the discount next to it — “13% off”.
  • It’s an amount, not a percentage. You type the price after the discount.
  • It has to be lower than the regular price. Otherwise the cell refuses it: “The sale price must be lower than the regular price”. If you lower the regular price later and an old sale is left at or above it, the sale stays saved but marked “Not sent to the channel: it is not lower than the price”.
  • Removing it returns the product to its regular price on the next sync.
A sale doesn’t reach the channel until you sync. Saving the list stores it; the customer sees it after the rows using this list are synced in Menu assignment.

On connected lists

A connected list does not inherit the base list’s sales: its sale is its own. That’s on purpose — if the delivery list is =P*1.15, the base’s sale price would make no sense there. Sending a product back with Reset to =P keeps the sale it had in that list.

Sales inside a combo

In the By combo view each option has its own sale, next to its price inside the combo. When you set one, the screen asks Where should the sale price apply? An option that follows the list price inside a combo shows the product’s own sale, marked “From the product’s own sale price”. A combo’s own discount is never typed: it comes out of its options’ sales.

How far a sale reaches

This is what surprises people most: a sale typed on one product shows up in many more places than the row you edited.

A real example: Coca Cola 400 ml at 12.90

On the staging catalog, that single sale reached about 70 products at the next sync: every combo where the Coca has no price of its own. Combos nobody edited started showing a discount badge.
Why it works this way. Inside a combo, an option without a price of its own is the standalone product: same price, same sale. If you want a combo to keep its price no matter what happens to the product, give that option its own price in the combo (Only in this combo).

What the customer sees on a combo

  • The big price is the cheapest configuration, with sales: 63.90.
  • The struck price is that same configuration without sales: 72.90. The channel calculates the badge from both.
  • Each option shows what it adds over the cheapest option of its group. When the Coca goes on sale it becomes the cheapest drink, so the other 400 ml drinks now show +2.00 — although none of them changed price. Two Coca Zero still cost exactly what they did before.
  • The discount applies only to what the customer picks. A customer who chooses no option on sale pays the regular price, with nothing struck through.

Suggested price is not a sale

The grid also has a Suggested column: a reference price the channel can show crossed out. To the customer both look the same — a price, a struck price and a percentage — but they’re different things: If the -10% is a real promotion, make it a sale.

Prices per fulfillment type in the grid

The fulfillment type selector in the toolbar turns the grid into a lens: with All fulfillment types you see and edit the base price; pick Delivery and every cell shows and edits delivery’s price. “You are editing the price for Delivery. A product with no own price here follows the base price.”
  • A product with its own price for that type carries the own badge. follow the base price removes it and sends the product back to the base.
  • A dot next to a type in the selector tells you that some product in this list already has its own price there.
  • Bulk actions are off under a lens: “Bulk actions apply to the base price. Switch to “All fulfillment types” to use them.” They’re written against the base price, and applying them to another layer without telling you would be worse.
  • Compare with keeps working under a lens.
A price for one fulfillment type replaces the whole pair: price and sale. If the product is on sale at the base price and you give Delivery its own price without a sale, delivery has no sale — the cell says so: “No sale on this fulfillment type: its own price replaces the base sale”. Writing a sale under a lens does the reverse: it creates that type’s own price at the current value, and from then on that type stops following the base price.

Changing many prices at once

Select the products —using the type and category filters, or the search— and the bulk edit bar appears.

What you can apply

  • Percentage — raise or lower by a % over the current price. The sign is explicit: + or −.
  • Amount — add or subtract a fixed amount.
  • Formula (connected lists only) — apply =P*1.15 to everything selected.
  • Reset to =P (connected lists only) — send them back to following the base.
Bulk edit bar with rounding selector

The increase reaches combos too

The bar includes an “Also prices inside combos” checkbox, on by default. That’s what makes a +10% actually reach your whole revenue instead of just the standalone price. One reassuring detail: an even increase keeps the proportions. If a product was $10.90 on its own and $20.00 inside a combo (+83%), after a +10% it’s $11.99 and $22.00 — still +83%.

Commercial rounding

A +10% leaves prices like $11.99 or $13.42. The second one is ugly to sell. Next to the value there’s a rounding selector: It applies after the calculation, and only to percentage and amount. Formulas aren’t rounded: they’re live, and rounding them would break the relationship with the base list.
All of this produces drafts. You see the result in the grid, with the previous price struck through, and only then confirm with Save. Or discard the whole thing.
Draft prices with the previous value crossed out

Comparing two lists

The Compare with button overlays another list as a reference. When it’s active it turns orange — it’s a mode, not a filter: it doesn’t hide products, it adds information. Under each price you get the other list’s price and the difference:
Compare mode: reference under each price
It shows on every row, including where the prices match. That’s deliberate: if it only appeared where there’s a difference, you couldn’t tell whether the rest matches or the data is missing. Matching rows are dimmer and carry no percentage, so what’s different stands out on its own. It’s for reviewing before you publish: “out of 119 products, only 2 have a different price on delivery — is that what we want?”.

Before saving: who the change reaches

If the list has connected lists, saving opens a summary of the blast radius:
Blast radius summary before saving
The line to look at is the one with ⚠. A list where every product you touched has its own price never hears about the change. It looks connected, but for those products it’s on its own.This is the mistake that costs the most: you think you raised everything and one list stayed put.
The same summary appears when you save a price from the product page, which is where the blast radius is most invisible — you can’t even see that price lists exist from there.

Connecting a list that already exists

Got a loose list that was born as a copy and drifted out of date? You can connect it: ⋮ menu → Connect to a base list. Before confirming, you’re shown exactly what will happen:
The rule is simple and invents nothing: whatever matches the base today starts following it; whatever has its own price stays put. That’s why connecting doesn’t move a single price at the moment you do it. What changes is from tomorrow on. And if you change your mind, Disconnect from base list returns it to being independent with exactly the same prices.

Recipes: how to handle real-world cases

  1. Open the delivery list (not the base — dine-in stays where it is).
  2. Select the products with the header checkbox, or filter by category if the increase is partial.
  3. Pick Percentage, sign +, value 8.
  4. Keep “Also prices inside combos” checked.
  5. Pick a rounding mode if you don’t want prices like 13.42.
  6. Review the grid: new prices show up with the old one crossed out.
  7. Save.
Products with their own price (Fixed) won’t move. If you wanted them to increase too, first send them back to Reset to =P.
If the aggregator takes 20%, you need to charge more to keep the same margin.
  1. Create a list connected to the base, named after the aggregator.
  2. Select all products.
  3. Apply Formula: =P*1.25.
  4. Save.
From there on, every time you change the base price, that list recalculates itself and keeps the margin. No need to touch it again.
  1. Create the list connected to the base.
  2. Select everything and apply Formula =P*1.15.
  3. The few products that need a different value: edit them one by one with a number. They’re marked Fixed.
  4. Assign the list — together with the right menu — to that store’s rows in Menu assignment.
The key thing: the 15% stays live. The day the base goes up, the airport goes up with it.
For a product on promotion, the Sale price column is the simplest path: the regular price stays where it is, and the channel shows the discount.
  1. Open the list assigned to the destinations of the campaign.
  2. On each product, Add a sale price with the promotional amount.
  3. Check the How far a sale reaches section: the sale also applies inside the combos where the product has no price of its own.
  4. Save and sync the rows in Menu assignment.
  5. When it ends: remove the sales, save and sync again.
If the promotion changes many prices at once and you want to switch it on and off in one move, a separate list connected to the base still works: lower the products with =P*0.8, assign the list for the campaign and reassign the previous one at the end.
  1. Open the list and switch to the By combo view.
  2. Find the combo and the option that drives its price — usually the cheapest of a required group.
  3. Set its sale and choose Only in this combo.
  4. Save and sync.
The standalone product keeps its price. The combo’s “from” price drops and shows the regular one struck through; customers who pick other options don’t get that discount.
You put a soft drink on sale, but one combo should keep its price.
  1. By combo view, find that combo and the drink.
  2. Give the drink a price of its own with Only in this combo — the same price it has today.
  3. Save and sync.
An option with its own price inside a combo doesn’t follow the standalone product’s sale.
  1. Open the delivery list.
  2. Compare with → Standard prices.
  3. Scan the grid: matching rows appear dimmed, differing rows show the percentage in color.
In two minutes you know how many products separated and by how much.

A 10% increase, followed end to end

Three lists, one product, one change to the base. Here’s what happens with each: Delivery updated on its own: nobody touched it. Airport didn’t, because someone gave it its own price at some point — and that’s exactly what the blast radius summary warns you about before saving. And if the product also sells inside a combo at 20.00, with the combo checkbox on that price becomes 22.00: the proportion (+83%) stays the same.

Mistakes that cost money

Using “copy” when you meant “connected”. The copy doesn’t get the base’s increases. Three months later you’re selling with outdated prices on that channel and nothing warns you.
Setting an own price for a temporary adjustment. That product is marked Fixed and stops receiving all future increases, not just today’s. If the adjustment is temporary, use a promotion list and return it with Reset to =P.
Unchecking “also prices inside combos”. You raised the menu but not the revenue: most sales go through combos, and those prices stayed put.
Putting a product on sale without looking at the combos. The sale also applies inside every combo where the product has no price of its own — on the staging catalog, one soft drink reached about 70 products. Check How far a sale reaches before saving.
Giving a fulfillment type its own price and forgetting the sale. That type’s price replaces price and sale: the promotion stops on that channel, silently.
Using the suggested price as a promotion. The customer sees a struck price, but nothing is discounted in reporting and the combos don’t get it.
Ignoring the ⚠️ line in the blast radius summary. It’s the warning that an entire list won’t get the change. It shows up right before saving, which is the only moment you can still fix it.

Details that save you headaches

Drafts don’t disappear on their own. If you try to reload or leave the screen with unsaved changes, you’re asked: Save and continue / Discard / Stay here. The reload button. If someone else touched a price while you had the screen open, reload and pull the latest without losing your work. The currency comes from the countries your account operates in, not from a generic catalog: if you operate in Brazil and Colombia, you’ll see BRL and COP. Combos don’t appear in the product grid. A combo has no price of its own: its value comes from what you charge for each item inside it. That’s what the By combo view is for — it shows the composition and recalculates the total as you edit.
By combo view: composition and recalculated total

Glossary


Frequently asked questions

That product has its own price in that list (the Fixed mark). It’s intentional: someone set it at some point. If you want it to follow the base again, use Reset to =P.The blast radius summary warns you about this before it happens.
That’s how sales work: inside a combo, an option without a price of its own follows the standalone product, sale included. If the product is the cheapest option of a group, the combo’s “from” price drops too. To keep a combo out, give the option its own price in that combo with Only in this combo.
The sale is no longer lower than the regular price — usually because the regular price was lowered after the sale was set. Lower the sale or remove it.
On purpose: sales aren’t inherited by connected lists. If the promotion applies there too, set the sale in that list.
No. Inheritance is one level only: a list follows a base list, and that base follows nobody. Longer chains become impossible to reason about when something goes wrong.
No. Deleting a product clears it from every list automatically.
Because it’s the catalog price: it’s where the price you set on a product page lands, and the starting point every other list derives from. Deleting it would leave products with no price. It can’t be deactivated either.
The “Also prices inside combos” checkbox was unchecked when the change was applied. Apply the adjustment again over those products with the checkbox on.

What’s coming

  • Time-based prices (day-parting): a price that changes depending on the time of day.
  • Taxes, net price and reference price in the grid — today you work on the final price with taxes included.
  • Sales in bulk: today a sale is set product by product; the bulk bar works on regular prices only.