Menu Management
The Menu tab under Cafeteria is where you build the catalog that customers see at handy.cafe/{slug}. Menus consist of categories and products. Products can have variant groups for choices like Size or Toppings.
Structure
| Level | Purpose |
|---|---|
| Category | A section of the menu, for example "Hot Drinks" or "Burgers". Each category has an icon and a sort order. |
| Product | A single orderable item inside a category. It carries name, description, photo, price, VAT rate, and preparation time. |
| Variant Group | Optional. A choice set attached to a product, for example "Size: Small, Medium, Large". Each variant has an incremental price. |
Categories
Each category has the following fields:
| Field | Meaning |
|---|---|
| Name | Displayed as a section header on the customer menu. |
| Icon | An MDI (Material Design Icons) name. Pick one from the icon picker. |
| Sort Order | Integer. Lower numbers appear first. Adjust with drag or with move-up and move-down controls. |
| Active | When off, the category and all its products are hidden from the customer menu but not deleted. |
Adding a Category
- Open Cafeteria > Menu.
- Click Add Category.
- Enter a name.
- Click the icon box and select an MDI icon. The picker opens a searchable list. Try keywords like "coffee", "burger", or "pizza".
- Save. The category appears in the menu editor.
Reordering Categories
Drag the handle on a category row to move it. The new position is saved as soon as you release. You can also use the move-up and move-down arrows for precise placement.
Soft Delete
Deleting a category with dependent products marks the category as inactive instead of removing the record. This preserves order history that references the original product IDs. To restore, re-enable the category from the admin UI.
Products
Each product has the following fields:
| Field | Meaning |
|---|---|
| Category | The parent category. |
| Name | Visible to the customer. |
| Description | Markdown supported. Appears on the product detail sheet when the customer taps the item. |
| Ingredients | Short line below the description. Use it for allergens or ingredient highlights. |
| Base Price | The price before variants. Stored in minor units (for example cents) but entered in whole currency units. |
| VAT Rate | Percentage. Applied when displaying totals on the customer receipt. |
| Unit | Optional label like "ml" or "g". Appears next to the price. |
| Photo | Product image. Any format is accepted. WebP up to 2 MB is recommended for fastest menu loads. |
| Track Stock | When on, the product carries an in-stock quantity that decrements on every order. |
| In Stock | The current stock count. Orders fail for the customer when stock reaches zero and the product auto-hides. |
| Active | When off, the product is hidden from the customer menu. |
| Sort Order | Position within the category. |
| Preparation Time | Static fallback estimate in minutes. See Dynamic Preparation Time below. |
Uploading a Photo
- Open the product.
- Click the photo area.
- Select an image from your computer. Any format is accepted by the upload endpoint.
- The server processes the file, stores an asset ID, MIME type, and checksum, and returns a URL.
- The photo appears immediately in the editor and on the customer menu within seconds.
Replace a photo by clicking the existing image and uploading a new file. The old file is superseded.
Markdown in Descriptions
Product descriptions support Markdown. Common uses:
- Bold highlights with
**strong**. - Line breaks for multi-line descriptions.
- Short lists for ingredients or pairings.
Avoid headings (H1 through H6) in product descriptions. The customer menu renders the description in a constrained sheet and headings look awkward.
Variant Groups
Variants capture customer choices that change the price or configuration. A product can have multiple variant groups, for example Size and Toppings on the same burger.
Each variant has:
| Field | Meaning |
|---|---|
| Name | The customer-facing label, for example "Size" or "Extra Cheese". |
| Price Delta | The amount added to the base price when this variant is selected. Can be zero or negative. |
| Required | When on, the customer must pick at least one variant from this group before adding to cart. |
| Sort Order | Position within the group. |
Creating a Variant Group
- Open the product.
- Scroll to the Variants section.
- Click Add Variant.
- Enter the name and price delta. Enable Required if the choice is mandatory.
- Save.
Repeat for each option in the group. A typical "Size" group has three rows: Small with delta 0, Medium with delta +1.00, Large with delta +2.00.
Dynamic Preparation Time
HandyCafe can compute a real-time preparation time estimate for every product based on actual kitchen performance. This improves the accuracy of the estimate chip shown on the customer menu and on active orders.
| Setting | Effect |
|---|---|
| Static Time | Stored on the product. Used when there is not enough history to compute a dynamic value. |
| Dynamic Estimate | Calculated from the last 30 days of order history. The average per-product preparation time is multiplied by a busy-factor derived from the current queue length. The multiplier is clamped between 1.0 and 2.0. The final value is clamped between 1 and 120 minutes. |
The "Show Prep Time on Menu" setting in the business profile controls whether the estimate chip is visible to customers. Staff always see the estimate on the Orders dashboard.
Stock Tracking
Enable Track Stock per product to avoid selling items that have run out.
- When an order is placed, the stock count decrements by the ordered quantity.
- When stock reaches zero, the product is automatically hidden from the customer menu until you update the count.
- To restock, edit the product and enter the new In Stock value.
Products without Track Stock behave as infinite inventory and never auto-hide.
Reordering Products Within a Category
Drag the handle to move a product up or down. The new sort order is saved on release. The customer menu reflects the new order after the next menu refresh, which happens on every session load.
Tips
- Start with 6 to 10 categories. Too many categories make the customer menu slow to browse.
- Use high-contrast, well-lit photos. Dim or noisy photos reduce order conversion.
- Keep descriptions under 120 characters when possible. Long descriptions push the Add to Cart button off the first screen on phones.
- Set realistic static preparation times. The dynamic system takes 30 days to learn. Until then the static number is what customers see.
- For items with many choices, split them across two variant groups instead of one huge list. "Size" plus "Milk" is cleaner than "Size with Milk".