Home / Help Center / pos-app / Products / Products
📦 Products

Products

Products is the master catalogue for everything you sell — names, prices, tax, stock levels, variants, bulk-quantity pricing, kit/combo bundles and add-on modifiers all live here. It is the single source of truth every other page (billing, inventory, barcodes, reports) reads from.

📍 Menu path: Products → Products
👤 Who uses it: All roles that can view Products; Add/Import/Print Labels need Create rights, Edit needs Edit rights, Delete needs Delete rights (bulk delete is Admin-only), Export needs Export rights — set per-role under Settings → Staff Permissions

Overview

The Products page lists every item you sell in a searchable, sortable, filterable table (or a photo-grid view), with live stat cards for total/active/low-stock/out-of-stock counts and total stock value.

Clicking Add Product or Edit opens a full-screen form organised into cards: Basic Info, Pricing & Tax, Inventory & Stock, and — once a product is saved — five more sections unlock underneath: Variants, Price Tiers, Components (for kits), Alt. Units and Modifiers. An Additional Details card and an SEO & Social Media card are also available in Advanced mode.

Beyond the core form, the page hosts four connected tools: a Category Manager (colour-coded, nestable one level deep), a Bulk Import modal (CSV/Excel with a downloadable template and row-by-row validation preview), a Barcode Print modal (multi-size, multi-layout label sheets), and CSV/Excel/PDF export of the currently filtered list.

Everything here is scope-aware: an Admin creating a product picks Visibility (This branch only / All branches in unit / All branches in company), and Company-level or Unit-level items are shown with a small "Co." / "Unit" badge in the list so Admins can tell at a glance where an item lives.

Before You Start

Step-by-Step Guide

1 Browse, search, filter and sort the catalogue

The default table view is built for speed when you have hundreds of SKUs.

  1. Type in the search box to filter by name, SKU or barcode — search is debounced (waits 400ms after you stop typing) and resets you to page 1.
  2. Use the Category dropdown to narrow to one category, and the Status dropdown for Active / Inactive / Low Stock / Out of Stock (the last two only show when Inventory is enabled).
  3. Click any of the stat cards at the top (Total, Active, Low Stock, Out of Stock) to instantly apply that same filter — the active card is highlighted with a blue ring.
  4. Click a sortable column header (Product, Price, Cost) to sort by it; click again to flip between ascending and descending — a small arrow icon shows the current direction.
  5. Switch between Table view (dense, spreadsheet-like) and Grid view (photo cards) with the two icons on the right of the toolbar.
  6. Use Prev / page-number buttons / Next at the bottom to page through results — 10 products are shown per page.

2 Add or edit a product — Basic Info, Pricing & Tax, Inventory

Click Add Product (or the pencil icon on any row) to open the full-screen product form.

  1. In Basic Info, enter the Product Name, optionally Brand and Season/Collection, choose a Unit (from your Settings → Stock Settings unit list) and how it is Sold — per unit, by length (cut to size), or by area (width × height, for glass/plywood/fabric).
  2. Pick a Category from the dropdown, or choose "+ Add New Category" to create one inline without leaving the form; use "Manage categories" to open the full Category Manager.
  3. Write a Description using the built-in rich text toolbar (Bold, Italic, Underline, bullet and numbered lists), add Tags by typing and pressing Enter, and add product Images either by pasting an image URL or uploading files from your device.
  4. In Pricing & Tax, enter Selling Price and Cost Price (both required) plus optional MRP and Discount %. Pick the tax rate — the label and CGST/SGST/IGST or GST/PST split shown automatically match your business's configured tax system (GST India, VAT, Sales Tax, etc.); Composition-scheme and Unregistered dealers see a locked, explanatory field instead since per-product tax does not apply to them.
  5. Optionally assign one or more Tax Master taxes under "Tax Master Assignment" — this shows a live preview of the tax breakdown and final price as you add taxes.
  6. Choose Product Type (Goods vs Services) to reveal the matching HSN Code or SAC Code field, and set GST Cess % if the item is tobacco, a luxury good or an aerated drink.
  7. A live Profit Margin card appears once both Price and Cost Price are filled in, showing margin %, profit per unit, and the effective price after any discount.
  8. In Inventory & Stock, set the SKU (required — use the Auto button to generate one from the category/name) and an optional Barcode (Gen button creates a random EAN-style code). Set Opening Stock (new product) or Current Stock (editing), Min Stock Level, Max Stock Level and Reorder Point.
  9. Toggle Sold by Weight to price the item per kg/other unit and add a PLU/scale code; toggle Age-Restricted Item to force ID verification at billing (with a configurable minimum age); toggle Composite/Kit Product for bundles; toggle Track Inventory, Serial Number Tracking and Batch/Lot Tracking as needed.
  10. Click Create Product (or Update Product). On first save the product stays open in edit mode so you can immediately configure Variants, Alt. Units and Modifiers — a toast reminds you of this.
💡 Name, Selling Price, Cost Price and SKU are the only hard-required fields; the form auto-scrolls to and focuses the first missing one if you try to save without them.

3 Fill in Additional Details and SEO (Advanced mode)

Toggle Advanced / Basic mode with the pill button in the form's footer — your choice is remembered on this device.

  1. Additional Details (Advanced mode) covers Manufacturer, Part/Model Number, a Cashier Note shown to staff when the item is scanned, Weight & Dimensions for shipping, and food/pharmacy fields: Composition, Generic Name, Drug Schedule (None/H/H1/X/Narcotic — a Schedule other than None makes billing require a doctor and patient name), Allergens and Ingredients (both tag lists).
  2. SEO & Social Media (Advanced mode, existing products) shows the live Storefront Product URL with copy and open-in-new-tab buttons, an editable URL Slug, Meta Title (70-character counter), Meta Description (160-character counter), Meta Keywords, and a Social Share Image with a "Use Product Photo" shortcut that reuses the first product photo.

4 Configure Variants, Price Tiers, Alt. Units, Modifiers and Kit Components

These five manager cards only appear once a product has been saved (Advanced mode) — each is its own independent, auto-saving mini table.

  1. Variants — click Add Variant and fill Name (e.g. "500g / Red"), SKU (Auto button available), Barcode, Price (leave blank to inherit the parent price), Cost Price, Stock and Active; edit or delete any row inline.
  2. Price Tiers — click Add Tier for quantity-based pricing: Tier Name, Min Qty, Max Qty (blank = no upper limit), Price (shows the automatic % discount vs. the base price) and optionally a Customer Group so a tier only applies to that group (e.g. a "Contractor" price list) — group-scoped tiers beat "All customers" tiers of the same quantity.
  3. Alt. Units — click Add Unit to let the same product be sold in other units (e.g. dozen, case). Set the unit name, a Conversion Factor relative to the base unit (1 dozen = 12 pcs → factor 12), an optional fixed Price (blank auto-calculates as base price × factor) and an optional dedicated Barcode to scan straight into that unit.
  4. Modifiers — use the modifier editor to define add-on groups shown to the cashier at sale time (e.g. size or toppings). Mark a group "One" (pick exactly one) or "Many" (pick multiple), mark it Required to force a choice before checkout, and set a price per option (0 = free).
  5. Components (only meaningful once "Composite / Kit Product" is turned on) — search for and add other products as components with a Qty per Kit and an optional note; the card totals the running kit component cost, and each component's stock is automatically deducted whenever the kit itself is sold.
💡 Every one of these five managers saves independently — there is no single "Save" for the whole product form beyond the top-level Create/Update button; each card has its own Save button that only appears once you have made a change.

5 Organise categories

  1. Click the Categories button in the toolbar (or "Manage categories" inside the product form) to open the Category Manager.
  2. Fill Name (required), optional Description, optional Parent Category (categories nest one level deep) and pick a colour from the ten presets or a custom colour picker; Admins also choose Visibility (branch/unit/company) when creating.
  3. Click a category with sub-categories to expand/collapse its children; each row shows how many products are in it.
  4. Edit or Delete any category from its row — deleting one with sub-categories promotes them to top-level, and any products in the deleted category simply become uncategorised (a confirmation dialog explains this before you proceed).

6 Bulk import products from a spreadsheet

  1. Click Import in the toolbar to open the Bulk Import modal.
  2. Drag & drop or click to upload a CSV, XLSX or XLS file — or click "Download sample template" first to get the exact column layout with an example row.
  3. Required columns are Name, Price and Cost Price; SKU is optional but any SKU that matches an existing product updates it instead of creating a duplicate. Barcode, Category, Brand, Unit, Tax Rate, MRP, HSN Code, Opening Stock, Min/Max Stock, Reorder Point and Discount are all optional.
  4. Review the Preview step — every row is validated client-side and shown as OK (green) or with a specific error (red, e.g. "price invalid"); the header bar shows a running count of valid vs. error rows.
  5. Click "Import N Products" to send only the valid rows to the server. The final step reports how many were created vs. updated, plus a list of any server-side rows that were still skipped and why.

7 Print barcode labels for one or many products

  1. Click Print Labels in the toolbar (only visible with the Barcode feature enabled) — it opens seeded with the products currently loaded on your page.
  2. Search the left-hand product list, check the ones you want, and use the +/− stepper (or type a number) to set how many copies of each label you need — up to 100 per product.
  3. Choose a label Size (Small/Medium/Large) and a sheet Layout (1/2/3/4 labels per row), and toggle whether to Show name and Show price on each label.
  4. Review the live preview grid, then click "Print N Labels" — this opens a dedicated print window sized to your chosen layout and triggers the browser print dialog automatically.
💡 If the print window does not open, your browser is blocking popups for this site — allow popups and try again.

8 Bulk actions, inline edits and export

  1. Select multiple rows with the checkboxes to reveal a bulk-action bar: Activate and Deactivate (Manager/Admin), Delete (Admin only, with a confirmation prompt), and Clear selection.
  2. Click directly on a product's SKU text in the table to edit it inline — press Enter to save or Escape to cancel — and click the Active/Inactive icon to toggle status with one click (both require Edit rights).
  3. Use the Export dropdown (needs Export rights) to download the entire filtered/sorted list — not just the current page — as PDF, Excel or CSV, complete with SKU, Name, Brand, Category, Unit, Price, Cost, Tax, Stock, Discount and Status columns.

Every Field & Button, Explained

Field / ButtonWhat it does
Stat cards (Total / Active / Low Stock / Out of Stock / Stock Value)Live counts from /products/stats; clicking a card (except Stock Value) applies the matching status filter to the table below. Low Stock, Out of Stock and Stock Value only appear when the Inventory feature is on.
Search boxDebounced 400ms free-text search across product name, SKU and barcode, run server-side.
Category filterRestricts the list to one category (top-level or sub-category).
Status filterAll / Active / Inactive / Low Stock / Out of Stock — the last two require the Inventory feature.
Table / Grid toggleSwitches between a dense spreadsheet-style table and a photo-card grid; both share the same filters, sorting and pagination.
Import buttonOpens the Bulk Import modal (CSV/Excel). Requires Create rights.
Print Labels buttonOpens the Barcode Print modal seeded with the currently loaded products. Requires Create rights and the Barcode feature.
Add Product buttonOpens a blank product form; blocked with a toast if your plan's product limit has been reached.
Categories buttonOpens the Category Manager modal. Requires Edit rights.
Export dropdown (PDF / Excel / CSV)Re-fetches every matching product (ignoring pagination) and downloads it in the chosen format. Requires Export rights.
Bulk action barAppears once one or more rows are checked: Activate / Deactivate (Manager+) and Delete (Admin only, with confirmation), plus Clear selection.
Inline SKU editClick a product's SKU in the table to edit it directly; Enter saves, Escape cancels. Manager/Admin only.
Active/Inactive toggle iconOne-click status flip directly from the table row for users with Edit rights; read-only badge otherwise.
Delete (row action)Soft-deletes the product; products with existing sale history are deactivated instead of hard-deleted so historical bills remain intact.
Product Name *Required. The name shown everywhere — POS, receipts, reports, storefront.
Visibility (Admin, create-only)"This branch only" / "All branches in unit" / "All branches in company" — controls which stores can see and sell this product.
Brand / Season-CollectionFree-text descriptive fields used for filtering, search and merchandising (e.g. brand name, "SS25", "Eid 2025").
UnitBase unit of sale (pcs, kg, box, etc.), sourced from Settings → Stock Settings custom units.
Sold byPer unit (normal) / By length (cut to size) / By area (width × height) — changes what billing asks for at sale time.
Category (+ Manage categories / + Add New Category)Assigns the product to a category; you can create a brand-new category inline without leaving the form.
DescriptionRich-text field (bold/italic/underline/lists) shown on the storefront and printable catalogues.
TagsFree-form keyword chips — type and press Enter to add, click × to remove.
ImagesAdd by URL or upload from device (multiple files supported); shown as thumbnails with a hover remove button.
Selling Price *Required. The price charged to customers before tax/discount.
Cost Price *Required. Your purchase/landed cost — drives the profit margin calculation and is never shown to customers.
MRPOptional maximum retail price, printed on receipts/labels where applicable.
Discount (%)A standing discount percentage automatically applied at billing.
Tax Rate (%)Dynamic label (GST/VAT/Sales Tax) and slab list based on your configured tax system; shows CGST/SGST/IGST (India) or GST/PST (Canada) splits automatically. Disabled with an explanatory note for Composition-scheme or Unregistered dealers.
Tax Master AssignmentAssign one or more taxes from the multi-country Tax Master; shows a live tax breakdown and final-price preview as you add/remove taxes.
GST Cess (%)Additional cess for tobacco, luxury goods or aerated drinks, on top of the regular tax rate.
Product TypeGoods (shows HSN Code field) or Services (shows SAC Code field).
Profit Margin cardAuto-calculated once Price and Cost Price are both set: margin %, profit per unit, and effective price after discount.
Sold by Weight toggle + PLU codeMarks a loose/weighed item and lets you set a short PLU/scale code for keypad entry and scale labels.
Age-Restricted Item toggle + Minimum ageForces the cashier to confirm the customer's age before this item can be billed.
Composite / Kit Product toggleMarks this product as a bundle made of other products; unlocks the Components manager after saving.
Track Inventory toggleTurns stock tracking on/off for this product (off for services or non-stocked items); hidden entirely for kit products.
Serial Number Tracking / Batch-Lot Tracking togglesOnly shown when Track Inventory is on; enable per-unit serial numbers or per-batch/lot + expiry tracking respectively.
SKU * (+ Auto)Required unique stock code; Auto generates one from the category/name plus a random suffix.
Barcode (+ Gen)Optional scannable code; Gen creates a random timestamp-based numeric code.
Opening Stock / Current StockOpening Stock sets the starting quantity when creating a new product; Current Stock directly overwrites the quantity when editing.
Min Stock Level / Max Stock Level / Reorder PointMin drives the low-stock alert threshold; Max and Reorder Point support purchasing and stock-count workflows.
Manufacturer / Part-Model NumberAdvanced-mode fields for supplier/manufacturer traceability.
Cashier NoteA short note shown to the cashier the moment this item is scanned at billing (e.g. "Age verification required").
Weight & DimensionsShipping-relevant physical attributes: weight + unit, and length × width × height + unit.
Composition / Generic Name / Drug Schedule / Allergens / IngredientsFood and pharmacy fields; a Drug Schedule other than "None/OTC" makes billing require doctor and patient details for that sale.
Storefront Product URLLive link to this product on your online store, with copy and open buttons; only shown for saved products with an online store configured.
URL Slug / Meta Title / Meta Description / Meta Keywords / Social Share ImageStandard SEO fields controlling how the product appears in search engines and when shared on social/WhatsApp.
Advanced / Basic mode toggleShows or hides Additional Details, SEO, and the Variants/Price Tiers/Components/Alt. Units/Modifiers managers; remembered per device.
Variants managerSize/colour/weight variations, each with its own SKU, barcode, optional price/cost override and stock.
Price Tiers managerQuantity-based bulk pricing slabs, optionally scoped to a customer group; applied automatically at billing.
Alt. Units (UOM) managerSell the same product in other units (dozen, case) with a conversion factor, optional fixed price and dedicated barcode.
Modifiers managerAdd-on option groups (single- or multi-select, optionally required) offered to the cashier at sale time, each option with its own extra price.
Components manager (kits only)The products that make up a kit/bundle, each with a quantity-per-kit; shows the running total component cost and auto-deducts component stock on sale.
Category Manager: Name / Description / Parent / Color / VisibilityCreates or edits a category; categories nest one level deep and can be colour-coded for quick recognition in lists.
Bulk Import: Download sample templateDownloads an Excel file with the exact expected column headers and one filled example row.
Bulk Import: Preview stepClient-side validation of every row before import — flags missing name, invalid price or invalid cost price per row.
Barcode Print: Size / Layout / Show name / Show priceControls label dimensions, how many labels per row on the printed sheet, and which text appears on each label.

Tips & Best Practices

Troubleshooting & FAQ

I deleted a product but it still shows up as "Inactive" instead of disappearing.
Products that already have sale history are deactivated rather than permanently deleted, so historical invoices stay accurate. Use the Status filter to hide inactive products from your normal view.
The Add Product button is disabled / shows a plan-limit warning.
Your subscription plan caps the number of products you can have. The count next to the button (used/limit) shows where you stand — upgrade your plan to add more.
Why don't I see the Stock column, Low Stock filter, or Print Labels button?
Stock fields need the Inventory feature and barcode printing needs the Barcode feature — both are plan/feature-gated and controlled from your subscription, not from this page.
I can't see Variants, Price Tiers, Components, Alt. Units or Modifiers on a new product.
Those five managers only unlock after the product has been saved at least once — save with Create Product first, then they appear underneath.
Bulk import skipped some of my rows.
Open the Preview step before importing — every row with a missing name, invalid price or invalid cost price is flagged in red with the exact reason, and only valid rows are sent to the server.
A variant/tier/UOM row I edited doesn't seem to have saved.
Each manager (Variants, Price Tiers, Alt. Units, Modifiers) has its own independent Save button that only appears once you've made a change — the top-level Create/Update Product button does not save these sub-tables.
Why is the GST/VAT rate field locked on some products?
Businesses configured as a Composition-scheme or Unregistered/exempt dealer under Settings do not charge per-product tax — the field is intentionally disabled and replaced with an explanatory note in that case.

🧑‍💻 Developer Notes

Source component(s):

  • frontend-app/packages/pos-react-lib/src/pages/Products.jsx
  • frontend-app/packages/pos-react-lib/src/pages/products/ProductForm.jsx
  • frontend-app/packages/pos-react-lib/src/pages/products/CategoryManager.jsx
  • frontend-app/packages/pos-react-lib/src/pages/products/VariantManager.jsx
  • frontend-app/packages/pos-react-lib/src/pages/products/PriceTierManager.jsx
  • frontend-app/packages/pos-react-lib/src/pages/products/BulkImportModal.jsx
  • frontend-app/packages/pos-react-lib/src/pages/products/BarcodePrintModal.jsx
  • frontend-app/packages/pos-react-lib/src/pages/products/UOMManager.jsx
  • frontend-app/packages/pos-react-lib/src/pages/products/TaxAssignment.jsx
  • frontend-app/packages/pos-react-lib/src/pages/products/ComponentManager.jsx
  • frontend-app/packages/pos-react-lib/src/pages/products/ModifierGroupManager.jsx

Backend endpoints used:

  • GET /products
  • GET /products/stats
  • GET /products/categories
  • POST /products/categories
  • PUT /products/categories/:id
  • DELETE /products/categories/:id
  • POST /products
  • PUT /products/:id
  • DELETE /products/:id
  • POST /products/bulk
  • POST /products/import
  • GET /products/:id/variants
  • POST /products/:id/variants
  • PUT /products/:id/variants/:variantId
  • DELETE /products/:id/variants/:variantId
  • GET /products/:id/price-tiers
  • PUT /products/:id/price-tiers
  • GET /products/:id/uoms
  • PUT /products/:id/uoms
  • GET /products/:id/components
  • POST /products/:id/components
  • PUT /products/:id/components/:componentId
  • DELETE /products/:id/components/:componentId
  • GET /tax-master/taxes
  • GET /tax-master/products/:id/taxes
  • POST /tax-master/products/:id/taxes
  • DELETE /tax-master/products/:id/taxes/:taxId
  • POST /tax-master/products/:id/calculate-tax
  • GET /settings/units
  • GET /settings/customer-groups
  • GET /online-portal/domain

Related tables (db-core repositories):

  • Product
  • ProductCategory
  • ProductVariant
  • ProductPriceTier
  • ProductUOM
  • ProductComponent
  • ModifierGroup
  • ModifierOption
  • ProductTax
  • TaxMaster
  • Inventory
  • CustomerGroup

Redux slices:

  • auth (role, selectedStoreId)
  • license (planInfo.limits.maxProducts)
  • taxConfig
  • NavPermissionContext (canCreate/canEdit/canDelete/canExport)

Feature flag key: billing

Products.jsx itself has no minimum plan tier, but three of its own buttons are individually feature-gated at render time: Print Labels needs the barcode feature, the Low Stock/Out of Stock stat cards and filter options need inventory, and the discount badge on the price column needs discounts. The five sub-managers (Variants, Price Tiers, Alt. Units, Modifiers, Components) are independent, self-saving widgets embedded in the same form — each calls its own dedicated REST endpoints rather than being part of the product's own PUT payload (Modifiers is the one exception: it saves via PUT /products/:id with a modifierGroups field).