Products
The Products module is where you define the items guests can order. Staff select products from this catalog when creating an Order inside a Conversation.
Product Fields
| Field | Required | Description |
|---|---|---|
| Name | ✅ | Display name (e.g., “Pho Bo”, “Room Service Towels”) |
| Description | ❌ | Optional details about the product |
| Price | ✅ | Base price (decimal, e.g., 12.50) |
| Discount | ❌ | Percentage (1–100%) or Fixed amount reduction |
| Sort Order | ❌ | Controls display order (lower = appears first) |
| Label | ❌ | Colored badge shown on product cards in the guest shop (e.g., “Hot”, “New”) |
| Is Special | ❌ | Highlights product in the top carousel on the guest shop page |
| Is Featured | ❌ | Shows product in the featured section on the guest shop page |
| Tags | ❌ | Categorization labels (see below) |
| Images | ❌ | Multiple photos; the first becomes the cover image |
| Option Groups | ❌ | Customization options guests choose when ordering (e.g., Size, Sugar Level) |
| Status | ✅ | active — visible to staff; inactive — hidden |
Discount System
EmberX supports two discount types, selectable per product:
| Type | How it works | Example |
|---|---|---|
| None | No discount | Price: $12.50 → Sale: $12.50 |
| Percentage | Reduces price by X% (1–100) | 20% off $12.50 → $10.00 |
| Fixed | Reduces price by a fixed amount | $2 off $12.50 → $10.50 |
A live preview shows the calculated sale price while you type.
Price Snapshot in Orders
When a staff member adds a product to an Order, the system stores a JSON snapshot of the product’s name and price at that moment. This means:
- Changing a product’s price later does not affect existing orders.
- Historical order data always reflects what the guest was actually charged.
Tags
Tags are flexible labels used to categorize products (e.g., food, beverage, spa, housekeeping).
- Tags are shared across the system (stored in the
Tagtable, categoryproduct). - When adding a product, you can select existing tags or create new ones inline.
- Tags also power the Feedback Routing system in Settings.
Label & Badge System
Each product can display a colored label badge on its card in the guest-facing shop page. This helps guests quickly identify featured or time-sensitive items.
Label Presets
| Label | Color |
|---|---|
| (None) | — |
| Hot | 🔴 Red |
| New | 🔵 Blue |
| Must Try | 🟣 Purple |
| Popular | 🟠 Orange |
| Limited | 🌸 Rose |
| Best Seller | 🟢 Green |
You can also type a custom label text and pick any color using the color picker. A live preview of the badge is shown while editing.
Promotional Flags
Two boolean flags control how a product appears in the guest shop layout:
| Flag | Effect |
|---|---|
| Is Special | Product appears in the top carousel (horizontal scroll) at the top of the shop page |
| Is Featured | Product appears in the Featured section below the carousel |
Product Options (Customization)
Option Groups let guests customize their order — for example, choosing a size or sugar level. Each product can have multiple groups, and each group can have multiple options.
Structure
Product└── Option Group (e.g., "Size") required: true ├── Option: "Small" priceAdjust: −1.00 ├── Option: "Medium" priceAdjust: null (no change) └── Option: "Large" priceAdjust: +2.00└── Option Group (e.g., "Sugar Level") required: false ├── Option: "100%" priceAdjust: null ├── Option: "50%" priceAdjust: null └── Option: "0%" priceAdjust: nullOption Group Fields
| Field | Description |
|---|---|
| Group Name | Label shown to guest (e.g., “Size”, “Ice Level”) |
| Required | If checked, guest must choose an option before submitting the order |
| Options | List of selectable items within the group |
Option Fields
| Field | Description |
|---|---|
| Option Name | The choice label (e.g., “Large”, “No Ice”) |
| Price Adjust | Amount added to or subtracted from base price. Leave blank for no change. Use +2.00 to add, -1.00 to subtract. |
Managing Option Groups
In the product form, scroll to Option Groups:
- Click Add Group to add a new customization group.
- Enter a group name and toggle Required as needed.
- Click Add Option within a group to add individual choices.
- Drag the grip handle (⠿) to reorder groups.
- Click 🗑️ to remove a group or individual option.
Images
Products support multiple images. The upload component accepts common image formats. The first image in the list automatically becomes the imageUrl (cover image) used in order previews.
Adding a Product
- Go to Products in the sidebar.
- Click Add Product (top right).
- Fill in Name and Price (required).
- Optionally set Discount, Label, Is Special / Is Featured flags.
- Add Option Groups for customizable items (e.g., size, temperature).
- Add Tags and Images as needed.
- Set Sort Order to control display position.
- Set Status to
activeto make it available immediately. - Click Create Product.
Editing a Product
Click the Edit button on any row to open the slide-over panel with pre-filled fields. Changes take effect immediately after saving.
Deactivating vs. Deleting
| Action | Effect |
|---|---|
| Toggle Inactive | Hides the product from ordering; preserves history |
| Delete | Permanently removes; existing order snapshots are unaffected |
Currency
Product prices are stored in the currency configured in Settings → Shop. Supported currencies:
- USD ($) — default
- VND (₫) — Vietnamese Dong
Switching currencies triggers a conversion dialog that optionally bulk-converts all existing product prices.
Shop Visibility (Enable Shop)
The entire shop and ordering feature can be toggled on or off from Settings → Shop → Enable Shop.
- When enabled: the menu button and shop page are visible to guests in the chat interface.
- When disabled: the menu button and shop page are hidden from guests — useful during off-hours or menu maintenance.
See Settings for full configuration details.