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 — check every dish on a guided checklist, and carry on later whenever you leave.
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 opens an import of its own, where you check everything over before anything is added.
Menu management needs the Pro plan or above, or the Order & Pay or Your website product; without one of those, 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 — and leaving loses nothing
This is the important bit, in two halves.
First: whichever way you bring your menu in, ResoFlow never creates anything straight away. You always review every dish it read, and nothing touches your real menu until you press the green confirm button — which always names exactly what it's about to do, like Confirm and add 48 dishes. On the way there you can change any dish's name, description and 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.
Second: leaving the import doesn't lose your work. Close it — deliberately or because the phone rang — and everything is kept as a draft: the menu that was read and every correction you've made to it. The next time you open Import menu you're offered the draft first, so you pick up exactly where you left off. Drafts are kept for 7 days; ignore the offer and start fresh whenever you'd rather. Your real menu is untouched either way, because only Confirm changes it.
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.
What it costs
Reading a menu uses AI credits: 2 credits per file — so a six-page photographed menu is 12 credits, one PDF is 2, and a web page is 2. The spreadsheet lane is free (no AI reads it). Pro includes 30 AI credits a month and Complete 100; on Free and Plus you buy a one-off pack from Account → Top-ups and credits (50 credits for £5, 150 for £12, 400 for £25 — packs never expire). The credits are taken when you press Read the menu; if the read fails, they go straight back. See How do I buy credits or add-ons?.
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 — iPhone photos are fine as they are, a HEIC is converted for you when it's read — 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.
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?".
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.
The checklist home
Once your menu has been read, the import shows you the whole job as a checklist — one card per area, each with a one-line summary and either a tick (nothing to do) or an honest count of what's waiting:
- Your existing menu — only when you already have dishes: choose up front how this import should treat them (see "Adding to a menu you already have" below).
- Your sections — what the reader found, by name.
- Dishes & prices — the dish count, with "N to fix" and "N worth a check" spelled out.
- Choices we spotted — size and option suggestions waiting for a yes or no, and any size splits that were applied for you (with their undo).
- Set menus & deals — any printed bundle the reader drafted for you to accept.
- Duplicates — dishes already on your menu, and dishes repeated within the import itself.
- Finishing touches — VAT per section, alcohol marks, dietary badges; all optional.
- Preview as a guest — see the menu the way your customers will, before it exists.
You don't have to work out where to start: the checklist points you at whichever area needs you next, and works through them with you. And if the confirm button is off, the reason is written next to it in plain words — "Confirm is off until 1 fix is done", with what the fix is — never a greyed-out button with no explanation.
Checking the dishes
The dishes table 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", "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. If you're updating dishes that use reusable choices (shared choice steps), those 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 are buttons — press one to show only those rows — there's a search box, sections collapse, and 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.
Sometimes the printed sizes are the very reason a single price couldn't be read — the line only makes sense as a size choice. Where the sizes could be read cleanly, that choice is applied for you rather than the dish arriving broken, the row says so, and the checklist lists every applied split with an Undo: undo one and the dish goes back to having no price, with the row telling you to add each price as a choice (or set the right single price) by hand. And where we couldn't read every printed price cleanly, no split is applied at all — the dish arrives without a price and the row says so, because importing it with only the readable price would sell the wrong thing.
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.
Joins, build-your-own dishes and working in bulk
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 dish served with a printed choice ("choice of sauce: BBQ, Buffalo or Korean") — 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.
Set menus and deals. A menu that prints a bundle — "Two courses £22", "Any pizza + any drink £15" — can come with its own offer: a panel headed This menu looks like it includes a set menu or deal, showing the printed price and each course with the dishes we read for it. Nothing happens by itself: press Add this when I confirm and the set menu is created alongside your dishes — it appears under Set menus & deals, live, where you can edit or pause it any time — or No thanks to dismiss the offer. A menu that prints the same offer at several sizes — "3 plates £14.99 · 5 for £19.99 · 7 for £25", or 1/2/3-course prices — arrives as one deal with its full price ladder shown, not several separate deals; accept it and the deal is created priced by how many they pick, with each printed price as a tier. A ladder that doesn't add up — a bigger number costing the same or less — is never drafted; an amber note tells you what was printed so you can build it by hand if the menu really means it. Set menus & deals are part of Order & Pay, so on plans without it the panel simply tells you what your menu prints, ready to build if your plan ever includes it. If we couldn't read a bundle cleanly, an amber note says so instead — the fact is never lost silently.
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
When your menu already has dishes on it, the import asks up front how to treat them — the question is the checklist's first card, so you decide before you're deep in the rows. Three choices:
- Add new dishes — dishes you already have are left exactly as they are; only the genuinely new ones are added. The usual choice when you're importing a new drinks list alongside an existing food menu.
- Update my menu — dishes with the same name (same section) get the imported price and description, and the new ones are added; you're shown a before-and-after price list of exactly what will change before you confirm. This is the one for a reprint 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.
- Replace everything — your whole menu is cleared first, then this import goes in. It asks you to type REPLACE MENU and then to confirm your identity, because it can't be undone — and it warns you first, by name, if any promotion or loyalty reward points at today's menu. Two more things go with the old menu: dish photos on the deleted dishes, 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. Replacing needs a role that can delete dishes.
Whichever you choose, the matching rows are visible: an Already on your menu chip marks each dish that matched, Show which dishes lists them, and a filter shows 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.
What an import doesn't do
So there are no surprises, an import creates dishes, sections, prices, any choice steps you've confirmed, any set menu or deal you've accepted, 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.
- 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 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, you're told 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?