Skip to content

The menu editor

The editor is where your menu actually lives before anyone sees it. Everything here edits a draft — nothing changes on the public page until you publish.

/app/menu lists your menu as sections, each holding its items in order. Add a section, rename it inline, and drag to reorder sections or the items inside one. Deleting a section only works once it’s empty — move or delete its items first. Deleting an item is a soft delete: it disappears from the draft immediately, and undoing the change from the activity log brings it back.

At the end of every section is a quick-add table with Name (EN), Name (AR), Price, Calories, Description (EN) and Description (AR). Type one dish per row: a new empty row appears as you type, and Enter jumps to the next row’s name. Save N saves every filled row at once, appended after the section’s existing items in the order you typed them, as one change you can undo from Activity; empty rows are skipped. Each dish needs a name in at least one language. If any row has a problem nothing is saved, that row says what to fix, and everything you typed stays. Prices accept Arabic digits and a decimal comma (١٢٫٥ or 12,5). Your plan’s item limit applies to the whole save.

Allergens, dietary tags, badges and photos are not part of a row — add them from each dish’s drawer, or review allergens for the whole menu at once.

Paste rows takes rows copied from Excel, Google Sheets or a CSV file. With a header row, columns are matched by their names (English or Arabic, the same names the Imports page understands); without one they fill Name (EN), Name (AR), Price, Calories, Description (EN), Description (AR) in that order. Columns the table has no place for are listed as ignored. You can also paste several rows straight into any cell. Pasted rows are not saved until you press Save N, so check them first. Up to 200 rows fit at a time; for a whole menu with its sections, use Imports.

Opening an item covers everything about it in one place: name in English and Arabic, description in both languages, a price and a “was” compare-at price (both in SAR), calories, allergens, may-contain and dietary tags, contexts (dine-in, pickup, delivery, with a pickup-specific price override), up to two badges, and photos. Allergen chips show eight at a time with a link for the rest. Photos accept JPEG, PNG or WebP up to 10 MB each, with at most 10 in one batch. A calorie value your agent estimated carries an “est.” tag and a confirm link — confirming it, or typing a value yourself, clears the flag. Changing an item’s section here moves it to the end of that section, after its existing items.

Duplicate (in an item’s ⋯ menu or the drawer) opens a new, unsaved copy with everything but the photos: the names end in “(copy)” for you to change, and the allergen confirmation is cleared because a copy is a different dish. The copy starts available and is added at the end of its section when you save. Duplicate copies the item as it was last saved, not unsaved changes sitting in the open drawer. Save and add another saves and keeps the drawer open on a new item in the same section with the same allergens (unconfirmed), may-contain, dietary tags and badges; the name, description, prices, calories and offer start empty.

Review allergens (in the editor’s toolbar, and next to the audit’s missing-allergens count) opens one page listing every item by section with its allergen and may-contain chips and a Confirm tick. Not reviewed only is on while anything is unconfirmed. Change chips in place — changing an item’s allergens clears its tick until you tick it again — then Save writes only the items you changed, as one change in Activity. Confirm all shown first repeats the confirmation sentence from the item drawer with the number of items, then confirms every item shown (respecting the filter). Each item still carries its own confirmation, and diners’ assistants only treat an item as safe for an allergy once you have confirmed it.

Tick items (or a section’s box to tick every item shown in it) and a bar appears: N selected · Move to section · Change price · Dietary tags · Clear. Move to section puts the items at the end of the section you pick, in their current order. Change price raises or lowers every selected price by a percentage (for example 10 or −5, between −90 and +300), rounded to the nearest whole riyal; it lists each item’s old and new price first, skips items without a price, leaves “was” and pickup prices alone, and warns when a new price reaches an item’s “was” price (its offer then stops showing). Dietary tags adds or removes tags on every selected item and leaves the others alone. Each action is one change you can undo from Activity, as a whole. Bulk actions apply only to the ticked items the current search or filter still shows; a ticked item a filter hides is left out until you clear the filter.

Every edit above lands in the draft. Publish bumps the menu to a new version, snapshots it, and pushes that snapshot to the public page and the fast store the availability endpoint reads from — all within moments, not a rebuild. Unpublish takes the live menu offline without touching the draft underneath it. The editor also shows how many draft changes are waiting since the last publish, so it’s obvious when there’s something to push live.

Publish asks first: it lists how many items will be added, edited and removed (sold-out changes are already live, so they are never part of a publish), and, when most items have no photo and another template suits the menu better, links to the theme editor. Publish now makes it live and gives you a link to the live menu.

Run audit checks the draft for missing calories, allergens, photos and translations, price outliers, possible duplicates and expired offers. Click any count to show only those items; Show all items clears it. An item counts as complete on allergens once you tick the confirmation in the item drawer, even with no allergen selected — that is how you record “contains none”.

+ Item starts in the section you last saved an item to or just created.

Your agent edits the same draft through the same tools the editor calls. Ask something like:

Add a “Grills” section with three items from this photo, then tell me what’s still missing a calorie value

and it uses upsert_sections and upsert_items to create them, returning warnings for anything incomplete. Either tool accepts dry_run: true to preview the change before it’s saved; once you’re happy, ask the agent to publish_menu to make it live.