Skip to main content
Card class: HeroCategory: Ecommerce Platform
Inventory value bucketed by days-on-hand: 0-30 / 31-60 / 61-90 / 91-180 / 180+. Aged stock is cash trapped on the floor.

At a glance

Inventory value bucketed by days-on-hand. Buckets: 0-30, 31-60, 61-90, 91-180, 180+. Aged stock is cash trapped on the warehouse floor.
What it countsItem.QuantityOnHand × AverageCost bucketed by Today minus Item.LastReceiptDate. The 180+ bucket is the dead-stock proxy.
Tax treatmentn/a (cost basis).
ShippingIncluded via landed cost if Item record allocates.
In-transitExcluded from aging buckets (no on-hand date yet).
CurrencyOneWorld: reporting currency at current FX.
Subsidiary scopeRespects dashboard filter.
Bucket boundariesDefault 0-30, 31-60, 61-90, 91-180, 180+. Configurable.
Time windowRT
Alert trigger>15% in 180+ bucket, sentiment inv_aging
Rolesowner, finance, operations

Calculation

Calculated automatically from your NetSuite 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 wholesale apparel distributor on NetSuite OneWorld. Three subsidiaries: a US parent (USD), a UK distribution sub (GBP), and a Canadian sub (CAD). Snapshot 14 Apr 26. Reporting currency USD.
BucketInventory value (USD)% of total
0-30 days$9,810,00036%
31-60 days$7,420,00027%
61-90 days$4,180,00015%
91-180 days$3,920,00014%
180+ days$2,180,0008%
Total Aged Inventory$27,510,000100%
Five things to notice:
  1. 8% in 180+ is below the 15% alert threshold; the Controller does not get pinged today, but the watchlist conversation starts at 8%. This is the headline read for an apparel distributor. Eight points of 27.5Mis27.5M is 2.18M sitting on the floor with no sales activity in six months. The threshold is 15% before the alert fires because below that level the inventory is usually structurally explainable (off-season carryover, safety stock for slow-replen SKUs, customer-allocated stock for B2B accounts). At 12% the conversation is “monitor”; at 15% it becomes “act”; at 20% it is the auditor’s footnote in next year’s filing. The card surfaces this so the Controller is not surprised at year-end review.
  2. **22% combined in 91+ days is the strategic concern: 6.1Mofcashtrappedinslowmovingstock.AppareltypicallyseesthisinendofseasonSKUsthatdidnotsellthroughpluscarryoversafetystockfornextyearssameseasondemand.Carryingcoston6.1M of cash trapped in slow-moving stock.** Apparel typically sees this in end-of-season SKUs that did not sell through plus carryover safety stock for next year's same-season demand. Carrying cost on 6.1M at 24% is $1.46M annualised, which is the silent expense most CFOs underestimate. The decision tree is: liquidate now at 30-50% recovery, hold to next season at full margin (carrying cost lost), or write down and dispose. The card does not make the decision; it shows the dollar weight of the trapped capital so the decision is informed.
  3. 63% in 0-60 days is the active flowing stock and the turnover engine. This is the slice that reads as “healthy turnover” on the Inventory Turnover card. A wholesale apparel business with 60% of inventory flowing inside 60 days is at the better end of the industry distribution; a DTC apparel brand should aim for 70%+ in 0-60. If this share drops below 50%, look at upstream demand forecasting: somebody is ordering ahead of demand and the buying calendar needs a hard review.
  4. **180+ at 2.18Misthedeadstockcandidateforliquidation,andthisiswherethecrosschannelkillerviewlightsup.Pairthiscardwith[DeadStockValue](/nervecentre/kpicards/netsuite/deadstockvalue)and[DeadStockwithActiveAdSpend](/nervecentre/kpicards/netsuite/deadstockwithactiveadspend).OnthisaccounttheVortexIQcrossconnectorjoinsurfaced18SKUsinthe180+bucketthatstillhadactiveGoogleAdscampaignsrunning,with2.18M is the dead-stock candidate for liquidation, and this is where the cross-channel killer view lights up.** Pair this card with [Dead Stock Value](/nerve-centre/kpi-cards/netsuite/dead-stock-value) and [Dead Stock with Active Ad Spend](/nerve-centre/kpi-cards/netsuite/dead-stock-with-active-ad-spend). On this account the Vortex IQ cross-connector join surfaced 18 SKUs in the 180+ bucket that still had active Google Ads campaigns running, with 14,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 NetSuite inventory data to Google Ads campaign data. This card is the trigger; the cross-connector card is the kill-shot.
  5. The bar chart pattern matters more than any single bucket. Steady declining slope across buckets (each bucket smaller than the previous) = healthy fast-moving business. Bulge in the middle (31-90 buckets larger than 0-30) = ordering ahead of demand or seasonal pre-buy. Flat across all buckets = systemic over-stocking, the warehouse is full and nothing is leaving fast. Inverted (180+ bigger than 0-30) = collapsed business, the buyer should have stopped ordering months ago. On this account the pattern is gentle decline, which is the healthiest shape. Compare to a manufacturer client where the 91-180 bucket consistently bulges 5-8 points larger than 31-60, indicating quarterly batch production runs that take 6 months to draw down. Pattern is more diagnostic than absolute level. Add a per-subsidiary cut and the pattern often differs by sub: the UK sub on this account shows a flat distribution (warehouse over-full from a 2025 build), while the US sub shows the gentle decline. Consolidated hides this, per-sub reveals it.

Sibling cards merchants should reference together

CardWhy pair it with Inventory Aging
Total Inventory ValueThe total. Aging decomposes by age.
Dead Stock ValueThe hard-cut bad stock view.
Inventory Carrying CostThe expense impact.
Inventory TurnoverInverse signal.
Top SKUs ValueConcentration.
Dead Stock with Active Ad SpendCross-channel signal.

Reconciling against the vendor’s own dashboard

Where to look in NetSuite: The native NetSuite views to run side by side with this card:
Reports → Inventory → Inventory Aging Detail (the canonical aging report) Reports → Inventory → Inventory Valuation (rolls up the same totals without the bucket cut) Reports → Inventory → Inventory Stock Status (real-time on-hand by location) Reports → Inventory → Slow-Moving Inventory (a stricter cut on items with no activity) Saved search: Item.QuantityOnHand > 0, grouped by Today minus LastReceiptDate aged into 0-30, 31-60, 61-90, 91-180, 180+ buckets, summed on Item.AverageCost × Item.QuantityOnHand SuiteAnalytics workbook: most accounts have a workbook called “Inventory Aging” that pivots Item by aging band. The data source is the same; the view is interactive.
The Inventory Aging Detail report should match this card to within rounding when you select the same subsidiary scope and snapshot date. For OneWorld accounts run Reports → Financial → Consolidated Balance Sheet → Inventory at the same scope, otherwise FX shifts the dollar value of remote-sub inventory between report runs. Common reconciliation pitfalls:
  • NetSuite’s standard report uses calendar-day buckets; some custom workbooks use 30 / 60 / 90 / 120 / 180+ instead of 91-180, splitting the long tail differently. The card defaults to the standard bands; tune the field map if your finance policy uses different boundaries.
  • In-transit inventory is excluded from this card by default (no on-hand date yet) but appears on the Inventory Valuation report. Expect Inventory Valuation to read 5-15% higher than this card if your business has significant ocean freight in flight.
  • Multi-location can split a single Item across 4-8 warehouses, each with its own LastReceiptDate. The card uses the location-specific receipt date so a SKU with stale stock in one warehouse and fresh stock in another shows in two buckets simultaneously. Confirm this is the intended behaviour before reconciling at the Item level.
  • Lot-numbered and serial-numbered items age per lot or per serial, not per Item. The card respects the costing method; reconciling against an Item-level saved search will not match a lot-level view.
Why our number may legitimately differ from a NetSuite Inventory Aging report:
ReasonDirectionWhy
Bucket boundariesEitherNetSuite’s standard report uses 30 / 60 / 90 / 180+ (four buckets). Card uses 0-30, 31-60, 61-90, 91-180, 180+ (five buckets) for finer granularity. The 91-180 split is the diagnostic difference; the long-tail dollar total matches.
Last activity date vs last receipt dateEitherSome accounts age from last-sold (item is “aging” from the moment of last sale) rather than last-received. Apparel typically uses last-receipt; B2B distribution often uses last-activity (received OR sold, whichever is more recent). Card uses receipt by default; field map can flip to activity.
In-transit inclusionCard lowerInventory in transit (PO received, not yet stock-on-hand) appears on the Balance Sheet but has no aging date. Card excludes; Inventory Valuation includes.
Consigned and customer-allocated stockEitherStock physically at a customer site under consignment shows on the Balance Sheet in some setups but not others. Card uses what NetSuite tracks as On Hand; consigned-out stock may sit on a different location.
WIP and Assembly Build sub-itemsCard lowerWIP excluded by default. The components consumed into WIP have left the warehouse and are not yet finished goods. Inventory Valuation includes WIP value; this card does not.
Costing method change mid-periodCard may shiftIf the Item Cost Method changed in NetSuite (Average to Standard, or FIFO to Average) the card recomputes from the new basis at the next snapshot, while the historical aging report used the old basis.
FX cadenceSmallOneWorld accounts: card uses current-day FX for the snapshot, NetSuite’s reports may use period-end. Differences usually under 1% unless major FX shock.
Subsidiary scopeEitherCard defaults to all subsidiaries the connected role can see. Per-subsidiary reports inside NetSuite differ accordingly.
Reservations and back-ordersCard unchangedCard reports physical on-hand including stock reserved for open Sales Orders. Some Controllers prefer “available” (on-hand minus reservations) for aging; tunable.
Negative inventoryCard excludesIf a SKU posted into negative quantity (sales fulfilled before the receipt was processed) the card treats negatives as zero. Inventory Valuation reports the negative value, which can mask aged stock elsewhere.
Cross-connector reconciliation:
CardExpected relationshipWhat the comparison reveals
shopify.inventory_valueShopify ≤ NetSuiteShopify tracks inventory at the variant level for the SKUs synced to the storefront. Wholesale-only or marketplace-only SKUs do not appear in Shopify. The gap is the unsynced or wholesale-only stock.
bigcommerce.inventory_valueBC ≤ NetSuiteSame dynamic. Multi-storefront BC installations may show different slices per store.
adobe_commerce.inventory_valueAdobe ≤ NetSuiteAdobe Commerce supports Multi-Source Inventory which can show stock across multiple sources, but the source-of-truth is the NetSuite warehouse.
Dead Stock with Active Ad SpendKiller cross-channel signalJoins this card’s 180+ bucket to active Google Ads / Facebook Ads / TikTok Ads campaigns. Items in 180+ aging with non-zero ad spend in the last 30 days are pure waste.
google_ads.cost per-SKUIndirectCross-reference per-SKU ad spend with the aging bucket. SKUs in 91-180 receiving promotional advertising are usually the right call (push them out before they go fully dead). SKUs in 180+ receiving advertising are almost always the wrong call.
The cross-channel killer view is that NetSuite 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 NetSuite at $180K of cold stock gets nothing from Shopify. This card plus the cross-channel join is the only way that conversation happens automatically.

Known limitations / merchant FAQs

What is a healthy aging distribution? Apparel: 50-65% in 0-60 days, less than 10% in 180+. Electronics: 60-75% in 0-60, less than 5% in 180+. Food and beverage (non-perishable): 70-80% in 0-60, less than 3% in 180+. Industrial distribution: 35-50% in 0-60 (longer cycles are normal), less than 15% in 180+. Furniture and homewares: 40-55% in 0-60 (custom and made-to-order skews older), less than 20% in 180+. Industry varies, so compare to your own historical baseline first; the trend versus your own 12-month rolling average matters more than the industry benchmark. Last-receipt vs last-sale date, which counts? NetSuite’s standard view uses last-receipt. Some Controllers prefer last-sale because that is when stock “started aging from a sales perspective”, especially for slow-replenishment B2B SKUs where a single shipment can sit on the shelf for months between batched orders. Card respects the field-map setting; default is last-receipt. The conservative read for write-down purposes is whichever date is more recent (last-activity). Lot and serial-numbered items, do they age separately? Yes if costing method is Lot or Serial Numbered. Each lot 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, cosmetics with expiry), lot-level aging is the operationally meaningful view; for fashion apparel where the SKU itself is the aging unit, average-cost rollup is fine. WIP, included? Excluded by default. WIP is not finished aged inventory; it is in-process, with components consumed but not yet ready to ship. Manufacturers running NetSuite SuiteIndustries for manufacturing can opt to include WIP via the field map, but the default behaviour treats WIP as a separate Balance Sheet line and ages only finished goods. Multi-currency, FX impact? Each subsidiary’s aging in base currency, summed at reporting FX. Daily FX moves the headline value of remote-sub 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. OneWorld vs single-subsidiary behaviour? Identical formula. OneWorld scopes across subsidiaries; per-subsidiary 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 2025 build dragging the consolidated 91-180 bucket up while the active warehouses run lean. End-of-season SKUs, can I exclude from aging? Yes, with a custom Item field tag. The field map can carve out “seasonal” items so aging does not fire false alarms on apparel that is meant to sit through summer and sell next spring. The trade-off is that a genuine sell-through failure on a “seasonal” SKU then goes undetected; the better practice is to leave seasonals in aging but tune the alert threshold higher (20% in 180+ instead of 15%) for the relevant period. B2B vs DTC, do I read the buckets differently? Yes. DTC apparel turns the catalogue every 30-60 days; B2B distribution turns slower (60-120 days is normal for industrial distribution). 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 by workspace; do not lift a DTC playbook into a B2B context without recalibrating the bands. OneWorld multi-subsidiary, what about intercompany inventory transfers? Inter-co transfers between subs do not reset the aging clock by default. A SKU received into the US sub on 1 Sep 25, transferred to the UK sub on 1 Mar 26, and snapshotted on 14 Apr 26 ages 226 days (from the original receipt), not 44 days (from the transfer date). The reasoning is that the inventory has been in the group’s hands for 226 days and the cash has been tied up that long, regardless of which sub holds the title now. If a Controller wants the alternative view (transfer-resets-clock), the field map supports a transfer_resets_age = true toggle for OneWorld accounts. 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 (received, on-hand, sold), independent of accounting policy. FX revaluation timing, does it move this card? Yes, slightly. NetSuite’s monthly FX revaluation revalues remote-subsidiary inventory at the period-end exchange rate. 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 revaluation. Differences are usually under 2% and reflect the FX move, not a change in physical aging. B2B credit-hold stock, does it sit in aging? Yes. Stock allocated against a Sales Order in Pending Approval due to 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. Magento / Adobe Commerce vs NetSuite as inventory source-of-truth? NetSuite is always the source-of-truth for B2B and multi-channel businesses; Adobe Commerce / Magento is the storefront view of a slice of NetSuite inventory. Adobe Commerce 2.4+ supports Multi-Source Inventory which can sync from NetSuite or operate independently; the safer pattern is to treat NetSuite as the master and let Adobe pull. This card is the master view; commerce platforms see only what was synced. NetSuite vs Oracle ERP Cloud / SAP S/4HANA on inventory aging? NetSuite’s strength on this card is the lightweight aging detail report and the SuiteAnalytics workbook, which are configurable in 15 minutes. Oracle ERP Cloud and SAP S/4HANA support deeper costing variants (parallel valuation, multiple costing books, group vs legal vs management views) at the cost of more configuration. For mid-market commerce (30150Mrevenue)theNetSuitemodelisusuallyfastertomaintain.For30-150M revenue) the NetSuite model is usually faster to maintain. For 250M+ businesses with manufacturing-heavy operations and complex costing requirements, Oracle and SAP earn their additional setup. Vortex IQ supports both NetSuite and Oracle ERP Cloud connectors; the card definition is identical, the field maps differ. Vendor-managed inventory (VMI), does it count? Depends on title. If the supplier holds title until consumption (true VMI), the stock is not on the merchant’s Balance Sheet and not in this card. If the merchant holds title from receipt (consigned-in), it is. Confirm with your auditor; the field map respects whichever convention is set up.

Tracked live in Vortex IQ Nerve Centre

Inventory Aging is one of hundreds of KPI pulses Vortex IQ tracks across NetSuite 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.