Products & menus
The company owns one catalog. Each store puts its own menu on top of it. This page covers adding products, variants and barcodes, units and photos, bulk import, and how to decide what a particular till shows.
The one rule that explains everything else
Products belong to the company. What a till shows is the store's menu — the subset of company products that this shop actually sells.
That split exists because both mistakes are expensive. A chain with six branches should not re-type the same six hundred products six times, and a price change should not have to be made six times either. But a café inside the same company must not have All-Purpose Cleaner on its menu just because the grocery down the road stocks it.
A store that has listed nothing shows nothing. There is no "fall back to the whole company catalog when the menu is empty" behaviour — an empty till is the honest answer, and the screen tells you to go and add items. See Troubleshooting if you have a blank till.
This store / Company catalog
Open Catalog. Under the search box there are two buttons:
| Button | What you are looking at | Row action |
|---|---|---|
| This store | What is on this store's till. The line beside it reads "On <store>'s till. Remove anything this store does not sell." | Remove from menu |
| Company catalog | Every product the company owns — "add what this store sells". | Add to menu |
Put a product on this store's till
- Open Catalog and press Company catalog.
- Find the product — the Search box matches name, SKU, or barcode.
- Press Add to menu on that row.
- Press This store to confirm it now appears there.
Take something off a till
- On This store, find the product.
- Press Remove from menu.
Removing is a decision, not a gap: it sticks even if the store still has stock of that item on the shelf. The product itself is untouched and other stores keep selling it.
A product created while a store is selected is automatically on that store's menu. You only need Add to menu for products that already existed elsewhere in the company.
Create a product
- Open Catalog and press Create product.
- Fill in Name — it is the only required field. Everything else can wait.
- Set Sell price ("What the customer pays (before discounts)") and, if you want margin figures, Cost.
- Pick a Tax class. If the list is empty the form says "No store tax classes yet — add rates in Settings" — see Tax.
- Press Create product.
The fields, in the order the form asks for them
Basics
| Field | What it does |
|---|---|
| Name | Required. What cashiers and reports call this item. |
| Kind | Physical (stocked goods — inventory tracked by default), Service (no stock decrement — gift wrap, delivery, clinic), Subscription (recurring plan — requires customer at sale), Medicine (clinic pharmacy item — inventory tracked by default). |
| Billing period | Monthly or Yearly. Only appears for Subscription. |
| Description | Optional shelf or menu description shown to staff. A Suggest with AI button can draft it and propose a category — it needs an AI key, see Email, SMS & keys. |
| Category | Groups items for the menu grid and for filtering. Defaults to Uncategorized. |
| Brand / supplier | Free text, e.g. "Acme Supply". |
| SKU | Your own code. Leave blank to mint a unique one on save, or press Generate now. |
| Unit | Each, Kilogram, Gram, Pound, Ounce, Litre, Millilitre, Case, Pack. |
| Department (optional) | Aisle assignment — searchable by name or code. Only shown when the Departments add-on is on. |
| Internal notes | Shelf tip, supplier deal, etc. Not printed on receipts. |
Inventory
Physical and Medicine items get Reorder level ("Alert when on-hand falls to this quantity") and a Track inventory for this product tick. Services and subscriptions say plainly "Stock quantity is not required for this kind" and never decrement stock on sale.
Barcodes
Type or scan a code into Barcode, press Generate, or leave it blank with Auto-generate barcode on save ticked — the shop then gets an internal EAN-13 it can print a shelf label from.
Media
Upload from this device — a product photo used on catalog rows and restaurant menu cards. Images are uploaded, not pasted as a URL.
Flags
- Active — available for sale. Untick to take it off sale without deleting it.
- Age restricted — then Age minimum (required) and Age category (Alcohol, Tobacco, Vape, …).
- Returnable (refunds allowed) and Return window (days), which overrides the store default.
Marking a product age restricted records the minimum age on the product. The dedicated age-restricted checkout interlock is listed in Settings as deferred ("Age-restricted checkout interlock deferred"), so do not rely on the till to stop an underage sale by itself. Staff must still check ID.
Variants and extra barcodes
A variant is a size or flavour of the same product — "Large", "500g", "Blue". Every product has one default variant; add more from the product's Variants & barcodes panel ("Extra sizes/flavors and alternate scan codes for this product").
- Type a New variant name (e.g. "Large") and, if you want one, a Variant SKU.
- Press Add variant. A barcode is minted for it automatically.
- To add a second scan code for an existing variant — a multipack barcode, or a supplier's code alongside your own — pick Variant for barcode, type the code into Barcode (blank = auto), and press Add barcode.
Each barcode row shows the code and whether it is the primary one, with a Remove link.
Price, cost and tax class live on the product, not on each variant. If a Large has to cost more than a Regular, make it a separate product for now.
Categories and departments
They are two different things and they are managed in two different places.
| Category | Department / aisle | |
|---|---|---|
| What it is for | Grouping on the till grid and the Catalog filter | Where the item physically lives — Produce, Dairy, Bakery |
| Set on | The product form, Category dropdown | The product form, Department (optional); or in bulk from the Departments page |
| Managed at | — | Aisles & departments |
The product form and the Catalog filter both let you choose a category, and the API can create one, but no page in the app has an "Add category" button today. If your category list is empty, leave products Uncategorized, or use departments — which do have a full screen — until that gap is filled.
Aisles & departments
The page is titled Aisles & departments — "Organize products by aisle or department for catalog filtering."
- Under Create department, enter a Name (e.g. "Produce") and a Short code (e.g. "PROD" — letters and numbers for reports and POS filters, not a long ID).
- Tick Food department if it is food.
- Press Create.
- To file a product, use Assign product: search by name, SKU or barcode, pick a Department (or "— none —" to clear), and press Assign.
The department list shows Name, Code, Products and Food. There is also a Plan aisle layout panel and a Suggest aisle layout button that ask the AI assistant for a naming and layout suggestion — both need an AI key configured.
Bulk import and export
Catalog → Import CSV opens Bulk import — "Download template → fill in Excel → upload file. Dry-run first, then commit." Two methods sit behind tabs: Upload CSV and Scan items.
Upload a spreadsheet
- Press Download template for headers only, or Download sample for a filled grocery example.
- Fill the rows in Excel or Google Sheets. Only
nameis required; blankskuandbarcodeare auto-generated.category,departmentandtax_classmust match names that already exist in the store. - Save as CSV UTF-8 and drop the file on the upload area ("Drop a .csv file here, or click to browse"). There is no row limit — a large file is read in the browser and sent to the server in batches of 500, with a progress bar showing rows done, created, updated and failed.
- Choose what should happen to products that already exist: Create only (an existing SKU is an error — the safe default for a first import), Create and update (an existing SKU is updated, a new one is created), or Update only (an unknown SKU is an error).
- Press Dry run. Nothing is written. The preview colours bad rows and prints the reason in the Status column, and for an update run it says per row whether it would create or update, and which fields change.
- Fix anything red, re-upload, then press Commit import.
- If a batch fails it is retried automatically and the rest of the file still goes through; failures are listed at the end with their row numbers, and you can download just the failed rows as a CSV to fix and re-upload.
- You can press Stop, or close the page. Re-uploading the same file offers to resume: batches that already committed are skipped, so nothing is imported twice.
The columns are name, sku, barcode,
product_type, sell_price, cost,
category, unit, tax_class,
track_inventory, reorder_level,
department, supplier_name, description,
image_url, age_restricted, is_active,
notes. The page prints the same list with an example for each.
Uploading an .xlsx gives you: "Excel .xlsx isn't supported
yet. In Excel: File → Save As → CSV UTF-8, then upload that file." Save as
CSV first.
Only the first 100 rows are shown in the preview, but every row is sent on dry-run and on commit. Commit import stays disabled until a dry run has found at least one valid row.
Scan items instead of typing them
The Scan items tab is for a shop with a gun and no spreadsheet: "Scan each item with the gun, type a name and price, then build the import. Barcodes you already sell are shown and skipped, so scanning can never duplicate a product."
Export
Export CSV on the Catalog page downloads exactly what the current filters are showing (the button's tooltip tells you which: "Export products matching current filters" or "Export all products"). The import page has the same thing as Export catalog, which always exports everything.
Everyday jobs on a product row
| Button | What happens |
|---|---|
| Edit | Opens the product drawer with the full form. |
| Duplicate | Copies the product and mints a fresh barcode for the copy. Good for a near-identical line. |
| Archive | Asks "Archive '…'? It will be hidden from active catalog." and hides it. |
| Barcode lookup | A panel on the toolbar: scan a code and see which product it belongs to. |
Limits worth knowing
- Prices and tax classes are per product, not per store. A branch cannot charge a different price for the same product yet.
- There is no bulk "add these 200 products to this store's menu" action — listing is one row at a time.
- Categories cannot be created from any screen (see the warning above).
- Variant pricing is not separate from the parent product.