Configure and manage Field Service Lightning inventory: ProductItem (stock at locations), ProductTransfer (stock movement), ProductConsumed (parts used on work orders), ProductRequest/ProductRequestLineItem (replenishment ordering), and ProductItemTransaction (audit trail). NOT for CPQ product catalog management, OCI (Omnichannel Inventory), or B2B Commerce warehouse integration.
This skill activates when a practitioner needs to configure or troubleshoot the Field Service Lightning inventory object model — covering stock locations, stock movement, parts consumption on work orders, replenishment ordering, and the auto-generated audit trail. It does NOT cover CPQ product catalog configuration, OCI (Omnichannel Inventory) for B2B Commerce, or ERP warehouse integration patterns.
Gather this context before working on anything in this domain:
The FSL inventory data model has six primary objects. Each has a distinct role and must not be confused with the others.
ProductItem — represents a quantity of a specific Product2 stored at a specific Location. QuantityOnHand is the live count. This is the master stock record. Do not manually update QuantityOnHand — it is maintained by the platform as ProductTransfer and ProductConsumed records are created and updated.
ProductTransfer — records the movement of stock from one Location to another (e.g., warehouse → technician van). QuantityOnHand on the source ProductItem does NOT decrease when the transfer is created. It decreases only when the transfer status is set to Received. This is the single most common source of incorrect inventory counts.
ProductRequest / ProductRequestLineItem — ProductRequest is the replenishment order header (equivalent to a purchase order request). ProductRequestLineItem is the individual line specifying which Product2, what quantity, and which destination Location. These drive the ordering workflow but do not themselves move stock — a ProductTransfer must be created when the order is fulfilled.
ProductConsumed — records which products and quantities were used on a specific Work Order. Creating a ProductConsumed record decrements QuantityOnHand on the linked ProductItem. This is the field service equivalent of "booking out" parts to a job.
ProductItemTransaction — an auto-generated, read-only audit record created by the platform every time QuantityOnHand on a ProductItem changes (via ProductTransfer Received or ProductConsumed). Manual DML against this object is not supported and corrupts the inventory ledger. It cannot be disabled.
ReturnOrder / ReturnOrderLineItem — records stock returned from a technician or customer back to a Location. Creating a ReturnOrderLineItem increments QuantityOnHand on the target ProductItem.
Every ProductItem is linked to a Location record. The Location record type controls what technicians can see:
IsMobile = true (the "Mobile Location" checkbox) to appear in the FSL mobile app inventory view. Without this flag, technicians cannot see or consume parts from that location on the mobile app, even if ProductItem records exist for it.There is no limit enforced on how many ProductItem records a Location can have, but large product catalogs at a location should be filtered using the FSL mobile app's search rather than pre-loading everything.
QuantityOnHand on ProductItem is a system-managed field. The platform updates it automatically when:
Direct field updates to QuantityOnHand via Apex DML, Data Loader, or Flow are not supported. Attempting it either fails validation or produces a divergence between the ledger (ProductItemTransaction records) and the displayed count.
Salesforce Field Service has no native cycle-count or physical inventory reconciliation user interface. Organizations that require periodic stock counts must build a custom solution — typically a screen Flow, a custom LWC, or an external app — that compares a technician's submitted count against the current QuantityOnHand on each ProductItem, then creates an adjusting ProductTransfer (with a special-purpose "adjustment" location as source or destination) to reconcile the difference.
When to use: A field technician's van is running low on a part and needs stock transferred from a warehouse.
How it works:
DestinationLocationId set to the technician's van Location and ShipToStreet/City populated if needed for shipping logistics.Product2Id, QuantityRequested, and SourceLocationId (the warehouse).SourceLocationId = warehouse and DestinationLocationId = van, Quantity = fulfilled amount.QuantityOnHand decrements on the warehouse ProductItem and increments on the van ProductItem.Why not the alternative: Directly editing QuantityOnHand bypasses the ProductItemTransaction audit trail, violates referential integrity in the inventory ledger, and is unsupported by Salesforce.
When to use: A technician uses a physical part to complete a work order and the inventory must be decremented.
How it works:
WorkOrderId (or WorkOrderLineItemId for WOLI-level tracking), Product2Id, QuantityConsumed, and SourceLocationId (the technician's van ProductItem location).QuantityOnHand by QuantityConsumed.Why not the alternative: Manually creating a ProductTransfer from van to a dummy "consumed" location is an anti-pattern — it generates incorrect transfer records, adds noise to the audit trail, and does not associate the consumption with the Work Order for job cost reporting.
When to use: Organization requires periodic physical inventory counts and needs to reconcile against system QuantityOnHand.
How it works:
QuantityOnHand alongside a text input for the technician's physical count.QuantityOnHand, calculate the delta.| Situation | Recommended Approach | Reason |
|---|---|---|
| Technician cannot see van stock in FSL mobile | Check Location record — enable Mobile Location (IsMobile = true) | Mobile app only shows IsMobile locations |
| QuantityOnHand is incorrect | Inspect ProductItemTransaction audit trail; trace which transfer or consumed record caused divergence | Do not directly edit QuantityOnHand |
| Moving stock from warehouse to van | ProductRequest + ProductRequestLineItem + ProductTransfer (Received) | Maintains full audit trail; triggers correct QuantityOnHand updates |
| Parts used on a job | ProductConsumed linked to WorkOrder + source ProductItem | Decrements stock and associates consumption to job for cost reporting |
| Stock returned from technician | ReturnOrder + ReturnOrderLineItem with destination Location | Increments QuantityOnHand on target ProductItem; maintains ledger |
| Periodic physical inventory reconciliation | Custom Screen Flow or LWC + adjusting ProductTransfer | No native cycle-count UI; ProductTransfer is the only supported adjustment mechanism |
| Investigate who consumed stock and when | Query ProductItemTransaction for the ProductItem | Auto-generated, tamper-evident audit trail |
Step-by-step instructions for configuring FSL inventory management:
IsMobile = true on every van/truck location so technicians can see their own stock in the FSL mobile app.QuantityOnHand using a ProductTransfer from an "opening balance" source location (not via direct field edit). Confirm a ProductItemTransaction record was auto-created.Run through these before marking work in this area complete:
IsMobile = true (Mobile Location checkbox enabled)Non-obvious platform behaviors that cause real production problems:
IsMobile = true does not appear in the FSL mobile app inventory experience. Technicians with van stock at a standard location cannot see or consume parts from the mobile app. This setting must be set at Location creation or retroactively updated.SourceProductItemId (or the combo of Product2 + Location that resolves to a ProductItem). If no ProductItem exists for the technician's current van location and the consumed product, the record creation fails. Practitioners who skip creating ProductItems for van locations encounter this failure when technicians try to log parts usage.| Artifact | Description |
|---|---|
| Location records | One per stocking point; vans flagged with IsMobile = true |
| ProductItem records | One per Product2/Location combination representing on-hand stock |
| ProductTransfer records | Movement records for stock between locations; triggers QuantityOnHand on Received |
| ProductRequest / ProductRequestLineItem | Replenishment order header and line items |
| ProductConsumed records | Parts usage linked to Work Orders for cost tracking |
| ProductItemTransaction records | Auto-generated audit trail (read-only; never hand-edited) |
| Cycle-count Flow or LWC | Custom solution for physical inventory reconciliation |
| Configuration checklist | Completed template confirming all FSL inventory objects are wired correctly |
fsl-work-order-management — for configuring the Work Order and Work Order Line Item objects that ProductConsumed records are linked tofsl-mobile-app-setup — for configuring how technicians access inventory and log parts from the FSL mobile appfsl-resource-management — for managing Location records in the context of service territories and technician assignments