Most milk tea menus aren't static โ customers pick a flavor, add boba, upgrade to oat milk, ask for less ice. Amari handles all of this with two related concepts: flavors (the main characteristic of the drink) and add-ons (extras layered on top). Both are modeled as separate product groups marked as "add-on" and linked to the parent product.
The mental model
- A regular product (Matcha Milktea, Frappe, Pizza) is what the customer is ordering. They must pick a size.
- An add-on group is a list of optional or mandatory extras. Customers can pick zero, one, or many from the group.
- A flavor is just a special kind of add-on group where the items are mutually exclusive โ pick one. A flavored frappe needs exactly one flavor selected.
Behind the scenes, flavors and add-ons are the same data structure. The difference is convention โ "flavors" means single-select, "add-ons" means multi-select. Both are stored as ProductGroup withisAddOn=true.
Real example: a Matcha Milktea
Say you sell a Matcha Milktea with these options:
- Sizes (mandatory, single-select): Regular โฑ70, Medium โฑ90, Large โฑ110, Buy 1 Take 1 โฑ138
- Sweetness (optional, single-select): 0%, 25%, 50%, 75%, 100% โ all free
- Add-ons (optional, multi-select): Extra Boba +โฑ15, Nata +โฑ10, Cheese Foam +โฑ20
Sizes are the variants of the main product โ already covered in "Adding your first products". Sweetness and add-ons are separate add-on groups linked to the main product.
How to create an add-on group
Go to Store โ Products โ + New Product
Same place you create regular products.
Set Type to Add-On
At the top of the create form, there's a toggle or dropdown for Type. Pick Add-On instead of Product. The form fields change slightly to fit the add-on use case.
Name the group
Use a clear name like "Milktea Add-Ons" or "Sweetness Level". The name appears as a section header in the customer-facing product popup.
Add variants for each option
For an add-on group called "Milktea Add-Ons", you might add:
- Extra Boba โ โฑ15
- Nata de Coco โ โฑ10
- Coffee Jelly โ โฑ15
- Cheese Foam โ โฑ20
Each variant is one specific add-on with its own price. You can also give each variant its own recipe (so e.g. Extra Boba deducts 30g of tapioca pearls + 1 boba straw).
Save the add-on group
Tap Save. The group now exists but isn't attached to anything yet. Time to link it.
Link the add-on group to a product
Open the regular product (e.g. Matcha Milktea) โ Edit โ scroll to Add-Ons section โ tap Link Add-On Group โ pick "Milktea Add-Ons" from the list โ Save the product.
The add-ons are now visible in the product popup at the POS and on QR ordering.
Single-select (flavors) vs multi-select (add-ons)
In the add-on group settings, there's a flag for single-select:
- OFF (default) โ multi-select. Customer can pick zero, one, or many. Use this for true add-ons (boba + nata + cheese foam = all three).
- ON โ single-select. Customer must pick exactly one. Use this for flavors (Matcha or Strawberry, not both) and modifiers like sweetness level.
Add-on recipes
Add-ons have their own recipes, separate from the parent product's recipe. When a customer orders a Medium Milktea with Extra Boba, Amari deducts:
- Everything in the Medium Milktea recipe (cup, powder, milk, ice, etc.)
- PLUS everything in the Extra Boba recipe (30g tapioca pearls, 1 boba straw)
Set add-on recipes the same way you set product recipes โ open the add-on group, tap Edit Recipe on each variant, add the ingredients consumed. See the "Creating a recipe" article for details.
Tips for clean menu design
Group similar add-ons together
Don't make 10 separate add-on groups for one drink. Bundle related add-ons into 2โ3 groups (e.g. "Sinkers", "Toppings", "Milk Upgrade") so customers see them in clean sections instead of one long list.
Use mandatory vs optional intentionally
Sweetness is usually a mandatory single-select (you can't buy a drink without specifying sweetness). Cheese foam is optional. Mark them differently in the add-on group settings โ Amari will enforce mandatory selection at checkout.
Reuse add-on groups across products
Don't create a new "Sinkers" group for every single drink. Create it once and link it to every product that uses the same options. When you add a new sinker, all linked products get it automatically.
Check the customer view
After setting up flavors and add-ons, open the product on the POS and step through the popup as if you were ringing up a sale. Make sure the order of options makes sense, prices are right, and nothing is duplicated. Same for the QR ordering view.
Related articles
- Adding your first products
- Creating a recipe
- Editing product prices