Skip to content
Knowledge ERP Docs

API Reference ↗
Inventory

Products

What a kind of thing *is* — name, SKU, price, cost, unit of measure, usage type, components, vendors, and reorder points — shared by every physical unit of that kind.

Product vs. Unit, in one line: a Product is the thing you stock or sell; a Unit is one tracked item of it. You sell, check out, and count Units; you price, categorise, and reorder Products.

A Product is the definition of a thing you stock — what it is, not any one physical copy of it. "Cordless Drill, 18V" is a Product; the three actual drills on the shelf are Units. The Product holds everything the copies share — name, SKU, price, cost, unit of measure, whether it's consumed or returned — so you define it once and every Unit inherits it.

Naming note: SKU — stock-keeping unit — is an identifier code, not a record type: it's the code you put on a Product, and the supplier's own code on a Vendor SKU link. The record itself is a Product, in the app and in the REST API alike: the endpoint is /api/v1/inventory/products and other resources reference it as product_id — see the API reference.

Creating a Product #

New Products are created from Inventory → Products → New Product. The form is short on purpose — most of the depth comes from the category and from the Units you add later.

  • Name — what the thing is called. Required.
  • Category — places the Product in your category tree (e.g. Tools → Power Tools). The category drives custom fields, lot/ expiration tracking, and reorder defaults, so set it thoughtfully. When you pick a category, the form pre-selects the usage type most common among the Products already in it.
  • Usage typeConsumable or Returnable (see below). Required, and deliberately not pre-answered: only a Returnable Product can be checked out, loaned or rented, so a default would decide that for you on every Product you create and only show up much later, as a product list nothing can be lent from. Once a category holds Products, picking that category prefills the usage type those Products mostly use — that is inferred from your own products, so you can still change it.
  • Unit Size + Unit of Measure — how much one stocked unit holds, e.g. 1 each, 500 ml, 50 ft. Unit Size defaults to 1 and the unit of measure to item if you leave them blank, which is right for anything you simply count. See Units of Measure.
  • Price and Cost — what you sell it for and what it costs you, entered in dollars. These are the defaults every Unit inherits unless a Unit overrides them.
  • Weight — an amount and unit (e.g. 2.5 lb), used for shipping.
  • SKU — the Product's unique code. Type your own (TARP-6X4-BLU) or leave it blank and one is generated with an S prefix. It must be unique within your account, and it is what a scan resolves to. See Barcodes & Labels for printing it on a label.
  • Has Bill of Materials — turn this on for a composite Product assembled from other Products (see Composite Products).
  • BackorderableYes, No, or Use location default — whether the Product can be sold or committed when no stock is on hand.
  • Discontinued — a Product you have stopped carrying. See Discontinued Products.
  • Custom fields — any extra attributes defined on the category appear at the bottom of the form. See Custom Fields.

Importing your products from a spreadsheet #

Inventory → Products → Import CSV brings an existing product list in from a file, which is usually the first thing you do on a new account. Upload the file, check the column mapping the app guesses from your headers, and start the import. Download example CSV file in the same dialog gives you a file with the right headers to work from.

Only Name is required. Everything else is optional, because a real export from another system is always missing something. Money goes in as dollars (24.99, or $1,234.50 — both work) and is stored in cents; a Category is matched by name and created if it is new; Usage type accepts consumable / returnable as well as plain English like equipment.

A file is matched by SKU. A row whose SKU is already on a Product updates that Product; a row with a new or blank SKU adds one. That is deliberate — it means re-importing a corrected file fixes the first import instead of duplicating it.

While it runs #

Large files are processed in the background, so the page comes straight back and tells you how many rows were accepted. The result arrives as a notification in the bell menu when the run finishes — you do not have to stay on the page. It says how many Products were imported, how many rows were not, and offers a download of the failed rows with the reason against each one.

A single import takes up to 20,000 rows. A bigger file is refused whole, with nothing half-written: split it and import the parts one after another. Because rows are matched by SKU, importing the same file in pieces is safe.

What your role lets you import #

Importing is a write, and it needs one of the two Product permissions:

You hold What the import does
Add a new Product only Adds the Products that are new to you. Any row whose SKU matches a Product you already have is refused and reported — that Product is left exactly as it was.
Change a Product only Updates the Products the file matches. Any row that would add a new Product is refused and reported.
Both The whole file.
Neither The button is padlocked and nothing can be imported.

Refused rows are never silent: they are counted separately from the successes, and each one comes back in the failed-rows download with the permission it needed. Setting Price or Cost is a third, separate permission — see Users, Roles & Permissions — and a priced row from someone who does not hold it is refused the same way, rather than imported with the price quietly dropped.

Usage type: Consumable vs. Returnable #

Every Product is one of two kinds, and this choice changes what you can do with its units:

  • Consumable — sold or drawn down and not expected back: parts, materials, retail goods, supplies. Its units are used, sold, or consumed, and their remaining quantity ticks down.
  • Returnable (Equipment) — reusable gear that goes out and comes back: tools, AV kit, instruments, fleet equipment. Only Returnable units can be checked out, loaned, or rented.

You can't check out a Consumable or "use up" a piece of Returnable equipment — the actions available on a unit are gated by its Product's usage type.

Categories and inherited fields #

A Product's category is more than a label. Categories are hierarchical (with a full path like Tools → Power Tools → Drills) and they decide:

  • which custom fields the Product and its units carry,
  • whether units track a lot number and/or an expiration date,
  • default reorder points that apply to every Product in the category.

Custom fields inherit down the chain category → Product → unit, so you can set a value once on the category and override it only where it differs.

Composite Products (bills of materials) #

Turning on Has Bill of Materials makes a Product composite — something you build from other Products. On the Product's page, the Components tab is where you list what goes in. A component can be:

  • a specific Product — only units of that exact Product can be consumed, or
  • a category — any unit from a Product in that category qualifies.

Each component records a Qty per unit and a unit of measure — how much of that material one finished unit takes, in the measure the material is stocked and sold in. A work order multiplies it by the quantity planned, so a line reading 100 lb on an order for ten units needs 1,000 lb. Note that this is a measure, not a count of packs: 1,000 lb of a product stocked in 50 lb bags is twenty bags, and twenty bags is what a work order takes off the shelf. The unit of measure auto-fills from the material Product when you pick it, and it is worth leaving it there unless you mean something else.

Composite Products power both manufacturing work orders and the "build from existing inventory" path when you create units, which consumes the source units automatically. The Used In tab shows the reverse — which other Products list this one as a component.

Vendors and purchasing #

The Vendors tab links a Product to the suppliers you buy it from. Each vendor link can carry the vendor's own SKU number, vendor price, lead time, minimum order quantity, units per pack, and a preferred flag. This is what purchasing and reorder suggestions draw on to put the right quantity on the right purchase order.

Reorder points and stock health #

The Reorder Points tab sets a min and max quantity for the Product, each one for a named location. When on-hand stock drops below the min, the Product shows a red low-stock indicator in the list and becomes a candidate for reorder suggestions. Reorder points can also be defined on a whole category and inherited by its Products.

The Product list #

The Product list (Inventory → Products) shows each Product with its category path, SKU, Units, and total inventory (the summed on-hand quantity in each Product's unit of measure). Filter by category, location, stock status (below/above min), or backorderable, and toggle In stock only to base the counts on available stock rather than everything on the books. Products you have discontinued are hidden unless you clear that filter.

Units counts the units matching the filters on the screen, so with In stock only left on it counts what is on the shelf. A Product can therefore read 0 while units of it exist checked out, on hold or at another Location — the filter chips above the list name whichever narrowing is in force, and clearing them widens the count. A Product's own page spells the same figure out in full.

The Stock column has three answers:

Reads Means
Low (red) the Product's own reorder minimum is breached
OK (green) a minimum applies to this Product, and its own is not breached
nothing no minimum is being read for this Product

Low and OK read the Product's own reorder points. A minimum set on the category is enough to stop the cell being blank — somebody has said a level is wanted — but a category's shortfall is a fact about the category rather than about each Product inside it, so it does not turn those Products' rows red. Set a point on the Product itself if you want that Product's own row to say so.

An empty Stock cell is not a problem to fix — it is not a warning. Set a reorder point on the Product if you want its row watched.

A location filter narrows which minimums are read: while one is on, only minimums naming one of the locations you have selected are consulted. So the column can empty for a Product that does have a minimum elsewhere, and that is the filter talking rather than a gap in your setup. Clear the filter to see the whole picture.

If you have not set a reorder minimum anywhere, the list does not open on this column. An account that watches nothing — a lending library, say — has a Stock cell that could only ever be blank, so Stock starts switched off rather than taking up the width. It is not gone: open the column menu (the toggle at the top right of the list) and switch Stock back on, and it stays on for the rest of your session. Once a minimum is set somewhere in the catalog the column is shown by default again — though if your own column menu already remembers a choice for this list, that remembered choice is what you get, so look there first.

Note that the CSV export takes its columns from whatever the list is showing, so switch Stock on before exporting if you want it in the file.

Price #

The Price column is shown by default to accounts on the Sales module. Without Sales — an account that lends or hires its equipment rather than selling it — it starts switched off, because most such catalogs have no prices in them. It is not gone: open the column menu (the toggle at the top right of the list) and switch Price back on, and it stays on for the rest of your session. Note that the CSV export takes its columns from whatever the list is showing, so switch the column on before exporting if you want prices in the file.

Discontinued Products #

Discontinued marks something you no longer carry. It is a purchasing decision, not a stock event: the Units you hold are untouched, and the Product keeps its history, its reports and its page.

On the Product list #

The Product list hides discontinued Products by default, and says so — you will see Hiding discontinued products in the active filters bar at the top, next to whatever else is narrowing the list. Clear that filter (the × on the chip, or Hide discontinued products in the Filters menu) and they come back. That is also how you find one again to un-discontinue it. The Discontinued column is available from the column toggle if you want to see which is which.

Because Export CSV exports the list as you are looking at it, an export made with the default filter on leaves the discontinued Products out. Clear the filter first if you want every Product in the file.

Where it is no longer offered #

The line it draws is direction, not stock level. A discontinued Product is one you would not bring more of in — so it disappears from the places where choosing it would do exactly that:

  • a purchase order line, from either the create screen or the order itself;
  • an automation rule that raises purchase orders on your behalf;
  • adding a Unit to stock from the Units screen;
  • linking the Product to a vendor from that vendor's own Products tab;
  • a work order that would manufacture more of it, and the routing form that says how it is made;
  • the Reorder Queue — the buyer's worklist — and the reorder suggestions and digest behind it. The queue is the third way to raise a purchase order: its Create Purchase Order button works straight from the selected rows without going through either picker above. The count on the Reorder Queue menu item leaves them out too, so it still matches what you find when you open it.
  • the Product list of the equipment picker on a loan or rental agreement line — but only where the location that agreement is written against has none of the Product free over the agreement's own dates. This is the only place discontinuing takes account of how much you have left, and it is described under Where it is still offered below, because most of the time it does not narrow anything.

Each of those narrows the screen that names it. A Product's own page is not narrowed: its Units, Vendors and Production Operations tabs still book stock in against it, still link a vendor to it, and still add routing steps — you are already on the Product there, so there is no list to shorten. Discontinuing records a decision; it does not lock the Product's own page.

Where it is still offered #

Those screens, and the Product list default above, are the whole of it. Everywhere else carries on exactly as before, because you have stopped buying it — you have not stopped owning it, and you still have to be able to move what is on the shelf. So a discontinued Product is still offered on:

  • quote, sales order, invoice and recurring invoice lines — you can sell the rest of it;
  • rental agreements and rental rates, and loan agreements — it still goes out and still comes back. The equipment picker on an agreement has one narrow exception, and it is the only stock-level check anywhere in this feature: it drops a discontinued Product when the location the agreement names has none of it free over the agreement's dates. Stock on that location's shelf and it is offered exactly as before — you can lend and hire out what you hold. The agreement's own bookings do not count against it, so a second line for something this agreement already holds is still offered. Specific unit and Kit are never narrowed, nor are rental rates, and an agreement with no location or no dates on it is not narrowed at all;
  • price lists — what a customer pays for it;
  • equipment on an appointment — the public booking page, the customer portal and the staff-side list on the appointment itself all see it exactly as before. Those three have always shown only what is in stock and in a bin at the location, which is a rule of their own and applies to Products you carry just the same;
  • stock transfers between your own locations, kits and bills of materials, and the materials a work order draws off the shelf — all of them moving or using up what you already hold;
  • customer returns, vendor returns and vendor bills — a return is precisely when you handle something you have stopped carrying, and a bill for goods ordered before the decision still has to be entered;
  • the list filters that search past orders, work orders and transfers, or you could not look up the history of a Product you have dropped.

Discontinuing takes account of how much you have left in one place, and it is the equipment picker just above. Nowhere else does discontinuing narrow anything on stock: everywhere else discontinuing treats a Product with no stock exactly like one with a pallet of it. And discontinuing never causes a Product you still carry to be dropped — "none free that week" is a scheduling problem you fix by moving the dates, and a row that has vanished from the list cannot be rescheduled.

Screens are free to have stock rules of their own that have nothing to do with discontinuing, and those are unchanged. Choosing equipment for an appointment is one: it has always offered only what is in stock and in a bin at that location — for Products you carry and Products you have dropped alike.

Anything that already names one still names it. A work order or a Unit written before the decision opens as it did, still shows the Product, and still saves — the pickers above keep their own current Product in the list even though it is offered on none of the purchasing screens above. A loan or rental line naming a Product its location has since run out of behaves the same way: it opens reading as that Product, and saving the line leaves it alone.

This shortens lists; it does not refuse anything. Discontinued is a purchasing decision you are recording, not a lock — the surfaces above stop offering the Product, and none of them rejects one that arrives another way. That covers the equipment picker too: reserving a loan or a rental and checking it out are unchanged, and neither of them asks which location a unit is standing at. The REST API and the CSV import are not narrowed either: both will still accept a discontinued Product if you name one. If you need something that cannot be used at all, that is a different question — ask us.

To start carrying it again, turn Discontinued back off on the Product.

What lives on the Product page #

Open a Product to find its definition plus tabs for everything attached to it:

  • Units — every physical unit of this Product and its current status.
  • Components / Used In — its bill of materials, and where it's used.
  • Operations — manufacturing steps, if any.
  • Vendors — suppliers and their pricing.
  • Reorder Points — min/max thresholds by location.
  • Change history — a full audit trail of edits.

Doing it from the API #

# List Products
curl "https://your-domain.com/api/v1/inventory/products" \
  -H "Authorization: Bearer $TOKEN"

# Create a Product
curl -X POST "https://your-domain.com/api/v1/inventory/products" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name": "Cordless Drill, 18V", "price": 19900, "usage_type": "checkout"}'

Prices and costs are sent and returned in cents over the API (19900 = $199.00), even though the UI shows dollars. The usage_type field accepts "use" (Consumable) or "checkout" (Returnable equipment) and is also returned on every Product response.