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.

What the till actually loads

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:

ButtonWhat you are looking atRow 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

  1. Open Catalog and press Company catalog.
  2. Find the product — the Search box matches name, SKU, or barcode.
  3. Press Add to menu on that row.
  4. Press This store to confirm it now appears there.

Take something off a till

  1. On This store, find the product.
  2. 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.

New products

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

  1. Open Catalog and press Create product.
  2. Fill in Name — it is the only required field. Everything else can wait.
  3. Set Sell price ("What the customer pays (before discounts)") and, if you want margin figures, Cost.
  4. Pick a Tax class. If the list is empty the form says "No store tax classes yet — add rates in Settings" — see Tax.
  5. Press Create product.

The fields, in the order the form asks for them

Basics

FieldWhat it does
NameRequired. What cashiers and reports call this item.
KindPhysical (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 periodMonthly or Yearly. Only appears for Subscription.
DescriptionOptional 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.
CategoryGroups items for the menu grid and for filtering. Defaults to Uncategorized.
Brand / supplierFree text, e.g. "Acme Supply".
SKUYour own code. Leave blank to mint a unique one on save, or press Generate now.
UnitEach, 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 notesShelf 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

Age checks are a prompt, not a lock

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").

  1. Type a New variant name (e.g. "Large") and, if you want one, a Variant SKU.
  2. Press Add variant. A barcode is minted for it automatically.
  3. 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.

Variant prices

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.

CategoryDepartment / aisle
What it is forGrouping on the till grid and the Catalog filterWhere the item physically lives — Produce, Dairy, Bakery
Set onThe product form, Category dropdownThe product form, Department (optional); or in bulk from the Departments page
Managed at—Aisles & departments
There is no screen for creating a category

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."

  1. 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).
  2. Tick Food department if it is food.
  3. Press Create.
  4. 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

  1. Press Download template for headers only, or Download sample for a filled grocery example.
  2. Fill the rows in Excel or Google Sheets. Only name is required; blank sku and barcode are auto-generated. category, department and tax_class must match names that already exist in the store.
  3. 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.
  4. 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).
  5. 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.
  6. Fix anything red, re-upload, then press Commit import.
  7. 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.
  8. 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.

Excel workbooks are not accepted

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

ButtonWhat happens
EditOpens the product drawer with the full form.
DuplicateCopies the product and mints a fresh barcode for the copy. Good for a near-identical line.
ArchiveAsks "Archive '…'? It will be hidden from active catalog." and hides it.
Barcode lookupA panel on the toolbar: scan a code and see which product it belongs to.
Screenshot to come: the Catalog page with the This store / Company catalog switch selected, showing an "Add to menu" button on a company-catalog row.
The scope switch sits in the open, above the product list, because which catalog is on screen changes what every row means.

Limits worth knowing