How do I import my menu instead of typing it in?
Read your existing menu into ResoFlow from photos, a PDF, your menu web page or a spreadsheet — and check every dish before anything is added.
Typing two hundred dishes in by hand is the slowest job in setting up ResoFlow, so you don't have to. On the Menu page, the Import menu button reads your existing menu — however it exists today — and turns it into a list you check over before anything is added.
Menu management needs the Pro plan or above, or the Order & Pay product; without either, the page shows "Menu management is available on Pro and Complete" alongside the product route. Importing uses the same permission as adding a dish by hand, so by default Managers and above can do it and Hosts can't. The button sits on the Menu tab of the Menu page, next to Add category and Add a dish.
Nothing is added until you press Confirm
This is the important bit. Whichever way you bring your menu in, ResoFlow never creates anything straight away. You always land on a review screen headed Check the menu before it goes in, showing every dish it read, and nothing touches your real menu until you press the green confirm button on that screen. That button always names exactly what it's about to do — Confirm and add 48 dishes on a first import, or something like Update 12 and add 36 when you already have some of them.
On that screen you can change the dish name, the description and the price, move a dish into a different section, rename a section, and remove any dish or section you don't want. You can also add a dish (Add a dish at the foot of each section), add a whole section (Add a section at the foot of the table), and undo a removal straight away with the Undo button that appears after one — so a mis-tap on a long list never costs you a dish. If you close the import without confirming, your menu is exactly as it was.
The photo or PDF you upload is deleted as soon as it has been read — we don't keep your file, and it is never used to train anything.
The four ways in
Pick whichever matches what you've got:
- Photos of the menu — snap each page with your phone. Up to 12 photos, 8 MB each. Put them in page order. JPEG, PNG, WEBP and HEIC all work, and you can drag them straight onto the box instead of choosing them — one at a time or all together, each drop joins the pile, and every listed file has a ✕ to take it back out if you dropped the wrong one.
- A PDF menu — the file you send to the printers works perfectly. One PDF, up to 8 MB.
- Your menu web page — paste the link to the menu on your own website. It needs to be a page anyone can open: a menu behind a login, or one that's really a picture on the page, won't read.
- A spreadsheet — a .csv file with a heading row. No AI is involved in this one: you match the columns yourself on a Match the columns screen, exactly like the Data import page. Dish Name and Price are required; Section, Description, Allergens and Dietary are optional. Then press Check the dishes to get to the same review screen.
For the first three you press Read the menu and see a Reading the menu… screen. It usually takes a few seconds; a long, photographed menu can take up to five minutes, and you can leave the window open while it works. If you close it (or the tab) while it's still reading, nothing is wasted — the reading carries on in the background, and the next time you open Import menu you'll be offered the finished result: "We finished reading the menu you started at 2:14pm — pick up where you left off?". A finished read is kept for 7 days.
Photos are shrunk in your browser before they're sent. If a big batch still comes to more than the 24 MB we can read in one go, you're told before anything uploads — the first pages that fit are kept, and you import the rest afterwards.
Checking the dishes
The review screen counts what it found — "48 dishes across 6 sections" — and flags anything worth a second look:
- Red rows can't be created yet, because the dish has no name or no price. Confirm stays switched off until you fix them, and tells you why: "One dish still needs a name or a price before you can confirm."
- Amber rows are the "please check this" ones — the reader wasn't sure. Each says what it wasn't sure about, in plain words: "We corrected what looked like a scanning slip in this price — please check it", "This price looked too high to be right — please check it", "We read the printed prices as a 'Choose your size' choice — please check each option's price", "This looks like an alcoholic drink, so we've ticked 'Contains alcohol' — please untick it if that's wrong". Any row with a price worth checking also shows exactly what the menu printed, so you always have something to check it against.
- A panel headed Worth knowing about this import collects anything that applies to the import as a whole rather than to one dish — a section that couldn't be read, or a limit that was hit.
Two situations get their own question on the review screen. If you're updating dishes that use shared choice sets, those sets are always kept exactly as they are — and if the import read its own choices for such a dish (sizes, say), the screen offers them as an extra step with a tick-box per dish; nothing is added unless you tick it. And if a section you're importing is covered by a live deal that includes a whole category, an amber notice names the deal and what it means for the money, with a per-dish choice to keep any new dish out of that deal.
On a long menu you don't have to scroll hunting for the problem rows: the "N to fix" and "N to check" counts at the top are buttons — press one to show only those rows — there's a search box, sections collapse, and the header with the Confirm button stays put while you scroll.
Editing a dish clears the flag you've answered. Everything is yours to overrule: this is a first draft of your menu, not a decision.
Dishes printed with two prices
A dish printed with two prices — small/large, glass/bottle, 8"/12" — comes through as one dish with a real size choice, not two dishes and not a guess: the lower printed price becomes the dish's price, and the difference becomes the option's extra cost, exactly as printed. The row is flagged so you check it before confirming. If we couldn't read every one of the printed prices cleanly, the dish is held back instead — it arrives without a price, and the row says so — because importing it with only the readable price would sell the wrong thing. Add each price as a choice on the row, or set the right single price.
Choices, allergens and dietary marks — editable on the spot
Every row has an Allergens, dietary & choices link that opens the same tick-box checklists as the dish editor, plus a small choice-step editor. So when the import flags "we didn't recognise … as a standard allergen", you can put it right there and then, rather than remembering to come back to that dish later. You can also build a choice step ("Choose your size", "Pick a sauce") on any dish before it's created; extra costs sit on top of the dish's base price.
Where "vegan" or "vegetarian" appears in a dish's own name or description — "Vegan Sausage Roll" — the matching badge is ticked for you, because that's your menu marking the dish. Nothing is ever guessed from ingredients, and every tick is yours to change at review.
"Contains alcohol" — suggested for drinks, decided by you
The same expander carries the dish editor's Contains alcohol tick, which marks a dish for 18+ age checks when customers order and pay from their phones (Order & Pay). Where a dish, its description or its whole section reads as an alcoholic drink — a "Wines" page, "House lager", "Aperol spritz" — the box arrives pre-ticked, with an amber note on the row so you know it happened: "This looks like an alcoholic drink, so we've ticked 'Contains alcohol' — please untick it if that's wrong". A ticked dish also shows a Contains alcohol chip on its row, so nothing is ticked out of sight.
This one is a suggestion rather than a transcription — a drinks word is strong evidence, not proof — so it's deliberately cautious ("beer-battered haddock", "red wine jus", "ginger beer" and "alcohol-free lager" are never ticked) and always yours to overrule. For a whole drinks page, each section header has a Mark all as contains alcohol button (it becomes Unmark all once every dish in the section is ticked) — mark the section in one go, then untick the odd soft drink dish by dish.
When several lines might be one dish
Sometimes a menu prints one dish as several lines — "Panini £6.50" followed by its fillings. The reader may spot that and offer it in a panel headed These lines might be one dish with a choice — but it never joins them itself. The dishes are imported exactly as printed, and you press Join them only if that's how the menu really works (or Keep them separate to dismiss the offer). Joining keeps every price honest: the printed price becomes the base, and fillings the menu didn't price separately join at no extra cost.
Build-your-own dishes
Menus that print things like "Create your own burger — choose your patty, add toppings +£1 each" or a ribs-and-wings line where you pick a size, then ribs or wings, then a sauce, can come with their own offer: a panel headed This reads as a dish customers build in steps, listing each step (its question, how many guests pick, and every option with its printed extra cost). Same rule as the joins — nothing happens by itself. Press Add the choice steps to give the dish those steps (they land in the row's own choice-step editor, where you can change any question, price or how-many-they-pick), or Leave it as printed to dismiss the offer. Every extra cost is the "+£1"-style supplement exactly as the menu printed it, sitting on the dish's own price; the row is flagged so you check each option's price before confirming. Spotting these is best-effort — a build-your-own dish the reader misses simply imports as printed, and its steps are a minute's work in the row's choice-step editor. And if any of a dish's printed option prices couldn't be read cleanly, no offer is made at all — the row says so, and you build the steps by hand rather than trusting half a reading.
Working in bulk
Every row has a checkbox, and each section header has a select-all. With rows selected, a small bar appears with Move to section… and Remove — so re-filing eight dishes, or clearing the rows that came from the drinks page, is one action rather than eight. Each section header also carries a VAT dropdown (blank unless you use it): pick a rate once and every dish in that section gets it, which beats setting VAT dish by dish afterwards. It only applies where you choose one — leaving it blank changes nothing.
When you press the confirm button, the dishes are created in batches, and on a big menu the button counts along — "Adding 80 of 120…" — so you can see it's working. You then land back on your menu with a summary of exactly what happened, like "36 dishes added, 12 updated". If anything couldn't be added, that message says so and why, rather than claiming everything went in.
Adding to a menu you already have
If some of the dishes you're importing are already on your menu — same section, same name — the review screen says so ("12 of these dishes are already on your menu") and asks what to do, with three choices:
- Update them (the starting choice) — writes the imported price and description onto the dishes you already have, and adds the genuinely new ones. This is the usual one when you've reprinted with new prices. Any allergens you've already ticked are kept — an import can add one, never remove one — the Contains alcohol tick works the same way (an import can tick it, never untick a dish you've marked yourself), and a hand-written description is kept too, unless the import brings its own to replace it with.
- Skip them — leaves the dishes you already have exactly as they are, and adds only the new ones.
- Add them anyway — adds everything, so you end up with two of each matching dish.
A sentence next to Confirm spells out what your choice will do before you press it, Show which dishes lists the ones that matched, and each matching row carries an Already on your menu chip in the table — with a filter button at the top to show just those rows.
The same dish twice in one import
If the import itself lists the same dish name more than once — a page photographed twice, or a dish that genuinely appears in two sections — a panel says so and asks, dish by dish: Merge into one (keeps the first copy, and carries any allergen or dietary ticks off the removed ones) or Keep both. It's a question rather than an automatic merge, because a dish in two sections is often deliberate. Where the copies printed different prices, merging flags the kept row so you check which price the menu really means.
Replacing the whole menu
Printed a completely new menu? Underneath the review table there's a separate red panel — Printed a brand-new menu? — with a Replace my whole menu button. That deletes every dish and section you have now and puts this import in their place. It asks you to type REPLACE MENU and then to confirm your identity, because it can't be undone.
Two things worth knowing before you use it: dish photos on the deleted dishes go with them, and anything built on those dishes and sections — set menus and deals, shareable menus — will need putting right afterwards, because it was pointing at dishes that no longer exist. The button only appears if your menu has something on it and your role can delete dishes.
What an import doesn't do
So there are no surprises, an import creates dishes, sections, prices, any choice steps you've confirmed on the review screen, and any Contains alcohol ticks you've left in place — and that's it:
- No dish photos. Nothing is pulled out of your photos or PDF as a dish image. Add those afterwards from your image library.
- No set menus or deals. "3 courses for £25" isn't recognised as a deal; you build that on the Set menus & deals tab once the dishes exist.
- Allergens and dietary marks come across only where your menu declares them — a (V) with a key, a written allergen list, or the words "vegan"/"vegetarian" in the dish's own name or description. They're never guessed from ingredients, and you can tick or untick any of them on the review screen before confirming. Allergen accuracy stays your venue's responsibility.
- "Contains alcohol" is only ever a suggestion. Drinks are pre-ticked for your review with a visible note on the row — nothing is marked without you seeing it, and the final say is always the tick you confirm.
Everything else behaves exactly as if you'd typed the dish in yourself: imported dishes arrive available, a choice with extra costs shows as a "From" price automatically, dishes pick up your category or venue default VAT rate unless you chose a section VAT at review, and they appear one by one in your activity log.
How much fits in one import
One import can bring in up to 500 dishes, across up to 40 sections, with up to 150 dishes in any one section. If your menu is bigger than that, the review screen tells you what was left out — "Only the first 500 dishes were imported — please add any others by hand" — and you can import the rest afterwards. (Separately, one venue's menu can hold up to 2,000 dishes in total, which no real menu comes near.)
If it doesn't work
See menu import problems for what each message means and what to try instead.
Related: How do I build my menu and share it with customers? · How do I add my logo, colours and images?