Products & Pricing
Manage product catalogues, SKUs, barcode tracking, price tiers, kits/bundles, and unit costs.
/products /products/:id Products & Pricing
The Products module manages master catalog items, barcode tracking, 4-tier price scales, kit bundle definitions, and standard unit costs.
Product Types & Pricing Tiers
1. Product Types
- Stock Goods (
inventory): Physical stock tracked in warehouse bins with on-hand counts and perpetual ledger valuation. - Non-Stock Goods (
non-stock): Physical goods purchased on demand or drop-shipped directly without bin tracking. - Service (
service): Non-physical labor, consulting, rate cards, or maintenance charges. Service products support defining standard costs (standardCost), list bill rates (listPrice), and assigning multiple team members (Assigned Team Members) to serve as unified rate cards across projects. - Freight (
freight): Transport, shipping, and delivery charges.
2. Units of Measure (UoM) Categorization
Every Unit of Measure in the system belongs strictly to one category:
- Goods UoMs (e.g.
EA,BOX,KG,SET,KIT,PALLET): Associated exclusively with physical goods (Stock Goods, Non-Stock Goods, and Freight). - Service UoMs (e.g.
HR,HOUR,DAY,JOB): Associated exclusively with Service items.
The system enforces strict categorization at both the API and UI layers: Goods items cannot use Service UoMs (e.g., you cannot sell Stock Goods by the Hour), and Service items cannot use Goods UoMs (e.g., you cannot bill a Service in Each or Pallets).
3. The 4 Price Scales
Every product carries up to four predefined price tiers in the company base currency:
- List Price: Standard retail rate.
- Trade Price: Reseller / commercial rate.
- Tier 3 Price: High-volume wholesale rate.
- Tier 4 Price: Contracted partner rate.
4. Kits & Bundles (BOM)
A product can be configured as a Kit:
- Sold under a single SKU at a bundle price.
- Contains child component items with specified quantities per kit.
- When sold, component quantities are allocated and picked from stock, while the customer invoice shows the bundle SKU.
Kit Inventory Tracking: “Built” vs “Kit Components” Views
For tracked kit products (Structure Type = Kit and Product Type = Stock Goods), the Inventory Levels tab provides two dedicated views:
- Built Tab: Shows the quantity of pre-assembled, fully built kits physically residing in warehouse bins, assigned default bins, customer commitments, and pending work orders. Child component inventory and child bins are strictly isolated and do not appear in this view.
- Kit Components Tab: Displays real-time stock levels for each child component in the kit’s Bill of Materials across each warehouse facility. Features the Available to Assemble badge, dynamically calculated by identifying the bottleneck component (
min(Floor(Component Available / Ratio))) to show how many kits can currently be assembled from available parts.
For Non-Stock Kits (Product Type = Non-Stock Goods), stock is fulfilled purely by assembling on demand, and inventory availability is displayed directly via the component breakdown.
Cost Metrics & Valuation Calculations
HeroBM tracks four complementary cost metrics to provide complete visibility into purchasing history, replacement benchmarks, and real-time inventory valuation:
1. Standard Cost (Target / Benchmark)
- Definition: A fixed, manually configured unit cost set by management.
- Usage: Serves as a standard budgeting baseline, target gross margin benchmark, and baseline replacement cost when historical purchasing data is not yet available.
- Editing: Editable directly in the Costs section of the Product Details page.
2. Weighted Average Cost (WAC — Inventory Valuation Basis)
- Definition: The rolling weighted average purchase price of current on-hand stock.
- Calculation: Automatically recalculated upon every stock receipt in the inventory ledger:
New WAC = ((Current QOH * Current WAC) + (Received Qty * Received Unit Cost)) / (Current QOH + Received Qty) - Usage: Powers accurate balance sheet asset valuation (
Total Value = QOH * WAC) and Cost of Goods Sold (COGS) accounting upon sales fulfillment.
3. Preferred Supplier Cost
- Definition: The contracted cost price configured for the product’s primary/preferred vendor in the Suppliers tab.
- Discount Calculation: Reflects the net cost after applying supplier contract discounts:
Net Supplier Cost = Cost Price * (1 - (Discount % / 100)) - Usage: Defaults automatically onto new Purchase Orders generated for this supplier.
4. Last Purchase Order Price
- Definition: The actual unit price recorded on the most recent approved purchase order line.
- Usage: Provides instant operational visibility into recent market price trends and supplier billing fluctuations.
Step-by-Step Workflows
1. Adding a New Product
- Go to Inventory → Products (
/products). - Click New Product.
- Enter the Product Code / SKU, Name, and Product Group.
- Select the Product Type (e.g. Stock Goods) and Base Unit of Measure (e.g. EA, BOX for goods, or HR, DAY for services).
- Enter the Standard Cost and the four selling price levels (List Price, Trade Price, etc.).
- Select the default Purchase Tax Category and Sales Tax Category.
- Click Save Product.
2. Setting Up a Kit / Bundle
- Open the product details page.
- Set Structure Type to Kit.
- In the Bill of Materials / Components tab, click Add Component.
- Search for child products and enter the required quantity per kit.
- Click Save Changes.
Product Image Storage
HeroBM supports uploading primary images for products, which are displayed on the Ops Portal and synced with integrations.
Where images are stored:
- Product images are saved securely on the host server filesystem rather than inside the database itself.
- By default, the API container mounts the
./data/storagedirectory from your HeroBM installation folder. - Manual uploads via the UI are physically stored under
<herobm-root>/data/storage/products/uploads/<product-id>/. - For legacy database imports (such as ABM, Odoo, etc.), image paths are mapped directly to the
products/folder. You should copy the contents of your legacy images folder directly into<herobm-root>/data/storage/products/. - If you are running a custom deployment, the root storage path can be overridden by setting the
STORAGE_PATHenvironment variable in your.envfile.
Uploading Images:
Images should be uploaded via the Ops Portal UI on the Product detail page, or via the POST /products/images/{id} API endpoint. The system automatically handles resizing, safe file naming, and database path linkage.
Field Reference
| Field | Description |
|---|---|
| Product Code / SKU | Unique catalog code. |
| Product Name | Full commercial description. |
| Product Type | Stock Goods (inventory), Non-Stock Goods (non-stock), Service (service), or Freight (freight). |
| Standard Cost | Current unit cost benchmark for GL valuation and budgeting. |
| Weighted Average Cost (WAC) | Rolling inventory valuation unit cost basis calculated from stock receipts. |
| Preferred Supplier Cost | Contracted purchase price from the primary vendor, including discount. |
| Last PO Price | Most recent historical purchase order unit cost. |
| Price Scales (1–4) | 4-tier pricing matrix. |
| Purchase Tax Category | Default tax rate classification for purchasing. |
| Sales Tax Category | Default tax rate classification for sales. |
| Base UOM | Primary stocking unit (e.g. EA, BOX for goods; HR, DAY for services). |
Field Reference & Data Dictionary
Key database fields, input parameters, and definitions associated with this workflow screen:
| Field / Parameter | Display Name | Description & Rules |
|---|---|---|
| product_number | Product Code / SKU | Unique product identifier (e.g. SKU-10492). |
| name | Product Name | Item description displayed across orders, invoices, and pick slips. |
| product_type | Product Type | Classification: Stock Goods (`inventory`), Non-Stock Goods (`non-stock`), Service (`service`), or Freight (`freight`). |
| structure_type | Structure / Kit | Standard product or Kit/Bundle with component decomposition. |
| list_price | List Price (Scale 1) | Standard retail price in base currency (EUR). |
| trade_price | Trade Price (Scale 2) | Commercial wholesale price for trade customer accounts. |
| price_level_3 | Tier 3 Price | Volume distributor price level. |
| price_level_4 | Tier 4 Price | Special contracted / enterprise price level. |
| standard_cost | Standard Unit Cost | Current replacement cost used for inventory valuation and margin reporting. |
| weighted_average_cost | Weighted Average Cost (WAC) | Dynamically calculated rolling unit cost based on receipt transaction history. Used for inventory valuation and COGS. |
| preferred_supplier_cost | Preferred Supplier Cost | Negotiated unit price from the primary preferred vendor, factoring in contracted discount percentages. |
| last_purchase_price | Last PO Price | Unit price paid on the most recent purchase order line item. |
| purchase_tax_category_id | Purchase Tax Category | Default GST/VAT tax category assigned to this item for purchasing. |
| sales_tax_category_id | Sales Tax Category | Default GST/VAT tax category assigned to this item for sales. |