Skip to main content
Card class: HeroCategory: Ecommerce Platform
Inventory value bucketed by days-on-hand. Aged stock is cash trapped on the floor.

At a glance

Inventory value bucketed by days-on-hand: 0-30, 31-60, 61-90, 91-180, 180+. Aged stock is cash trapped on the warehouse floor, surfaced per-bucket with full Sage Intacct dimension carry-through (Department, Location, Project, Item, Class, Customer, Vendor) so the Controller can pivot the same buckets by team, business unit, or warehouse without re-querying.
What it countsInventoryItem.QuantityOnHand × InventoryItem.UnitCost bucketed by Today minus InventoryItem.LastReceiptDate (or LastActivityDate per workspace setting). The 180+ bucket is the dead-stock candidate pool. Sage Intacct’s Inventory Control module exposes per-item movement through the INVDOC_HDR and INVDOC_LINE tables; the card pivots the same data into aging bands.
Tax treatmentn/a, cost basis.
ShippingInbound landed cost included if Inventory Items use the Inventory Control landed-cost allocation feature (freight, duty, broker fees rolled into unit cost).
In-transitExcluded from aging buckets. Goods in Transit have no Warehouse on-hand date yet, so they cannot be aged. They appear in the Total Inventory Value card but not here.
CurrencyMulti-Entity Console: each entity’s inventory aged in its base currency, summed in reporting currency at the configured FX cadence per entity (Currency Configuration). Single-entity: native currency.
Entity scopeCard respects the dashboard entity filter. Default rolls across every entity the Sender ID + User ID API user can read.
Bucket boundariesDefault 0-30, 31-60, 61-90, 91-180, 180+. Configurable via field map; some Controllers use 30 / 60 / 90 / 120 / 180+ for finer long-tail granularity, others use 0-90, 91-180, 181-365, 366+ for slower-cycle B2B distribution.
Dimensional cutEach bucket carries Intacct dimensions through. Click any chip in the Nerve Centre to drill: 91-180 bucket by Location surfaces which Warehouse holds the slow stock; 180+ bucket by Class surfaces which brand or business unit owns the dead cohort.
Time windowRT
Alert trigger>15% in 180+ bucket, sentiment inv_aging. Tunable per workspace; volatile categories use 20%, stable distribution uses 10%.
Rolesowner, finance, operations

Calculation

Calculated automatically from your Sage data. See the At a glance summary above for what the metric tracks and the worked example below for a typical reading.

Worked example

A US B2B distributor on Sage Intacct Multi-Entity Console with two regional entities (East Coast Distribution Inc, USD; West Coast Distribution Inc, USD). Annual revenue ~$60M, mostly Net-30 wholesale through BigCommerce B2B and Adobe Commerce. Snapshot 14 Apr 26. Reporting currency USD. Costing method Average across both entities. The Department dimension splits Sales Operations from Field Sales; the Location dimension maps to four Warehouses.
BucketInventory value (USD)% of total
0-30 days$9,420,00032%
31-60 days$7,840,00027%
61-90 days$4,680,00016%
91-180 days$4,020,00014%
180+ days$3,210,00011%
Total Aged Inventory$29,170,000100%
Five things to notice:
  1. 11% in the 180+ bucket is below the 15% alert threshold but above the 8% watchlist line, so the Controller is on alert without the Nerve Centre firing. 3.21Mofstockthathasnotmovedinsixmonthsona3.21M of stock that has not moved in six months on a 60M revenue distributor is roughly two months of revenue trapped on the warehouse floor; carrying cost at 24% annualised is $770K of silent expense per year. The threshold sits at 15% because below that level the cohort is usually structurally explainable on a B2B distribution account: customer-allocated stock waiting on Net-30 PO acknowledgements, slow-replenishment SKUs that turn quarterly rather than monthly, off-season carry-over for a customer who orders annually in bulk. At 18% it becomes “act”; at 22% the auditor flags it for impairment review at year-end. The card surfaces this so the Controller is not surprised. Pair the cut with the Class dimension to see whether one brand or business unit is dragging the bucket.
  2. **30% combined in 91+ days is the strategic concern: 7.23Mofcashtrappedinslowmovingstock.B2Bdistributiontypicallyrunshigher91+ratiosthanDTCapparelbecausesupplyleadtimesarelongerandcustomerreordercyclesareslower;evenso,307.23M of cash trapped in slow-moving stock.** B2B distribution typically runs higher 91+ ratios than DTC apparel because supply lead times are longer and customer reorder cycles are slower; even so, 30% is at the edge of healthy. Carrying cost on 7.23M at 24% is $1.74M annualised, the silent expense most CFOs underestimate. The decision tree for each cohort cluster: liquidate now at recovery cents on the dollar, hold to next contract cycle for full margin (carrying cost lost), or formal write-down with auditor sign-off. Click the 91-180 bucket and pivot by the Location dimension to see which Warehouse holds the slow cohort; on this account the West Coast Ontario warehouse holds 60% of the 91-180 dollars, a 2025 build that nobody has unwound.
  3. 59% in 0-60 days is the active flowing stock. This is the slice that reads as “healthy turnover” on the Inventory Turnover Ratio card. A B2B distribution business with 60% of inventory flowing inside 60 days is at the better end of the industry distribution; for slower-cycle industrial distribution 50% in 0-60 is fine. If this share drops below 45%, look at upstream demand forecasting and supplier lead times; somebody is ordering ahead of demand and the buying calendar needs a hard review. The card supports a per-Department cut, so the East Coast Sales Operations team can see their 0-60 share separately from the West Coast Field Sales team’s 0-60 share. On this account East Coast runs 65% in 0-60, West Coast runs 52%, the cut tells the Operations Manager exactly which team’s buying cadence is loose.
  4. **180+ at 3.21Misthedeadstockcandidatepool,andthisiswherethecrosschannelkillerviewlightsup.Pairthiscardwith[DeadStockValue](/nervecentre/kpicards/sage/deadstockvalue)and[DeadStockwithActiveAdSpend](/nervecentre/kpicards/sage/deadstockwithactiveadspend).Onthisaccountthecrossconnectorjoinsurfaced22SKUsinthe180+bucketthatstillhadactiveGoogleAdscampaignsrunningthroughtheAdobeCommercewholesaleportalscatalogue,with3.21M is the dead-stock candidate pool, and this is where the cross-channel killer view lights up.** Pair this card with [Dead Stock Value](/nerve-centre/kpi-cards/sage/dead-stock-value) and [Dead Stock with Active Ad Spend](/nerve-centre/kpi-cards/sage/dead-stock-with-active-ad-spend). On this account the cross-connector join surfaced 22 SKUs in the 180+ bucket that still had active Google Ads campaigns running through the Adobe Commerce wholesale portal's catalogue, with 4,800 of ad spend in the last 30 days against products with literally zero sell-through. That is pure waste; the Controller cannot see this without joining Intacct inventory data to ad-platform spend data. The card is the trigger; the cross-connector card is the kill-shot. Annualised at the current rate, the merchant is bleeding roughly $58K per year of paid-traffic budget on dead inventory.
  5. The bar chart pattern matters more than any single bucket, and Intacct’s dimensional model lets the pattern be cut by entity, Department, or Location simultaneously. Steady declining slope across buckets (each bucket smaller than the previous) is the healthy fast-moving shape. Bulge in the middle (31-90 buckets larger than 0-30) signals ordering ahead of demand or seasonal pre-buy. Flat across all buckets is systemic over-stocking. Inverted (180+ bigger than 0-30) is collapsed business. On this account consolidated shows gentle decline with a slight 91-180 bulge, but per-entity reveals a clean East Coast pattern and a flat West Coast pattern with a 91-180 bulge of $2.4M; the consolidated mean hides the per-entity story. This is the classic argument for Intacct’s per-dimension cuts: consolidated mean hides operational truth. A typical Implementation Partner conversation focuses on which Warehouse or Department is dragging the bucket, and that conversation is one click away on this card.

Sibling cards merchants should reference together

CardWhy pair it with Inventory Aging
Total Inventory ValueThe total. Aging decomposes the headline by age.
Dead Stock ValueThe hard-cut bad slice: items in 180+ with zero sales.
Inventory Carrying CostThe annualised expense impact of the aging tail.
Inventory Turnover RatioInverse signal. Healthy turnover and healthy aging move together.
Top SKUs by Inventory ValueConcentration. Which SKUs own the dead bucket.
Dead Stock with Active Ad SpendCross-channel kill-shot signal on the 180+ cohort.
Margin Erosion AlertsAged stock often gets discounted, eroding margin.
OOS with Open Order DemandThe mirror leak: this card is over-stocked, that card is under-stocked with demand.

Reconciling against the vendor’s own dashboard

Where to look in Sage Intacct: The native Sage Intacct views to run side by side with this card:
Reports → Inventory Control → Inventory Aging Report (the canonical aging report at intacct.com) Reports → Inventory Control → Inventory Valuation Summary (the same total without the bucket cut) Reports → Inventory Control → Item Stock Status (real-time on-hand by Warehouse / Location) Reports → Inventory Control → Slow-Moving Items Report (a stricter cut on items with no recent activity) Interactive Custom Report (ICR) built on the Inventory data source filtered to QuantityOnHand > 0, grouped by Today minus LastReceiptDate aged into 0-30, 31-60, 61-90, 91-180, 180+ buckets, summed on QuantityOnHand × UnitCost, pivoted by Location and Department dimensions Standard Dashboard “Inventory Health” widget (if the Implementation Partner has built it; not native, usually a Partner-supplied custom dashboard)
The Inventory Aging Report should match this card to within rounding when you select the same entity scope and snapshot date. For Multi-Entity Console accounts run Reports → Financial → Consolidated Balance Sheet → Inventory at the Top Level entity, otherwise the FX revaluation cadence shifts the dollar value of remote-entity inventory between report runs. Common reconciliation pitfalls:
  • Sage Intacct’s Inventory Aging Report uses calendar-day buckets; the field map can flip to a custom band set per merchant. Some Controllers prefer 30 / 60 / 90 / 120 / 180+ for finer long-tail; the card defaults to 0-30, 31-60, 61-90, 91-180, 180+ for the standard five-band view. Bucket names are cosmetic; the dollar total in the long tail matches.
  • In-transit inventory is excluded from this card by default (no Warehouse on-hand date yet) but appears on the Inventory Valuation Summary if the merchant uses the Goods in Transit feature. Expect Inventory Valuation to read 3 to 8% higher than this card if the business has significant ocean freight in flight.
  • Multi-Location aging: a single Inventory Item can split across multiple Warehouses, each with its own LastReceiptDate at the location level. The card uses the location-specific receipt date so an item with stale stock in one Warehouse and fresh stock in another shows in two buckets simultaneously. Confirm the field map’s behaviour matches the Implementation Partner’s expectation before reconciling at the Item level.
  • Lot-numbered and serial-numbered items age per lot or per serial when the costing method is FIFO or LIFO. The card respects the costing method; reconciling against an Item-level saved ICR will not match a lot-level view. The Inventory Aging Report at intacct.com offers both views; pick the same level when comparing.
Why our number may legitimately differ from a Sage Intacct Inventory Aging Report:
ReasonDirectionWhy
Bucket boundariesEitherDefault card buckets are 0-30, 31-60, 61-90, 91-180, 180+. Intacct’s standard report defaults are similar but configurable; Implementation Partners often customise the bands during setup. The 91-180 split is the diagnostic difference; the long-tail dollar total matches.
Last-receipt vs last-activity dateEitherSome accounts age from LastSaleDate (item is “aging” from the moment of last sale), others from LastReceiptDate (aging from receipt), others from LastActivityDate (received OR sold, whichever is more recent). Card defaults to last-receipt; field map can flip. The conservative read for write-down purposes is last-activity.
In-transit inclusionCard lowerGoods in Transit appear on Inventory Valuation but have no on-hand date for aging. Card excludes; Valuation includes.
Customer-allocated and consigned-out stockEitherStock physically at a customer site under consignment may sit on the Balance Sheet in some setups but not others. Card uses what Intacct tracks as On Hand at any Warehouse; consigned-out stock typically lives on a separate Location.
Manufacturing WIPEitherIntacct does not have a native manufacturing module; merchants using third-party manufacturing connectors carry WIP in a separate GL account. The card does not see WIP held outside Intacct.
Costing method change mid-periodCard may shiftToggling an Inventory Item’s COSTMETHOD (Average to Standard, FIFO to Average) recomputes from the new basis at the next snapshot. The historical aging report used the old basis.
FX cadence per entitySmallMulti-Entity Console: card uses current-day FX, Inventory Aging Report may use period-end. Differences usually under 2% unless major FX shock.
Entity scopeEitherCard defaults to all entities the connected user can see. Per-entity reports inside Intacct differ accordingly.
Reservations and back-ordersCard unchangedCard reports physical on-hand including stock reserved for open Orders. Some Controllers prefer “available” (on-hand minus reservations) for aging; tunable via field map.
Negative inventoryCard excludesItems posted into negative quantity (sale fulfilled before receipt processed) are treated as zero by the card; Intacct’s report shows the negative value.
Cross-connector reconciliation:
CardExpected relationshipWhat the comparison reveals
shopify.inventory_valueShopify ≤ IntacctShopify tracks variant-level on-hand for SKUs synced to the storefront. Wholesale-only or marketplace-only SKUs do not appear in Shopify. The gap is unsynced or wholesale-only stock; Intacct sees the full warehouse view including B2B-only catalogues.
bigcommerce.inventory_valueBC ≤ IntacctSame dynamic. Multi-storefront BigCommerce installations may show different slices per store.
adobe_commerce.inventory_valueAdobe ≤ IntacctAdobe Commerce Multi-Source Inventory shows on-hand by source, often pulled from Intacct via a connector; the Intacct number is the ground truth.
Dead Stock with Active Ad SpendKiller cross-channel signalJoins this card’s 180+ bucket to active Google Ads / Meta / Amazon Ads spend. SKUs in the 180+ band with non-zero ad spend in the last 30 days are pure waste.
Inventory Sync DriftDiagnostic pairSurfaces SKUs where Intacct on-hand and commerce-platform on-hand have drifted apart, the leading indicator that this card and commerce-platform aging views will disagree.
google_ads.cost per-SKUIndirectCross-reference per-SKU ad spend with the aging bucket. SKUs in 91-180 receiving promotional ads are usually the right call (push them out before they go fully dead). SKUs in 180+ receiving advertising are almost always wrong.
The cross-channel kill-shot is that Intacct is the only system that can tell you “this SKU has not moved in 200 days” because the commerce platforms only see what they sold, not what is sitting cold in the Warehouse. A merchant running ads on a sold-out variant on Shopify gets a “no stock” signal; a merchant running ads on a SKU sitting in Intacct at $180K of cold stock gets nothing from Shopify because Shopify will happily ship the next order, even though no order has come in 200 days. This card plus the cross-channel join is the only way that conversation happens automatically, and Intacct’s dimensional model means the Controller can see which Department or Class owns the dead cohort without leaving the card.

Known limitations / merchant FAQs

What is a healthy aging distribution? B2B distribution: 50 to 60% in 0-60 days, less than 15% in 180+. Wholesale apparel: 50 to 65% in 0-60, less than 10% in 180+. Industrial distribution: 35 to 50% in 0-60 (longer cycles are normal), less than 18% in 180+. Furniture and homewares: 40 to 55% in 0-60 (custom and made-to-order skews older), less than 20% in 180+. Food and beverage non-perishable: 70 to 80% in 0-60, less than 5% in 180+. Compare to your own historical baseline first; trend versus your own 12-month rolling average matters more than industry benchmarks. Last-receipt vs last-sale vs last-activity, which counts? Sage Intacct’s Inventory Aging Report defaults to last-receipt at intacct.com. Some Controllers prefer last-sale (when stock “started aging from a sales perspective”, especially for slow-replenishment B2B SKUs where a single shipment can sit for months between batched orders); others use last-activity (whichever is more recent). The card respects the field-map setting; default is last-receipt. The conservative read for write-down purposes is last-activity. Sage Intacct vs NetSuite on this card? Arithmetic identical. Where Intacct shines is dimensional carry-through: every aging-bucket dollar carries Department, Location, Project, Item, Class, Customer, Vendor, and Employee tags so the Controller can pivot the same buckets without leaving the card. NetSuite’s Class / Department / Location segmentation supports this conceptually but typically requires a saved search or SuiteAnalytics workbook for the same cut. For a Finance team that lives in dimensions, the daily difference is the speed of the pivot. For pure stock-aging reporting both systems produce the same number. Sage Intacct vs Sage 50 / 100 / 200 / X3 on this card? Different products. This connector is Sage Intacct only (US mid-market cloud financials with dimensional accounting). Sage 50 and 100 are SMB desktop products with much simpler aging support; Sage 200 is a UK / EU SMB product; Sage X3 is a different mid-market ERP with deeper manufacturing support but a different dimensional model. The card definition is identical conceptually but the field map and API differ; reach out about connector availability for the other Sage products. Lot and serial-numbered items, do they age separately? Yes if costing method is FIFO or LIFO. Each lot or serial has its own age, so a lot received 200 days ago and a lot received 14 days ago of the same SKU appear in two different buckets. Average-cost items roll up to the Item level. For perishables and regulated products (pharma, food, regulated cosmetics with expiry windows), lot-level aging is the operationally meaningful view; for fashion apparel where the SKU itself is the aging unit, average-cost rollup is fine. Manufacturing WIP, included? Excluded by default. Sage Intacct does not have a native manufacturing module, so WIP held in a third-party manufacturing connector (MRPeasy, Katana, Fishbowl) does not appear in this card. The card uses what Intacct’s Inventory Item records track as on-hand at any Warehouse Location. If your Implementation Partner has built a custom Inventory Adjustment workflow to mirror WIP into Intacct, the card respects whatever is tagged as on-hand. Multi-currency, FX impact? Each entity’s aging in base currency, summed at reporting FX. Daily FX moves the headline value of remote-entity inventory but does not change the bucket distribution. A 5% GBP-USD move shifts the dollar value of UK-located stock by 5% but the share that sits in 180+ does not change. Intacct’s per-entity Currency Configuration can use transaction-date, period-end, or period-average FX; the card uses current-day FX which is closest to economic reality. Multi-Entity Console vs single-entity behaviour? Identical formula. Multi-Entity scopes across entities; per-entity cuts are essential because consolidated aging can hide a single Warehouse running cold while others are healthy. The most common mid-market pattern is one over-stocked Warehouse from a planned 2024-2025 build dragging the consolidated 91-180 bucket up while the active Warehouses run lean. Pivot by Location dimension on the card to see this in one click. End-of-cycle SKUs, can I exclude from aging? Yes, with a custom Inventory Item field. The field map can carve out “seasonal” or “long-cycle” items so aging does not fire false alarms on stock that is meant to sit between annual reorder cycles. The trade-off is that a genuine sell-through failure on a “seasonal” SKU then goes undetected; the better practice is to leave them in aging but tune the alert threshold higher (20% in 180+ instead of 15%) for the relevant Class or Department. B2B vs DTC, do I read the buckets differently? Yes. DTC apparel turns the catalogue every 30-60 days; B2B distribution turns slower (60-180 days normal for industrial distribution, 90-120 for wholesale apparel B2B). A DTC retailer with 25% in 91-180 is in trouble; a B2B distributor with 25% in 91-180 may be perfectly healthy. The thresholds and alerts in the card are tunable per workspace; do not lift a DTC playbook into a B2B context without recalibrating. Multi-Entity Console: intercompany inventory transfers, do they reset aging? Inter-co transfers between entities do not reset the aging clock by default. A SKU received into the East Coast entity on 1 Sep 25, transferred to the West Coast entity on 1 Mar 26, snapshotted on 14 Apr 26, ages 226 days from the original receipt, not 44 days from the transfer. The reasoning is that the inventory has been in the consolidated group’s hands for 226 days and the cash has been tied up that long. If a Controller wants the alternative view (transfer-resets-clock), the field map supports a transfer_resets_age = true toggle for Multi-Entity Console accounts. The default is the conservative view because the cash is the cash. ASC 606 deferred revenue, does it touch this card? No. This card is on the Balance Sheet (Inventory), not the Income Statement (Revenue / COGS). ASC 606 governs revenue recognition timing; it does not change how inventory is measured or aged. Inventory aging is purely a function of physical movement, independent of accounting policy. The card is identical for SaaS-subscription merchants on Intacct Contracts and Revenue Management as it is for distribution accounts without Contracts. FX revaluation timing, does it move this card? Yes, slightly. Intacct’s per-entity Currency Configuration sets an FX revaluation cadence (typically period-end). The card snapshots inventory value at current-day FX, so on the day before revaluation the card might read slightly different from a Balance Sheet pulled the day after. Differences are usually under 2% and reflect FX move, not a change in physical aging. B2B credit-hold stock, does it sit in aging? Yes. Stock allocated against an Order in Pending Approval or credit hold remains physically in the Warehouse and continues to age. The card reports it in the appropriate bucket. The available (on-hand minus reservations) view is a separate cut; this card uses gross on-hand. If the credit hold persists for 60+ days the inventory ages even though it is “spoken for”, which is exactly the signal a Controller wants. REST vs XML API, does freshness affect aging? No effect on the bucket math. Sage Intacct’s XML API is the workhorse for bulk inventory reads; the REST API is preferred for single-item refreshes and webhooks. Vortex IQ uses XML for the bulk aging extract (single query against the Inventory data source) and REST for incremental updates. Freshness on the card is typically 5 to 15 minutes from the most recent Intacct receipt or sale; for real-time, intacct.com is always live. Adobe Commerce / Magento vs Intacct as inventory source-of-truth? Intacct is always the source-of-truth for B2B and multi-channel businesses; Adobe Commerce is the storefront slice. Adobe Commerce 2.4+ supports Multi-Source Inventory which can sync from Intacct or operate independently; the safer pattern is to treat Intacct as the master and let Adobe pull. This card is the master view; commerce platforms see only what was synced. The Inventory Sync Drift cross-channel card detects when this assumption breaks. Implementation Partner role on this metric? The Partner usually owns the Inventory Control module setup, the Chart of Accounts mapping for the Inventory range, the bucket configuration, and the dimensional structure on Items. If this card returns a different number from the Partner’s monthly board pack, the cause is almost always: (1) a custom bucket boundary in Intacct’s Inventory Aging Report that does not match the card’s defaults, (2) a last-receipt vs last-activity policy difference, (3) an FX cadence mismatch on Multi-Entity Console. Vortex IQ’s field map is the place to align; invite the Partner into the conversation.

Tracked live in Vortex IQ Nerve Centre

Inventory Aging is one of hundreds of KPI pulses Vortex IQ tracks across Sage and 70+ other ecommerce connectors. Nerve Centre runs the detection layer; Vortex Mind investigates the cause when something moves; Ask Viq lets you interrogate any number in plain English. Start for free or book a demo to see this metric running on your own data.