Menu Management
Categories
Categories group your dishes (e.g., "Starters", "Mains", "Drinks"). Customers see dishes organized by category on your storefront.
Creating a Category
- Go to Menu > Categories.
- Click Add Category.
- Enter the category name.
- Optionally add a localized name (second language) — this will display alongside the primary name on both the storefront and POS.
- Set the sequence number to control display order (lower numbers appear first).
Reordering Categories
Drag categories or edit their sequence number. Categories are displayed in sequence order on both the storefront and the POS.
Deleting Categories
Deleted categories are soft-deleted (archived). They're hidden from menus but preserved for historical order references.
Dishes
Creating a Dish
- Go to Menu > Dishes.
- Click Add Dish.
- Fill in:
- Name — Primary dish name.
- Localized name (optional) — Second-language name displayed alongside the primary name.
- Description — Short description shown on the storefront.
- Category — Assign to a category.
- Price — Regular price for online orders.
- In-store price (optional) — If set, this price is used for in-store POS orders instead of the regular price.
- Photo — Upload a dish photo (stored on Cloudflare R2).
- Sequence — Controls display order within its category.
- Toggle Available on/off to control whether the dish appears on the menu.
Modifier Groups
Modifier groups let customers customize dishes (e.g., "Choose your size", "Add toppings").
- Go to Menu > Modifier Groups (or add from the dish form).
- Create a group with:
- Group name — e.g., "Size", "Extra toppings".
- Localized name (optional) — Second-language name.
- Add options to the group:
- Option name — e.g., "Large", "Extra cheese".
- Localized name (optional).
- Additional price — Extra cost for this option (can be $0).
- Assign modifier groups to dishes.
When a customer adds a dish with modifier groups, they'll be prompted to select options. The modifier costs are added to the dish price.
Photos
- Photos are uploaded directly to Cloudflare R2 via presigned URLs.
- The upload flow: request a presigned URL → upload the image → store the file key in the database.
- Images are served via R2's public URL and optimized through
next/image.
Availability Toggle
Toggle any dish's availability on or off. Unavailable dishes are hidden from the customer-facing menu but remain in your dashboard for editing.
Soft Deletes
Deleted dishes use a deletedAt timestamp. They're archived — hidden from menus but preserved so historical orders still reference them correctly.
Bilingual / Localized Names
If your restaurant serves a multilingual customer base, you can set localized names on:
- Dishes — Both names displayed on storefront and POS.
- Categories — Both names shown as section headers.
- Modifier groups and options — Both names shown in modifier selection.
- Print receipts — Localized names appear alongside primary names.
