Keep one master menu sheet as the only place an item, price or allergen is decided. Let the AI rewrite descriptions per brand and per app from that sheet, log every change, and run a weekly price-parity check that compares each app's live menu with the sheet. Nothing gets edited in an app first.
Drift is the real enemy. Take a kitchen with three brands (burgers, rice bowls and desserts), 54 dishes and three places to order: two delivery apps and its own site. That is 162 listings, and each one can fall out of step with the others: a promo left on, a dish renamed in one place only, an allergen line nobody updated after the recipe changed. The assistant helps in two places, rewriting from approved facts and reading live text for differences. Spreadsheets do the counting, and people sign off anything that can hurt a customer.
Two sheets: what you cook, and what each app shows
The sheet that fails first is the one where a dish and its listing share a row. A dish is cooked once but listed many times, under different names, at different prices, in different places. So keep them apart. The Items sheet holds what the kitchen makes: one row per dish per brand, with a recipe ID that points at what is actually cooked. The Listings sheet holds what customers see: one row per dish per channel, written from the Items sheet and checked against what is live.
The recipe ID earns its place when a dish is shared. Suppose the same fries are cooked once and sold under two brands, as "Skin-on Fries" in one and "Side Fries" in the other. They are two items with one recipe. Allergens belong to the recipe, so a change to the seasoning is made once and then reaches every listing that uses it. If a dish is built from other recipes, such as loaded fries made from the fries and a cheese sauce, add a "built from" column so that a seasoning change also lands on the loaded fries. In the example kitchen, 54 rows on the Items sheet (22 burgers, 18 bowls and 14 desserts) produce 162 rows on the Listings sheet.
One rule goes with the structure: nothing is decided in an app. Prices, names, hours and allergen lines change on the Items sheet first, and the apps follow. An edit made directly in an app's dashboard is how the sheet and the apps start telling different stories. It is also how a menu-sync tool, if you use one, can fall out of step, so ask any tool how it treats edits made in an app.
The brand-by-app checklist every listing must pass
This is the checklist to run on every brand and app pair, which makes nine cells for the example kitchen. A cell clears only when all ten checks pass, and the right-hand column says who or what does the checking.
| Check | The listing passes when | Checked by |
|---|---|---|
| 1. Name | It matches the approved name for this brand and this app | Sheet |
| 2. Description facts | Every fact comes from the master "facts" cell, with none added and none dropped | Assistant reads, person decides |
| 3. Allergen line | It is present and identical, word for word, to the master line | Sheet |
| 4. Dietary tags | They match the master. A blank in the master means no claim is made | Person |
| 5. Price | It equals the expected price for this channel and order type | Sheet |
| 6. Add-ons and options | The same options and add-on prices as the master modifier list | Assistant tabulates, person decides |
| 7. Photo | It shows the dish as it is packed today | Person |
| 8. Hours and stock | Live only in the master hours, and sold-out dishes are off on every channel | Person |
| 9. Category and order | The dish sits in the right section of the menu | Person |
| 10. Promo and banned wording | No expired promo, and no mention of other platforms, the own site, fees or discounts | Sheet |
Keep a small tracker with one row per brand and one column per channel. Each cell holds the date it last cleared and the number of items still open. After the week-six check described later, the example kitchen's tracker read like this:
| Brand | App 1 | App 2 | Own site |
|---|---|---|---|
| Smash burgers, 22 dishes | 3 open | 1 open | Clear |
| Rice bowls, 18 dishes | Clear | 2 open | 1 open |
| Dessert jars, 14 dishes | 1 open | 1 open | Clear |
A cell is not done when the fixes are made. It is done when someone looks at the live menu again, the way a customer sees it, and the ten checks pass. Four of the ten are decided by the sheet alone, four need a person's eyes and two split the work between the assistant and a person.
One filled master row, and who owns each column
Here is a single row from the Items sheet, turned on its side so it reads as a form. The dish is illustrative, and so is every limit and price that follows.
| Column | Entry for BG-014 | Who writes it |
|---|---|---|
| Item ID, brand, category | BG-014, Smash burgers, Burgers | Sheet owner |
| Recipe ID | R-031 | Head chef |
| Master name | Double Smash Burger | Brand owner |
| Facts the copy may use | two beef patties, melted cheese, pickles, house sauce, toasted potato bun | Head chef |
| Allergen line, exact wording | Contains: gluten, milk, egg, mustard, sesame. | Head chef, from supplier specifications |
| Dietary tags | none claimed | Head chef |
| Base price, own site | $9.49 | Owner |
| Promo price and end date | blank | Owner |
| Hours | 11:00 to 23:00 | Operations |
| Photo ID | P-0214 | Marketing |
| Last reviewed | a date, and who looked | Whoever reviewed it |
Look at the third column. Different people own different cells, and that matters more than the layout. Allergens and dietary tags are written by the person who knows the recipe and holds the supplier specifications, and nobody else. The assistant never fills them. If the cell is blank, the output says "allergens missing" instead of improvising a line.
The "facts the copy may use" cell is the one that makes AI rewriting safe. It is the only raw material the assistant gets, so it cannot add a cooking method, an origin or a flattering adjective that the kitchen cannot back. The allergen line is a complete sentence in exact wording, so that every listing can carry the identical sentence and a formula can check for it. For storing that wording and the other house rules for menu text, building a brand voice guide that AI can follow sets out the voice side.
App profiles: record each app's rules before you write for it
Each app has its own limits and house rules, and they change. Record them once on an Apps sheet, and everything else reads from it. The profile below uses illustrative limits. When I looked in October 2026, neither DoorDash's nor Uber Eats' merchant help pages that I could read gave a published character limit for item names or descriptions. So take yours from the editor in your own dashboard, or ask the app's merchant support, and write the numbers down.
| Channel | Name limit | Description limit | Markup on base price | Wording to keep out |
|---|---|---|---|---|
| App 1 | 60 characters | 250 characters | 15% | Other platforms, the own site, discounts, fees |
| App 2 | 50 characters | 120 characters | 10% | Other platforms, the own site, discounts, fees |
| Own site | none | none | 0% | Health claims, unverified claims |
Four published details are worth building into the profile, because each one changes what the assistant must be told.
- Prices can differ by order type. DoorDash's item form has separate "Pickup price" and "Delivery price" fields, and Uber Eats' Menu Maker lets you set different prices for delivery and pick-up. If you take pick-up orders through an app, the profile needs a markup for each.
- The apps police menu wording. DoorDash's merchant guidance on items and descriptions says item titles, descriptions or any other menu component may not reference other food delivery platforms or direct customers to order through your own website or app by suggesting a lower price or fee. It adds that this includes language about delivery fees, commissions or percentage charges, and that items found with it "will be subject to removal". A keen rewrite is exactly where "cheaper on our site" creeps in, so the prompt forbids it. Check each app's own rules for the same kind of clause.
- Photos must match what you pack. Uber Eats' Menu Maker guidance asks for photos that "faithfully reproduce the dish that the customer will receive". A photo of last season's bun fails that test, which is why photo is check 7. For AI-made images, what must stay true in AI food photography covers the limits.
- The apps offer their own AI writers. DoorDash's Merchant Portal has "Write with AI" and "Rewrite with AI", which draft from the item's name, photos and modifiers and carry a disclaimer until you edit the text. Uber's own guidance on menu descriptions describes a bulk feature that lets merchants without a point-of-sale integration generate suggested descriptions in Menu Maker and then approve or edit them, though it may not be offered in every market. Treat any of these suggestions as drafts at most. If one person uses the writer on one app and nobody does on the others, one dish ends up with three descriptions.
Review these pages every quarter, because apps change their rules without announcement. A dated note in the profile ("rules read on 27 October") tells you when to look again.
Rewriting per brand and app without inventing facts
Consistency here does not mean identical text. Each brand keeps its own voice. What must agree everywhere is the facts: ingredients, allergens, names, prices by rule and hours. Give each brand a voice card of five or six lines: three words for the tone, words it never uses, how long its sentences run, and how it writes the allergen sentence, which is fixed and copied exactly. Illustrative cards: the burger brand is short, loud and a little cheeky, with at most one exclamation mark and never the word "gourmet". The bowl brand is calm and ingredient-first, with no slang. The dessert brand is warm and sensory, with no health claims.
The rewrite then runs one brand and one app at a time, from the Items rows, under rules that stop invention.
You write delivery-app menu text. One brand and one app per request.
BRAND VOICE CARD: [paste the card for this brand]
APP PROFILE: name max 50 characters, description max 120 characters, plain text, no emoji.
NEVER INCLUDE: names of other apps or delivery platforms, our own website, "order direct", "cheaper", discounts, delivery fees, commissions, health claims, "best", "famous", "award-winning".
ITEM ROWS FROM THE MASTER SHEET (the only facts you may use):
[paste: item ID | master name | facts | allergen line]
For each item return one row: ITEM ID | LISTING NAME | LISTING DESCRIPTION | FACTS USED (copy the exact words you relied on) | PROBLEMS.
Rules:
1. Use only the facts in the row. Do not add ingredients, cooking methods, origins, portion sizes or adjectives that imply them, such as "hand-cut", "slow-cooked" or "fresh".
2. Copy the allergen line exactly as given, at the end. Never shorten, reorder or paraphrase it. If it is empty, write "allergen line missing" under PROBLEMS.
3. If a fact you need is missing, write MISSING: and the field name under PROBLEMS. Do not fill the gap.
4. Do not count characters. The spreadsheet will do that.
A typical reply for the burger brand on App 2 (illustrative):
| Item | Listing name | Listing description | Facts used | Problems |
|---|---|---|---|---|
| BG-014 | Double Smash Burger | Two beef patties, melted cheese, pickles and house sauce in a toasted potato bun. Contains: gluten, milk, egg, mustard, sesame. | two beef patties, melted cheese, pickles, house sauce, toasted potato bun | none |
| BG-021 | Crispy Chicken Burger | Crispy chicken thigh, slaw and hot sauce in a toasted potato bun. Contains: gluten, milk, egg, mustard, sesame. | crispy chicken thigh, slaw, hot sauce, toasted potato bun | none |
| BG-009 | Loaded Fries | Hand-cut skin-on fries with cheese sauce and crispy onions. Contains: milk, gluten. | skin-on fries, cheese sauce, crispy onions | none |
Read it as a checker would. Row one reads well and is 127 characters, which is over this app's 120, so the sheet will flag it and you shorten the description: "Two beef patties, melted cheese, pickles, house sauce, toasted potato bun." plus the allergen line comes to exactly 120. Row two is clean. Row three is the instructive one: the assistant wrote "Hand-cut", which is not in the facts, and still reported no problems. It had even copied its own facts column correctly, so the invention shows up only when you compare the description with that column, or when "hand-cut" sits on the banned list. Delete the word, and add the word to the list for next time.
Letting the sheet check length, banned words and allergens
Assistants often miscount characters, and they cannot be trusted to police their own banned list. A spreadsheet does both without fuss. The Listings sheet has one row per dish per channel: listing ID in column A, item ID in B and channel in C. Approved text sits in D (name) and E (description), live text pasted from the app in F, G and H (name, description, price), and the checks sit to the right. These formulas assume an Apps sheet with the channel in column A, the name limit in B and the description limit in C, and an Items sheet with the item ID in column A and the allergen line in column G. Your letters will differ.
| Check | Formula, copied down the Listings sheet |
|---|---|
| Live name equals approved name | =EXACT(TRIM(D2),TRIM(F2)) |
| Live description equals approved description | =EXACT(TRIM(E2),TRIM(G2)) |
| Name within the app's limit | =LEN(F2)<=XLOOKUP(C2,Apps!A:A,Apps!B:B) |
| Description within the app's limit | =LEN(G2)<=XLOOKUP(C2,Apps!A:A,Apps!C:C) |
| No banned wording in name or description | =SUMPRODUCT(--ISNUMBER(SEARCH(Banned!$A$2:$A$30,F2&" "&G2)))=0 |
| Master allergen line present, word for word | =ISNUMBER(FIND(XLOOKUP(B2,Items!A:A,Items!G:G),G2)) |
Four notes on those formulas. The banned list on its own sheet must have no blank cells inside the range, because an empty entry "matches" everything, and no ? or * characters, which SEARCH treats as wildcards. If the banned-words formula returns a single result in Google Sheets, wrap it in ARRAYFORMULA. FIND is used for the allergen line because it is case-sensitive, which is what you want from an exact sentence, while SEARCH is not. And XLOOKUP is available in Microsoft 365, Excel 2021 and later, and Google Sheets, but not in Excel 2016 or 2019, where INDEX and MATCH do the same job. Run the length and banned-word checks on the approved text before you publish, then run every check on the live text afterwards.
The sheet is blunt. It says that a description differs from the approved one, not what changed. That is the assistant's second job, and a small one:
Below are pairs of APPROVED and LIVE menu text, with the MASTER FACTS and ALLERGEN LINE for each item. For every pair where the texts differ, list only:
1. Any fact in the LIVE text that is not in the MASTER FACTS.
2. Any master fact or allergen missing from the LIVE text.
3. Any change at all to the allergen line.
4. Any wording that refers to another platform, our own website, discounts or fees.
Return: LISTING ID | PROBLEM TYPE | THE EXACT WORDS | WHAT THE MASTER SAYS. Skip pairs with no problem. Do not suggest rewrites.
A person reads what comes back and decides what to do. The assistant's reading is a lead, not a ruling.
Price rules by channel, then the parity check
Parity does not have to mean identical. Apps charge commission, and many kitchens price higher on them than on their own site. What the check needs is a written rule for each channel, so that "wrong" has a definition. How much to add is a margin question, covered in whether takeaway menu prices should rise on apps and, brand by brand, in cloud kitchen margins after delivery commission. Read your merchant agreements for any clause about pricing, and keep price language out of the menu text, as the DoorDash rule above shows.
The rule in the example: take the base price from the Items sheet, add the channel's markup, round up to the next 50 cents, then take one cent off. The own site has a markup of 0%, so its price is the base price. Here is the rule applied to four dishes:
| Dish | Own site | App 1, +15% | App 2, +10% |
|---|---|---|---|
| BG-014 Double Smash Burger | $9.49 | $10.99 | $10.49 |
| BG-021 Crispy Chicken Burger | $10.49 | $12.49 | $11.99 |
| BW-006 Teriyaki Chicken Bowl | $11.49 | $13.49 | $12.99 |
| DS-003 Salted Caramel Jar | $6.99 | $8.49 | $7.99 |
Take the first row. $9.49 plus 15% is $10.9135, which rounds up to $11.00, less a cent is $10.99. The same dish on App 2 is $9.49 plus 10%, or $10.439, which rounds up to $10.50, less a cent is $10.49. In the sheet, with the Apps sheet holding the markup in column D, the expected price in Listings column I is one formula: =CEILING(XLOOKUP(B2,Items!A:A,Items!O:O)*(1+XLOOKUP(C2,Apps!A:A,Apps!D:D)),0.5)-0.01. Items column O holds the effective base price, explained next. Both Excel and Google Sheets have CEILING.
Promos need one extra column, or an expired promo will look correct. On the Items sheet, with the base price in I, put the promo price in J and its end date in K, and add the effective base today in O: =IF(AND(ISNUMBER(K2),K2>=TODAY()),J2,I2). Once the end date passes, the expected price reverts by itself, so a promo left on in an app shows up as a mismatch instead of passing as the "right" price.
The check itself is a column that compares live and expected: =ROUND(H2-I2,2)=0. Count failures per channel with COUNTIFS and you have the first line of the tracker. If you take pick-up orders on an app, add a second pair of columns for the pick-up price and its rule. When a formula returns an error, paste it into the assistant with three sample rows and ask what is wrong; debugging a formula is a far safer job for it than proposing the prices.
The change log: one line per change, closed only when verified
The change log is the second half of the system. It records every deliberate change in one line, and it stays open until the change is correct on every listing it touches. This is a slice of the example kitchen's log (illustrative).
| When | Item or recipe | Change | Approved by | Listings touched | Verified live |
|---|---|---|---|---|---|
| Week 5, Mon | DS-003 | Base price $6.49 to $6.99, cream cost rise | Owner | 3 | 2 of 3, open |
| Week 5, Tue | BW-009 | New photo P-0301 after a plating change | Marketing | 3 | 3 of 3, closed |
| Week 5, Wed | R-007 (fries) | Allergen line "Contains: gluten." to "Contains: gluten, milk." after a new seasoning blend | Head chef | 6 | 5 of 6, open |
| Week 5, Thu | DS-009 | Off the menu from 22:00 | Operations | 3 | 2 of 3, open |
| Week 5, Fri | BG-021 | $1 weekend promo, end date Sunday | Owner | 3 | removal not yet checked |
| Week 6, Mon | BW-004 | Renamed to "Sesame Chicken Bowl" | Brand owner | 3 | 2 of 3, open |
Three habits keep it useful. A row opens when the change is approved, not when it is typed into an app, and it closes only when the verified count equals the touched count. "5 of 6" is an open row, however finished the work feels. Verify on what customers see, not on the editor screen. And let recipe changes find their own listings: on the Items sheet, =FILTER(A:A,D:D="R-007") returns every dish that shares recipe R-007, and a second filter on the "built from" column catches dishes made from it. FILTER exists in Google Sheets and in current Excel.
The assistant can draft the one-line notice to staff from a pasted filter result: "R-007 fries seasoning now contains milk. Six listings to update today. Allergen line becomes 'Contains: gluten, milk.'" It does not write the new allergen line. The head chef does, from the supplier's updated specification. For the allergen side of printed and digital menus, allergen icons and dietary labels before you print sets out the checks.
What the Monday check caught in week six
By week six the kitchen pastes each channel's live menu into the Listings sheet on Monday, lets the formulas flag what fails, and has a person scan photos, hours and categories on each app. If an app's dashboard offers no download, copy the menu text from the editor page into the sheet. Screenshots work too, with the assistant tabulating them, but reading images can go wrong, so spot-check five rows against the screen. This Monday's flags were nine out of 162 listings.
| Brand and channel | Check that caught it | What was wrong | Fix |
|---|---|---|---|
| Burgers, App 1 | Price | BG-014 live at $9.49, expected $10.99: the markup was lost when the menu was re-uploaded | Re-enter the price. Add "re-check prices" to the re-upload routine |
| Burgers, App 1 | Price | BG-021 live at $11.49, expected $12.49: weekend promo still on the day after its end date | Remove the promo |
| Burgers, App 1 | Banned wording | BG-009 description says "hand-cut", from a draft written before the banned list existed | Replace with the approved text |
| Burgers, App 2 | Photo | BG-017 photo shows the old bun, from before the recipe changed | Replace the photo |
| Bowls, App 2 | Length | BW-006 description is 122 characters against a limit of 120 | Shorten, keep the allergen line |
| Bowls, App 2 | Name | BW-004 still shows the old name after Monday's rename | Rename on App 2 |
| Bowls, own site | Allergen line | BW-012 still reads "Contains: gluten." after the R-007 change | Update to the approved line, then close the log row |
| Desserts, App 1 | Hours | DS-009 still live after the 22:00 cut-off | Set the hours |
| Desserts, App 2 | Price | DS-003 live at $7.94, expected $7.99: keyed wrongly | Correct it |
Five of the nine trace back to open rows in the change log: the promo, the rename, the allergen line, the hours and the dessert price. They show why a log with a "verified" count is worth keeping. The other four were never logged, and no log would have found them: a markup lost in a re-upload, a description edited inside an app, a stale phrase and an old photo. The log shows what you meant to change. The Monday check shows what the apps are showing. You need both.
The money in the price rows is easy to size. If BG-014 sat at the own-site price on App 1 for the week and sold 40 times (an illustrative figure), it gave away $1.50 on each, or $60. The allergen row has no such sum, and that is the point: it is why the allergen check is a formula, run on every listing every week, never a matter of someone remembering to look.
The nine flags are the tracker's counts from earlier: three open for burgers on App 1, and so on across the grid. When the same two checks fail week after week, treat it as a habit to change, such as editing in an app's dashboard, instead of a list to keep fixing. For the single-brand version of the rewrite step, rewriting delivery-app descriptions and photos with AI covers a takeaway with one menu.
An afternoon to set up, 25 minutes a week to run
Set-up is mostly collecting facts, not building formulas. Gathering the allergen lines and "facts" cells for 54 dishes with the head chef is an afternoon, not an hour, and it is the work that pays back most. Once the sheets exist, the Monday check for 162 listings should take about 25 minutes. Both are planning guesses, so time the first three runs and expect the first to be slow.
The spreadsheets are free. For the assistant, an individual ChatGPT Plus or Claude Pro plan is $20 a month at list price, while the business tiers need at least two seats (about $40 to $50 a month for two) and do not train on your content by default. A menu is public, but your food costs and margins are not, so keep cost columns out of any chat.
Five numbers show whether the system is earning its keep:
- Flags per week. They should fall, then settle at roughly the number of real changes you make.
- Time from approved change to verified live. Aim for the same working day on every channel.
- Complaints and refunds that cite a wrong item, description or price. Record the listing ID with each one.
- Allergen mismatches. The target is none, found by the sheet before a customer could see them.
- Log rows still open after a day. Each is a listing someone has not looked at.
The system is working when changes start in the sheet, when the apps follow within the day, and when the Monday check mostly confirms what you already know.
Questions cloud kitchen owners ask about AI and menu consistency
Can AI write allergen information for my menu?
No. Allergen data comes from supplier specifications and the person who knows the recipe. The assistant may copy an approved allergen line, and a spreadsheet check can confirm it appears word for word, but it should never infer allergens or dietary claims from a dish name or description.
Should prices be identical on every delivery app?
Not necessarily. Apps charge commission, so many kitchens list higher prices there than on their own site. What matters is that each live price matches a written rule for that channel. Read your merchant agreement for any pricing clause, and avoid menu text that tells customers it is cheaper elsewhere.
What do I do when a supplier substitutes an ingredient?
Treat it as a recipe change, even for one service. If the substitute changes the allergen line, the head chef updates the master from the new specification, the change goes in the log, and every affected listing is either updated or switched off on every channel. Switching a dish off is often faster and safer mid-shift; switch it back on, and log that too, when the usual ingredient returns.
How often should I check live menus against the master?
Weekly is a sensible start for a kitchen with several brands, plus a check of the affected listings after every recipe, price or hours change. A change-log row stays open until someone has looked at what customers actually see on every channel.
Do I need menu-sync software as well?
A sync tool can push the master menu to the apps, which saves retyping. It does not remove the need for the master sheet, the allergen sign-off or the checks. Ask how it treats edits made directly in an app's dashboard, because those can leave the two out of step.
Further reads
- Cloud Kitchen Inventory: Forecast Prep by Delivery Platform With AI — Forecast prep for each delivery platform once menus match.
- Are Ghost Kitchens Still Worth It? A Cash-Flow Test You Run With AI — Test whether the whole multi-brand model still pays.
- What Is a Ghost Kitchen? How an Existing Restaurant Can Test One — How a restaurant can try a second brand cheaply.
- AI for Restaurant Order Management: One Queue for Every Channel — Bring orders from every channel into one queue.
- Should an AI Chatbot Answer Allergen Questions for Your Restaurant? — Where an assistant should stop on allergen questions.
- AI Menu Engineering: Which Dishes to Promote, Reprice or Drop — Decide which dishes to promote, reprice or drop.
- How to Write Menu Descriptions With AI That Still Sound Like You — Menu descriptions that still sound like your brand.
- AI Tools and AI Development: The Complete 2026 Guide — the AI hub, including every tutorial in the AI-for-business series.
Sources: DoorDash merchant guidance on adding menu items and descriptions and on its AI description tool; Uber Eats merchant guidance on Menu Maker and Uber's menu-descriptions guidance; Google Docs Editors function list; ChatGPT and Claude plan pages.