Skip to main content

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.

FieldDescription
Part #Your internal part number
Manufacturer Part #OEM part number for cross-referencing
CategoryHierarchical category (e.g. Bearings, Seals\O-Rings)
DescriptionFree-text description
ManufacturerSelect from the manufacturer list
Default UOMThe unit this part is measured in
EnabledUncheck to retire a part without deleting it
Is CriticalFlags the part as a critical spare — used for reporting and prioritization
Is RepairableIndicates the part can be returned for repair rather than disposal
Is SerializedIndicates individual units are tracked by serial number
Is ConsumableFlags 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.

FieldDescription
Inventory AssetThe storeroom this policy applies to
Min QtyMinimum acceptable on-hand level
Max QtyMaximum stock level (used to cap reorder qty)
Reorder Point QtyWhen on-hand drops to or below this level, a reorder is triggered
Reorder QtyQuantity to order when reorder point is reached
Safety StockBuffer below the reorder point — alerts before stock hits zero
Cycle CountHow frequently (in days) this part should be physically counted
Is StockedWhether this part is actively managed at this location

Click Save to apply the policy.

tip

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

  1. In Inventory → Parts, expand the part row.
  2. Click Add Part Transaction (the + icon in the Parts Inventory toolbar).
  3. The Part Inventory Editor opens.
FieldDescription
Inventory LocationThe storeroom location receiving the stock
QtyQuantity received (must be > 0)
Transaction TypeSelect Receipt to inventory
Lot / BatchOptional lot or batch number
NotesOptional 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):

  1. Expand the part in Inventory → Parts.
  2. Click Add Part Transaction.
  3. Set Transaction Type to Issue (or the appropriate type for your operation).
  4. Enter quantity, location, and optional notes.
  5. 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:

ColumnDescription
On HandCurrent physical quantity in the storeroom
ReservedQuantity allocated to open work orders but not yet physically removed
On OrderQuantity on open purchase orders not yet received
AvailableOn Hand minus Reserved
Min / MaxPolicy bounds for this location
Reorder PointPolicy reorder trigger
Reorder QtyPolicy reorder quantity
Safety StockPolicy safety buffer
UOMUnit of measure
Cycle CountDays between physical counts
Managed StockWhether 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 BOMAsset BOM
ScopeAll assets of a given modelA specific asset instance
Use caseStandard parts list for an equipment typeOverrides or additions for a particular machine
FunctionaddModelBomItemaddAssetBomItem

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:

ColumnDescription
IdTransaction ID
TypeTransaction type (Receipt, Issue, Transfer, Adjustment, etc.)
From/To AssetAsset associated with the movement
QtyQuantity moved
Cost CenterFinancial charge code
Transaction DateWhen the movement occurred
Ref #Purchase order, work order, or other reference
Last Updated ByUser who recorded the transaction

Transaction history is immutable — corrections are made via adjustment transactions, not by editing existing records.