Categories
The hierarchical grouping tree for Products — defines which custom fields, lot/expiration tracking, and reorder defaults apply to every Product and unit within it.
A category is the organizational backbone of your inventory. Every Product belongs to exactly one category, and the category influences three things that flow down to every Product and unit beneath it: custom field default values (child records inherit a category's values when they have none of their own), whether units track a lot number and/or an expiration date, and what the default reorder thresholds are. Getting your category tree right once saves you repetitive configuration on every Product.
Categories are hierarchical, so a category like Power Tools can live inside Tools, which lives inside Equipment. Products inherit settings from their exact category; the tree itself is just for organization and filtering — there is no automatic roll-up of stock across parent categories in the UI, though the category list does count Products and units across all descendants.
Creating and organizing categories #
New categories are created at Inventory → Categories → New Category. The form is intentionally short:
- Name — what this level of the tree is called. Required. The system
automatically computes and stores the full path (e.g. `Tools > Power Tools
Drills`) whenever the name or parent changes, and propagates it to all descendants if you rename or re-parent.
- Parent Category — pick any existing category to nest this one beneath, or leave blank to create a top-level node. You can re-parent a category at any time; the full paths of the category and all of its descendants update automatically.
You can build a tree of any depth. A category with no parent appears at the root. Moving a category by changing its Parent is safe — no Products or units are affected, only the path labels update.
Unit tracking flags #
Each category carries two tracking toggles, grouped under Unit Tracking on the form:
- Track Lot Numbers — when enabled, every unit in this category shows a Lot Number field on its create/edit form. Useful for consumables with manufacturer batch codes (reagents, food ingredients, pharmaceuticals).
- Track Expiration Dates — when enabled, every unit shows an Expiration Date field. The expiration date is recorded on each unit and visible in unit lists and detail views.
Both flags default to off. They apply to the exact category only — a child category does not inherit them automatically, so set them at the leaf level where they are needed, or at a parent level if every Product beneath it needs them.
Lot number and expiration fields only appear on the unit form when the unit's Product belongs to a category with these flags enabled. The form stays clean for the majority of units that don't need them.
Custom fields #
Categories are one of the anchor points for custom fields. Custom field definitions are configured account-wide per resource type (categories, Products, units are each separate). All categories share the same set of category-level field definitions — there is no per-category definition; every category shows the same fields.
What does inherit is the value: when editing a category you'll see the custom field inputs at the bottom of the form. Saving a value there makes it available as an inherited default for child Products and units — they walk up the chain (unit → Product → category → parent category) and use the first non-null value they find. Child records can always override the inherited value with their own.
Reorder defaults #
The Reorder Points tab on a category page lets you set a min and max stock threshold for the category as a whole, optionally scoped to a specific location. A reorder point with no location applies across all locations. Products in the category that don't have their own reorder point configured inherit this category-level threshold, so you can maintain sensible stock floors for a whole product family in one place.
See Reorder Points for the full details on how thresholds feed the reorder suggestion engine.
Subcategories #
Open any category's detail page to find a Subcategories tab that lists all descendant categories (not just direct children — the full subtree is shown), with links to drill into each one.
The category list #
Inventory → Categories shows every category with its computed full path, a count of Products (all descendants included), and a count of Units. Both counts are live links — clicking the Product or unit count jumps to the Product or unit list pre-filtered to that category. The list supports a Location filter and an In Stock only toggle so you can see which categories have live stock without leaving this view.
What lives on the category page #
Open a category to find:
- Overview — name, parent, and tracking flags.
- Subcategories — all descendant categories (full subtree, not just direct children).
- Products — all Products assigned directly to this category.
- Reorder Points — min/max thresholds, optionally per location.
- Change history — a full audit trail of edits to the category itself.
How categories relate to the rest of the app #
Categories touch nearly every other module:
- Products & units — a Product's category determines its custom fields and tracking flags; the Product list and unit list both filter by category.
- Reorder suggestions — the reorder engine reads category-level reorder points when a Product has none of its own.
- Custom fields — field definitions are account-wide per resource type; values set on a category are inherited as defaults by child Products and units. See Custom Fields.
- Purchasing — purchase orders and vendor SKU links can be filtered by category when building a reorder.
Doing it from the API #
# List all categories (ordered by full path, 50 per page)
curl "https://your-domain.com/api/v1/inventory/categories" \
-H "Authorization: Bearer $TOKEN"
# Filter to direct children of a parent category
curl "https://your-domain.com/api/v1/inventory/categories?parent_id=<id>" \
-H "Authorization: Bearer $TOKEN"
# Create a category
curl -X POST "https://your-domain.com/api/v1/inventory/categories" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Power Tools",
"parent_id": "<parent-category-id>",
"tracks_lot_number": false,
"tracks_expiration_date": false
}'
The API returns id, parent_id, name, full_path, tracks_lot_number,
tracks_expiration_date, and timestamps. Use search=<term> to filter by name,
and parent_id=<id> to fetch only immediate children of a given category.