Inventory Management Guide
This guide walks through the Kanoa inventory system from initial setup through day-to-day operations. The inventory module is accessible from the left navigation under Inventory.
Overview
The inventory system tracks physical parts across one or more storeroom locations. It records every stock movement as a transaction, maintains live on-hand balances, enforces stocking policies (min/max/reorder), and connects part consumption directly to maintenance work orders.
The two main screens are:
- Inventory → Configuration — reference data setup (cost centers, manufacturers, suppliers, UOM)
- Inventory → Parts — the parts catalog and all stock operations
Step 1 Configuration
Before adding parts, set up the reference data your catalog depends on. Navigate to Inventory → Configuration. The tabs across the top cover each reference type.
Cost Centers
Cost centers classify the financial charge for a stock movement. For example, a Maintenance cost center can be assigned when issuing parts to a work order.
To add a cost center click +, enter a Code and Cost Center name, then save.
Manufacturers
Manufacturers are linked to parts and models. Enter the manufacturer name, a short code, and optionally a website URL.
Suppliers
Suppliers are referenced when receiving stock. Enter the supplier name, account number, contact details, and website.
UOM (Units of Measure)
Every part requires a default unit of measure. Common examples: EA (each), FT (feet), KG (kilograms). Enter a short Code and a display Name.
Asset Parts List
Links parts to specific assets as part of the asset's bill of materials. See Bill of Materials below.
Step 2 Building the Parts Catalog
Navigate to Inventory → Parts. The parts list shows all parts with their category, part number, description, manufacturer, on-hand quantity, and classification flags.
Adding a Part
Click Add (or the + button in the toolbar) to open the Part Editor.
| Field | Description |
|---|---|
| Part # | Your internal part number |
| Manufacturer Part # | OEM part number for cross-referencing |
| Category | Hierarchical category (e.g. Bearings, Seals\O-Rings) |
| Description | Free-text description |
| Manufacturer | Select from the manufacturer list |
| Default UOM | The unit this part is measured in |
| Enabled | Uncheck to retire a part without deleting it |
| Is Critical | Flags the part as a critical spare — used for reporting and prioritization |
| Is Repairable | Indicates the part can be returned for repair rather than disposal |
| Is Serialized | Indicates individual units are tracked by serial number |
| Is Consumable | Flags the part as a consumable (e.g. lubricants, fasteners) |
Click Save to create the part.
Browsing Parts
The parts list is filterable and sortable. Expand any row using the ▶ arrow to see the part's inventory across all storeroom locations and its full transaction history.
Step 3 Setting Up Storeroom Locations
A storeroom in Kanoa is modelled as an inventory asset — a node in your asset hierarchy designated as a storage location. Within that location you can define bins (physical sub-locations such as shelves or drawers) for finer-grained tracking.
Locations and bins are managed via the UI or API:
# Create a storeroom location
locationId, msg = system.kanoa.inventory.addInventoryLocation({
'assetId': 45,
'locationName': 'Parts Room',
'locationCode': 'PR',
'locationType': 'Storeroom',
'isActive': True,
}, userId)
# Add a bin within that location
binId, err = system.kanoa.inventory.addInventoryBin({
'inventoryLocationId': 46,
'binCode': 'A3',
'binDescription': 'Shelf A, Row 3',
'isActive': True,
}, userId)
Step 4 Stocking Policies
A stocking policy defines how a specific part should be managed at a specific inventory location. Policies drive reorder alerts and cycle count scheduling.
Setting a Policy
Expand a part row in the Parts screen, then click the Set Policy button (shield icon) next to an inventory location to open the Part Policy Editor.
| Field | Description |
|---|---|
| Inventory Asset | The storeroom this policy applies to |
| Min Qty | Minimum acceptable on-hand level |
| Max Qty | Maximum stock level (used to cap reorder qty) |
| Reorder Point Qty | When on-hand drops to or below this level, a reorder is triggered |
| Reorder Qty | Quantity to order when reorder point is reached |
| Safety Stock | Buffer below the reorder point — alerts before stock hits zero |
| Cycle Count | How frequently (in days) this part should be physically counted |
| Is Stocked | Whether this part is actively managed at this location |
Click Save to apply the policy.
Set Reorder Point higher than Safety Stock. The reorder point triggers a replenishment order; safety stock is a last-resort buffer that signals an urgent shortage.
Step 5 Receiving Stock
When parts arrive from a supplier, record a receipt transaction to increase on-hand stock.
Via the UI
- In Inventory → Parts, expand the part row.
- Click Add Part Transaction (the + icon in the Parts Inventory toolbar).
- The Part Inventory Editor opens.
| Field | Description |
|---|---|
| Inventory Location | The storeroom location receiving the stock |
| Qty | Quantity received (must be > 0) |
| Transaction Type | Select Receipt to inventory |
| Lot / Batch | Optional lot or batch number |
| Notes | Optional reference notes (e.g. PO number) |
Click Save. The on-hand balance updates immediately and the transaction is recorded in the history.
Via Script
inventoryTransactionId, err = system.kanoa.inventory.addInventoryTransaction({
'inventoryAssetId': warehouseAssetId,
'partId': partId,
'quantity': 100,
'inventoryTransactionTypeId': receiptTypeId,
'supplierId': supplierId,
'referenceType': 'PO',
'referenceNumber': 'PO-2026-0441',
'unitCost': 3.75,
}, userId)
Step 6 Issuing Parts
Ad-hoc Issue
To issue parts without a work order (e.g. a one-off repair or adjustment):
- Expand the part in Inventory → Parts.
- Click Add Part Transaction.
- Set Transaction Type to
Issue(or the appropriate type for your operation). - Enter quantity, location, and optional notes.
- Click Save.
Issue Against a Maintenance Work Order
Parts consumed during a maintenance activity can be tracked directly against the work order event. This provides full traceability between stock consumption and maintenance history.
inventoryTransactionId, err = system.kanoa.inventory.issuePartToWorkOrderEvent({
'partId': partId,
'quantity': 2,
'workOrderEventId': workOrderEventId,
'inventoryAssetId': warehouseAssetId,
'assetId': maintainedAssetId,
'usedBy': technicianUserId,
'unitCost': 3.75,
}, userId)
To retrieve all parts consumed against a set of work order events:
data = system.kanoa.inventory.getPartsUsedByWorkOrderEvents({
'workOrderEventId': workOrderEventId,
})
Step 7 Transfers and Adjustments
Transfers
A transfer moves stock from one inventory location to another. Use Transfer in and Transfer out transaction types to record the movement at each end.
Adjustments
If a physical count reveals a discrepancy, use a Positive adjustment or Negative adjustment transaction type to correct the on-hand balance. The transaction history records who made the adjustment and when.
Both operations use Add Part Transaction in the UI or addInventoryTransaction via script with the appropriate transaction type.
Stock Visibility
The expanded part row in Inventory → Parts shows the live stock position at each location:
| Column | Description |
|---|---|
| On Hand | Current physical quantity in the storeroom |
| Reserved | Quantity allocated to open work orders but not yet physically removed |
| On Order | Quantity on open purchase orders not yet received |
| Available | On Hand minus Reserved |
| Min / Max | Policy bounds for this location |
| Reorder Point | Policy reorder trigger |
| Reorder Qty | Policy reorder quantity |
| Safety Stock | Policy safety buffer |
| UOM | Unit of measure |
| Cycle Count | Days between physical counts |
| Managed Stock | Whether a stocking policy is active |
Finding Parts Below Reorder Threshold
data = system.kanoa.inventory.getPartInventoryStock({
'inventoryAssetId': warehouseAssetId,
'isStocked': True,
'isBelowReorderThreshold': True,
})
Bill of Materials
A BOM defines which parts are associated with an asset, making it easy to look up what spares are needed for a given piece of equipment.
Model BOM vs Asset BOM
| Model BOM | Asset BOM | |
|---|---|---|
| Scope | All assets of a given model | A specific asset instance |
| Use case | Standard parts list for an equipment type | Overrides or additions for a particular machine |
| Function | addModelBomItem | addAssetBomItem |
Adding a BOM Item
# Add a part to an asset's BOM
assetBomId, err = system.kanoa.inventory.addAssetBomItem({
'assetId': assetId,
'partId': partId,
'quantity': 2,
'uomId': uomId,
'positionCode': 'P1-A',
'positionName': 'Drive Shaft Bearing',
}, userId)
Retrieving a BOM
# Full flattened BOM for an asset
bom = system.kanoa.inventory.getAssetBom({'assetId': assetId})
# Full flattened BOM for a model
bom = system.kanoa.inventory.getModelBom(modelId)
Transaction History
Every stock movement is stored as a transaction. The transaction list visible in the expanded part row shows:
| Column | Description |
|---|---|
| Id | Transaction ID |
| Type | Transaction type (Receipt, Issue, Transfer, Adjustment, etc.) |
| From/To Asset | Asset associated with the movement |
| Qty | Quantity moved |
| Cost Center | Financial charge code |
| Transaction Date | When the movement occurred |
| Ref # | Purchase order, work order, or other reference |
| Last Updated By | User who recorded the transaction |
Transaction history is immutable — corrections are made via adjustment transactions, not by editing existing records.