Inventory valuation reports have a bottleneck that's specific to how Acumatica actually tracks cost: under FIFO or specific-lot costing, an item's value isn't one number, it's the sum of however many open cost layers exist for it (INTran cost layer records for each receipt not yet fully consumed). An item with a thousand small receipts over a decade of history and slow-moving stock can carry a genuinely long layer chain, and a valuation report that walks layers per item, per warehouse, at render time is going to feel that.
The real cost driver is layer count, not item count or transaction volume
People tune inventory valuation reports by looking at total transaction volume and conclude the report needs a faster index on INTran. The actual driver is how many unconsumed cost layers each item is carrying at valuation time. Under average costing this is a non-issue — value is item quantity times a single rolling average cost, one row per item per warehouse, cheap to sum. Under FIFO or lot/serial-specific costing, a slow-moving item can accumulate dozens of open layers, each with its own remaining quantity and unit cost, and the report has to sum across all of them. Before tuning anything, find out which costing method the report's slowest items actually use — the fix is completely different depending on the answer.
Base: INTran (cost layer detail) WHERE QtyOnHand <> 0 -- exclude fully consumed layers
Group: by InventoryID, SiteID
Sum: Value = SUM(QtyOnHand * UnitCost)
That QtyOnHand <> 0 filter is the single highest-leverage change on any FIFO valuation report — without it, the schema fetches every receipt line the item ever had, fully consumed or not, and sums a value that should be zero for the consumed ones instead of never fetching them.
As-of-date valuation needs the snapshot tables, not a live recompute
Acumatica maintains inventory valuation snapshots specifically because computing "what was inventory worth on the last day of the prior fiscal year" from live cost layers, walking backward through every receipt and issue since, is expensive and gets more expensive the further back you go. If a report needs valuation as of a historical date, point it at the snapshot mechanism (run via the Inventory Valuation Snapshot process, INxxxxxx screens) rather than reconstructing history from transaction detail in the report schema. Building your own historical reconstruction in a report is redoing work Acumatica already has a purpose-built process for.
If the instance allows negative inventory (oversells before a receipt posts) even temporarily, a naive sum-the-open-layers valuation can produce a wrong or negative value for that item until the receipt catches up and the system reconciles the layers. If negative inventory is allowed anywhere in the instance, the report needs to either exclude negative-on-hand items with a flagged caveat or explicitly document that those rows are estimates, rather than silently including a nonsensical negative valuation in the grand total.
Wrapping up
Diagnose by costing method before touching anything — average cost valuation is cheap by nature, FIFO/lot-specific valuation cost scales with open layer count, which is the number to actually look at. Filter to non-zero remaining quantity in the schema, use the built-in valuation snapshot for any as-of-date requirement instead of reconstructing history yourself, and handle negative on-hand items as a deliberate exception rather than letting them silently distort the total.
Independent software engineer in Nairobi specialising in Acumatica customisations, Laravel backends, and tax fiscalisation integrations across East and Southern Africa.