Retail & ecommerce / Inventory

Aged retail inventory: build an action queue by SKU and location

By Vikasraj YadavPublished 19 min read

For inventory planning lead · Plan implementation

TL;DR — what you’ll learn

  • Never respond to aged retail inventory by launching a blanket category-wide discount before checking open inbound purchase orders (`On-Order`) and cross-location sell-through disparities.
  • Rank every slow-moving SKU-location record by **Total Forward Exposure (`On-Hand + On-Order`) divided by Uncensored Daily Velocity**; when a SKU (`SKU-JACKET-OLIVE-M`) has `120 units` on hand (`240 days cover`) and `80 units` due on an open PO (`pushing cover to 400 days`), your first action is cancelling or deferring the `80-unit` inbound PO (`saving ₹1,12,000.00 in cash outflow`).
  • Follow a strict four-stage action hierarchy: (1) Cancel/de-commit inbound `On-Order` supply, (2) Rebalance `30 units` to high-velocity stores where cover is `<45 days`, (3) Return or swap eligible stock with the vendor, and (4) Apply a targeted `20%` markdown only to the remaining `90 units`.
  • Validate your aged-inventory queue with three acceptance tests: inbound-PO freeze triggering, transfer-vs-markdown net recovery comparison, and post-action sell-through verification.

Topics: retail aged inventory report · slow moving retail stock · dead stock analysis · inventory ageing actions

Light-ash and grey warehouse inspection counter with two dark monitors, docked handheld barcode scanners, a stainless parcel scale, unbranded kraft boxes and grey storage totes overlooking a high-bay pallet racking mezzanine.

Illustrative e-commerce returns grading and warehouse inventory reconciliation desk; not a client facility.

All quantities, amounts, product codes and events are illustrative teaching examples.

At the mid-season inventory review, an apparel chain's western-region hub (WH-MUM-01) holds 120 units of an olive utility jacket (SKU-JACKET-OLIVE-M, landed unit cost ₹1,400.00, MRP ₹2,800.00, total on-hand cost ₹1,68,000.00) that has aged past 95 days and is selling at just 0.50 units per day (240 days / 8 months of on-hand cover). Unbeknownst to the category merchandiser who is preparing a panic 40% clearance markdown (cutting price to ₹1,680.00), an automated replenishment rule or pre-season blanket schedule still has an open purchase order (PO-2026-9104) for another 80 units (₹1,12,000.00 cost) scheduled to ship from the vendor next week. If the retailer leaves PO-2026-9104 open and slashes the price by 40% across all 200 units (120 on hand + 80 arriving), it pours ₹1,12,000.00 of fresh cash into an already overstocked item and collapses gross margin to ₹280.00/unit (₹56,000.00 total margin across 200 units). Conversely, if the aged-inventory action queue automatically flags and cancels the 80-unit unshipped PO first (saving ₹1,12,000.00 cash), transfers 30 units to the chain's Chandigarh store cluster where colder weather is driving full-price sales (₹2,800.00), and applies a disciplined 20% markdown (₹2,240.00) to the remaining 90 units in Mumbai, the retailer recovers ₹1,15,200.00 in gross margin while tying up ₹1,12,000.00 less working capital.

The operational decision for an inventory planning lead across fashion, lifestyle, and general-merchandise retailers is how to replace reactive clearance sales with a weekly SKU-by-location action queue—anchored on explicit inventory states including Incoming/On-Order stock, open-to-buy budget controls, and structured retail markdown discipline—so supply valve shut-off and store rebalancing always precede price cuts (Shopify Help Center — Inventory states (Available, On hand, Committed, Incoming, Unavailable), Shopify Retail Blog — Open-to-buy (OTB) planning and inventory budgeting guide). By linking this control to markdown versus store transfer decision math and open-to-buy budget and commitment controls, inventory planning lead teams prevent downstream inventory, customer-promise, and financial breaks before stock or cash moves.

Why discounting aged stock while open POs remain active destroys cash flow

Most aged-inventory reports fail because they look exclusively at a static snapshot of current on-hand stock (120 units > 90 days old) in isolation from inbound purchase orders (80 units due) and location-specific velocity (0.5/day in Mumbai vs 1.0/day in Chandigarh).

When merchandisers manage aged stock from a static ageing bucket report (0–30, 31–60, 61–90, 90+ days) without an ordered action workflow, three costly mistakes occur:

  1. Bailing water while the inbound tap is wide open: If a SKU already has 240 days of on-hand cover (120 units / 0.5 per day), receiving another 80 units on an open purchase order pushes total forward cover to 400 days (200 / 0.5). Moreover, when those 80 new units arrive, naive FIFO/ageing reports classify them in the 0–30 day ('Fresh') bucket, masking the fact that total SKU exposure just worsened by 66.7% (₹1,12,000.00).
  2. Chain-wide markdowns that cannibalize full-price stores: A winter jacket that is stagnating in warm Mumbai (0.5 units/day) may have only 18 days of cover in Chandigarh or Delhi (where it sells at full ₹2,800.00 MRP). Triggering a national 40% discount throws away ₹1,120.00/unit of margin in northern stores that would have sold out at full price after a ₹65.00/unit inter-store transfer.
  3. Unranked exception queues that overwhelm planners: Dumping 1,500 slow-moving SKU-store rows into a spreadsheet without sorting by Rupee Capital at Risk ((On_Hand + On_Order) x Landed_Cost) causes planners to spend hours tweaking markdowns on ₹8,000.00 tail items while ignoring a ₹2,80,000.00 inbound commitment on a slowing hero SKU.

To drive deterministic decisions every Monday morning, govern your aged-inventory queue with four equations:

  • On-Hand Days of Cover (DoC_OH) = On_Hand_Units / Daily_Sales_Velocity = 120 / 0.50 = 240 days
  • Total Forward Exposure Days of Cover (DoC_Total) = (On_Hand_Units + Open_On_Order_Units) / Daily_Sales_Velocity = (120 + 80) / 0.50 = 400 days
  • Total Working Capital Exposure = (On_Hand_Units + Open_On_Order_Units) x Unit_Landed_Cost = 200 x ₹1,400.00 = ₹2,80,000.00
  • Net Recovery of Action Sequence = Avoided_PO_Cash_Outflow (₹1,12,000.00) + Net_Transfer_Proceeds + Net_Markdown_Proceeds - On_Hand_Cost

Whenever DoC_Total > Category_Max_Cover_Threshold (e.g., 90 days), the system must execute the Four-Step Action Hierarchy in strict order: Step 1: Freeze/Cancel Open POs -> Step 2: Inter-Store Rebalance -> Step 3: Vendor RTV/Swap -> Step 4: Targeted Depth-Controlled Markdown.

Scroll horizontally to see all columns.

Action queue priority step Trigger condition on SKU-Location Operational action executed Financial & cash-flow impact (SKU-JACKET-OLIVE-M) System gate before moving to next step
Step 1: Inbound Supply Shut-Off (PO Freeze) DoC_Total = 400d > 90d with Open_PO = 80 units (>7 days to ship) Cancel or convert PO-2026-9104 (80 units) into a high-velocity SKU Saves ₹1,12,000.00 immediate cash outflow; cuts cover from 400d to 240d Block markdown creation on any SKU that still has active unshipped POs
Step 2: Cross-Store / Region Rebalancing Origin DoC_OH = 240d while Destination (STR-CHD-02) has DoC < 30d at full price Transfer 30 units to Chandigarh (@ ₹65.00/u freight = ₹1,950.00) Sells 30 units @ ₹2,800.00 = ₹84,000.00 rev (₹40,050.00 net margin after freight) Verify Net_FullPrice_Transfer_Margin (₹1,335/u) > Local_Markdown_Margin (₹840/u)
Step 3: Vendor Return-to-Vendor (RTV) / Margin Support Remaining 90 units still exceed 90d cover; check vendor RTV/rebate contract Apply any contracted stock-rotation quota or claim vendor markdown funding Recovers 100% cost on RTV units or secures vendor credit note toward Step 4 Log RTV_Eligibility_Checked = TRUE before unlocking clearance price tiers
Step 4: Targeted Location Markdown (20% vs 40%) Remaining 90 units in Mumbai (180d cover at 0.5/d; target 90d clear at 1.0/d) Apply 20% local markdown (₹2,240.00) on 90 units in Mumbai only Generates 90 x ₹2,240.00 = ₹2,01,600.00 rev (₹75,600.00 margin = ₹840.00/u) Protect full ₹2,800.00 MRP in northern stores; review velocity lift after 14 days
Contrast: Ungoverned Blanket 40% Slash (No PO Cancel) Merchandiser discounts all 200 units (120 + 80 PO) to ₹1,680.00 (-40%) Receives 80 unwanted units and sells 200 units at ₹280.00/u margin Requires ₹2,80,000.00 capital for only ₹56,000.00 total margin (20.0% GMROI) Prevented by Queue: Governed path earns ₹1,15,650.00 net margin on ₹1,68,000.00 capital

By enforcing the action hierarchy in sequence, the planning lead earns ₹59,650.00 more net margin (₹1,15,650.00 vs ₹56,000.00) while spending ₹1,12,000.00 less cash on inbound inventory.

Aged retail inventory four-stage action queue (On-Hand + On-Order governance) Sequential decision queue showing Total Exposure calculation (120 OH + 80 PO = 200u), Step 1 PO cancellation (-80u, ₹1.12L saved), Step 2 store transfer (30u to full-price store), and Step 4 targeted 20% markdown (90u). 1. 1. Total Exposure Scan On-Hand: 120u (240d cover) Open PO: +80u (₹1.12L) Total Exposure: 200u (400d)
  <path d="M219 85 L248 85" stroke="#475569" stroke-width="1.8" marker-end="url(#arrow-r033)"/>

  <rect x="248" y="40" width="195" height="90" rx="8" fill="#fef9c3" stroke="#ca8a04" stroke-width="1.5"/>
  <text x="262" y="64" font-weight="700" fill="#854d0e">2. 2. Action 1: Shut Valve</text>
  <text x="262" y="84">Cancel/swap Open PO (80u)</text>
  <text x="262" y="102">Saves ₹1,12,000.00 cash</text>
  <text x="262" y="118" font-size="11" fill="#475569">Remaining OH: 120 units</text>

  <path d="M443 85 L472 85" stroke="#475569" stroke-width="1.8" marker-end="url(#arrow-r033)"/>

  <rect x="472" y="40" width="195" height="90" rx="8" fill="#ffedd5" stroke="#ea580c" stroke-width="1.5"/>
  <text x="486" y="64" font-weight="700" fill="#9a3412">3. 3. Action 2: Transfer</text>
  <text x="486" y="84">Ship 30u to Chandigarh</text>
  <text x="486" y="102">Sells @ ₹2,800 full MRP</text>
  <text x="486" y="118" font-size="11" fill="#475569">Net Margin: ₹40,050.00</text>

  <path d="M667 85 L696 85" stroke="#475569" stroke-width="1.8" marker-end="url(#arrow-r033)"/>

  <rect x="696" y="40" width="200" height="90" rx="8" fill="#dcfce7" stroke="#16a34a" stroke-width="1.5"/>
  <text x="710" y="64" font-weight="700" fill="#166534">4. 4. Action 3: Local Promo</text>
  <text x="710" y="84">Discount 90u in Mum (-20%)</text>
  <text x="710" y="102">Price: ₹2,240 (₹840/u mgn)</text>
  <text x="710" y="118" font-size="11" fill="#475569">Total Margin: ₹1,15,650</text>

  <rect x="24" y="166" width="872" height="164" rx="8" fill="#ffffff" stroke="#cbd5e1" stroke-width="1.2"/>
  <text x="44" y="194" font-weight="700" font-size="13" fill="#0f172a">Aged inventory action-queue control gates (inventory planning lead + category buyer)</text>
  <text x="44" y="220" fill="#334155">• Gate A: Forward Exposure Consolidation — Rank aged SKUs by `(On_Hand + Open_PO) x Cost` (`₹2,80,000.00`) and `DoC_Total` (`400 days`), never by On-Hand age alone.</text>
  <text x="44" y="246" fill="#334155">• Gate B: Mandatory Supply Shut-Off Gate — Block any promotional or clearance markdown on a SKU while an unshipped `Open_PO` (`80 units`) remains active in the ERP.</text>
  <text x="44" y="272" fill="#334155">• Gate C: Transfer-Before-Markdown Arbitrage Check — If another store cluster has `<30 days cover` at full price and `Transfer_Net_Margin (₹1,335/u) > Markdown_Margin (₹840/u)`, generate a transfer order first.</text>
  <text x="44" y="302" font-weight="600" fill="#0369a1">Outcome: Saves ₹1,12,000.00 in unnecessary PO cash outflow and increases net margin recovery by +₹59,650.00 (+106.5%) over a blanket 40% cut.</text>
</g>
<defs>
  <marker id="arrow-r033" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse">
    <path d="M 0 0 L 10 5 L 0 10 z" fill="#475569"/>
  </marker>
</defs>
Sequential decision queue showing Total Exposure calculation (120 OH + 80 PO = 200u), Step 1 PO cancellation (-80u, ₹1.12L saved), Step 2 store transfer (30u to full-price store), and Step 4 targeted 20% markdown (90u).

Worked illustrative example: resolving 120 units on hand plus 80 units on order for a slow-selling jacket

Illustrative example (hypothetical scenario): Follow the complete financial and inventory math for SKU-JACKET-OLIVE-M (Landed Cost ₹1,400.00, MRP ₹2,800.00, Velocity = 0.50 units/day in Mumbai) when the weekly aged-inventory queue flags 120 units on hand alongside 80 units on open purchase order PO-2026-9104.

Step 1: Establish the baseline operational and commercial parameters

  1. Baseline exposure diagnosis:
    • Current On-Hand (WH-MUM-01): 120 units x ₹1,400.00 = ₹1,68,000.00 cost (Retail value = ₹3,36,000.00). At 0.50 units/day, DoC_OH = 120 / 0.50 = 240 days.
    • Open Inbound Supply (PO-2026-9104): 80 units x ₹1,400.00 = ₹1,12,000.00 cost scheduled for delivery in 10 days.
    • Combined Forward Exposure: 120 + 80 = 200 units (₹2,80,000.00 total cost; DoC_Total = 200 / 0.50 = 400 days, more than 4.4x the category's 90-day maximum cover limit).
  2. Path A — Ungoverned reactive response (Leave PO open + Blanket 40% markdown on all 200 units):
    • The buyer overlooks PO-2026-9104, receives the 80 units (paying ₹1,12,000.00 cash), and slashes the price by 40% from ₹2,800.00 to ₹1,680.00 across all 200 units.
    • Path A Economics: Total revenue = 200 x ₹1,680.00 = ₹3,36,000.00; Total product cost = 200 x ₹1,400.00 = ₹2,80,000.00; Total Net Margin = 200 x ₹280.00 = ₹56,000.00 (Gross margin = 16.67%; return on ₹2,80,000.00 inventory cost = 20.0%).

Step 2: Reconcile states, exceptions, and financial impact

  1. Path B — Governed Aged-Inventory Action Queue (Cancel PO -> Transfer 30 -> Markdown 90 at 20%):
    • Queue Action 1 (Cancel/Swap 80-unit Open PO): Because PO-2026-9104 is still outside the vendor's 7-day ship freeze, the planner cancels the 80 units of SKU-JACKET-OLIVE-M (or reallocates the OTB budget to a sold-out bestseller). Immediate cash saved = 80 x ₹1,400.00 = ₹1,12,000.00. Remaining inventory to clear = 120 units (₹1,68,000.00 cost).
    • Queue Action 2 (Transfer 30 units to Chandigarh STR-CHD-02): The queue identifies that Chandigarh stores are selling 1.0 unit/day at full ₹2,800.00 MRP with only 12 days of stock left. Shipping 30 units from Mumbai to Chandigarh costs ₹65.00/unit (30 x ₹65.00 = ₹1,950.00 total transfer freight). Those 30 units sell at full ₹2,800.00 (₹84,000.00 revenue), yielding a net contribution of 30 x (₹2,800.00 - ₹1,400.00 - ₹65.00) = 30 x ₹1,335.00 = ₹40,050.00.
    • Queue Action 3 (Targeted 20% local markdown on remaining 90 units in Mumbai): With exposure reduced from 200 to 90 units, a moderate 20% price cut (from ₹2,800.00 to ₹2,240.00, doubling Mumbai velocity from 0.5 to 1.0 unit/day) clears the 90 units within the 90-day target window. Those 90 units generate 90 x ₹2,240.00 = ₹2,01,600.00 in revenue and 90 x (₹2,240.00 - ₹1,400.00) = 90 x ₹840.00 = ₹75,600.00 in gross margin.
    • Path B Consolidated Economics: On ₹1,68,000.00 of inventory cost (saving ₹1,12,000.00 in cash), the retailer generates ₹84,000.00 + ₹2,01,600.00 = ₹2,85,600.00 in revenue and ₹40,050.00 + ₹75,600.00 = ₹1,15,650.00 in net contribution (68.84% return on inventory cost)—beating Path A by +₹59,650.00 in profit and +₹1,12,000.00 in preserved cash.

Scroll horizontally to see all columns.

Inventory cohort & action Units handled Selling price / cash impact Unit cost + freight Net unit margin Total cohort contribution (₹)
1. Path A (Ungoverned): 40% slash on 120 OH + 80 PO 200 units ₹1,680.00 (-40%) ₹1,400.00 (₹2.80L total) ₹280.00/unit ₹56,000.00 (Requires ₹1,12,000 extra PO cash!)
2. Path B Action 1: Cancel/Defer Open PO-2026-9104 80 units (PO) ₹1,12,000.00 cash saved ₹0.00 (cancelled) Avoids 80 x ₹1,120 markdown loss ₹1,12,000.00 working capital preserved
3. Path B Action 2: Transfer to Chandigarh (Full MRP) 30 units (OH) ₹2,800.00 (0% disc) ₹1,465.00 (₹1,400 + ₹65 freight) ₹1,335.00/unit ₹40,050.00 (₹84,000.00 revenue)
4. Path B Action 3: Targeted 20% Mumbai Markdown 90 units (OH) ₹2,240.00 (-20%) ₹1,400.00 ₹840.00/unit ₹75,600.00 (₹2,01,600.00 revenue)
5. Path B Total (120 OH cleared, 80 PO cancelled) 120 units sold ₹2,85,600.00 revenue ₹1,69,950.00 (Cost + Freight) ₹963.75/unit avg ₹1,15,650.00 (+₹59,650.00 over Path A)

Verified scenario calculation summary

  • On_Hand_Days_Of_Cover (DoC_OH) = 120 units / 0.50 units/day = 240 days (₹1,68,000.00 cost)
  • Total_Forward_Exposure_Cover (DoC_Total) = (120 on hand + 80 on order) / 0.50 units/day = 200 / 0.50 = 400 days (₹2,80,000.00 total capital)
  • Path_A_Blanket_40Pct_Markdown (200 units @ ₹1,680.00): Revenue = ₹3,36,000.00; Cost = ₹2,80,000.00; Net_Margin = 200 * ₹280.00 = ₹56,000.00
  • Path_B_Step_1_PO_Cancel: 80 units * ₹1,400.00 = ₹1,12,000.00 cash outflow avoided
  • Path_B_Step_2_Transfer (30 units @ ₹2,800.00, freight ₹65.00/u): Net_Margin = 30 * (₹2,800.00 - ₹1,400.00 - ₹65.00) = 30 * ₹1,335.00 = ₹40,050.00
  • Path_B_Step_3_Local_20Pct_Markdown (90 units @ ₹2,240.00): Net_Margin = 90 * (₹2,240.00 - ₹1,400.00) = 90 * ₹840.00 = ₹75,600.00; Total_Path_B_Margin = ₹40,050.00 + ₹75,600.00 = ₹1,15,650.00 (+₹59,650.00 over Path A)

The single highest-return action on an aged SKU is almost never a price cut—it is shutting off the 80-unit (₹1,12,000.00) inbound purchase order before it lands on the warehouse dock.

Aged inventory action-queue workflow: roles, exception handling, and system choice

To run a disciplined weekly aged-inventory queue across categories and locations, establish four operational steps:

  1. Monday morning Forward-Exposure Queue generation (Owner: Inventory Planning Lead). Run an automated weekly extract that joins On_Hand_Qty, Batch_Age_Days, Open_PO_Qty, and Trailing_28d_Uncensored_Velocity by SKU and location. Flag every SKU where DoC_Total > 90 days or Age > 90 days and sort descending by Total_Working_Capital_Exposure (₹).
  2. Automated Step-1 Open-PO Hold and De-commitment (Owner: Procurement & Merchandise Planner). For any SKU entering the aged action queue that has open unshipped PO lines (80 units), place an immediate system Hold_For_Cancellation_Or_Swap on the PO and notify the vendor within 24 hours before approving any store or web promotions.
  3. Automated Step-2 Cross-Location Transfer Arbitrage Matching (Owner: Allocation Analyst). Pair overstocked locations (DoC_OH > 120 days) against understocked locations (DoC_OH < 30 days with full-price velocity >= 0.5/day). Generate inter-store transfer orders (30 units) whenever Full_Price_Margin - Transfer_Freight > Local_Markdown_Margin.
  4. Graduated Step-4 Markdown Release with 14-Day Elasticity Check (Owner: Pricing & Category Manager). Unlock clearance pricing only after Steps 1–3 are completed and logged. Start at the shallowest price tier (20% off) localized to the overstocked region, and deepen to 30%–40% only if 14-day sell-through fails to hit the target clearance run rate.

Choosing the right tool: A mid-sized retailer can run this entire workflow from a weekly SQL/BI view that joins three tables (Inventory On Hand, Open Purchase Orders, and 30-Day Store Sales) and enforces a mandatory checklist (1. PO Cancelled -> 2. Transfer Checked -> 3. Markdown Approved). Larger chains should enforce a system gate in their ERP/pricing module that rejects clearance price uploads on any SKU with an open unshipped PO.

Operational governance and audit controls for sustained compliance

To prevent this workflow from eroding after the initial implementation sprint, embed four recurring governance checkpoints into your weekly retail operations cadence:

  1. Version-locked rule and threshold tables: Store every tolerance band, status-transition rule, and exception-routing map in a versioned configuration table rather than ad-hoc personal spreadsheets. Any threshold change requires sign-off from inventory planning lead and commercial finance, recording the effective timestamp and the cohort of SKUs or locations affected.
  2. Automated daily orphan and stale-state sweep: Run a scheduled morning query that flags records stuck in an intermediate state (Pending Verification, In Transit, Awaiting Confirmation, or Held for Review) beyond their agreed service-level cutoff. Route aged exceptions directly to the named role owner before customer promises or period-close cutoffs are breached.
  3. Separation of operational execution from financial write-off authority: Staff who execute physical picks, catalogue edits, or customer service actions should never have unilateral system permission to clear reconciliation variances or post financial write-offs. Require dual sign-off once cumulative weekly adjustments on a SKU, store, or vendor exceed your materiality floor.
  4. Monthly root-cause retrospective tied to source-system hygiene: Aggregate exception logs by upstream root cause—such as missing supplier identifiers, delayed webhook deliveries, or uncalibrated store stock counts—and require the responsible upstream team to remediate the top three recurring defects before the next monthly cycle.

Bounded pilot scope, baseline measurement, and stop/recovery criteria

Because this workflow alters operational control gates across inventory and financial reconciliation, run a bounded 30-day pilot in one category or location before enabling enterprise-wide enforcement:

Scroll horizontally to see all columns.

Pilot governance dimension Bounded design parameter Accountable owner Verification evidence required before expansion
Bounded pilot scope One seasonal apparel category (Men's Outerwear & Layering, 85 SKUs across 1 regional hub and 12 stores) during the mid-season weeks 6–10 review window. Inventory planning lead Signed scope charter naming the exact category, SKU cohort, or channel group and excluding automated general-ledger postings until parallel reconciliation passes.
Pre-change baseline window Prior season's clearance records measuring inbound PO units received into already-aged SKUs (>90d DoC), blanket markdown depth (%), and net realized GMROI. Inventory planning lead + commercial finance analyst Locked 30-day historical baseline extract recording denominator counts, exception rates, and manual rework hours prior to rule activation.
Stop and recovery triggers Release automated PO holds within 4 hours if a flagged SKU is part of a binding contractual minimum-order bundle whose cancellation would delay core replenished bestsellers. Inventory planning lead + IT systems administrator Tested rollback procedure that pauses automated holds or queue transitions within 30 minutes, preserves raw event logs, and reverts to supervised manual review.

During the pilot window, hold a weekly joint review between inventory planning lead, store or warehouse operations, and commercial finance to inspect every quarantined exception record. Do not expand the rule set to additional categories or automate ledger adjustments until the pilot achieves zero unexplained reconciliation breaks across two consecutive weekly cut-offs.

Observable acceptance tests for your retail systems

Before relying on this workflow in production, execute three deterministic acceptance tests (ACT-R033-01 to ACT-R033-03) in your staging environment or controlled worksheet:

Scroll horizontally to see all columns.

Test ID Scenario setup Action executed in system Expected pass criteria Failure indicator
ACT-R033-01 Seed SKU-JACKET-OLIVE-M with 120 units on hand (velocity 0.5/day, DoC_OH = 240d) and an open unshipped purchase order PO-2026-9104 for 80 units (cost ₹1,400.00/u). Attempt to publish a 40% clearance markdown (₹1,680.00) on SKU-JACKET-OLIVE-M in the pricing engine. System blocks the markdown submission with an Active_Open_PO_Conflict error (PO-2026-9104: 80 units due) and routes the PO for cancellation/deferral first. System activates the 40% markdown while leaving the 80-unit (₹1,12,000.00) purchase order active for delivery.
ACT-R033-02 After cancelling the 80-unit PO, configure Mumbai hub with 120 units (0.5/day velocity, 20% local markdown margin ₹840.00/u) and Chandigarh store with 12 units (1.0/day velocity at full ₹2,800.00 MRP, transfer freight ₹65.00/u). Run the aged-inventory action queue recommender. Engine calculates Transfer_Net_Margin = ₹1,335.00/u > Markdown_Margin = ₹840.00/u (+₹495.00/u gain) and generates a 30-unit transfer order to Chandigarh before recommending a 20% markdown on the remaining 90 units in Mumbai. Engine skips inter-store transfer evaluation and recommends discounting all 120 units in Mumbai.
ACT-R033-03 Receive a partial shipment of 20 units on a SKU that already has 120 units aged >90 days (total 140 units at 0.5/day = 280 days cover). Run the weekly inventory ageing and action-queue report. Report evaluates total SKU-location cover (280 days across all 140 units) and keeps the entire SKU cohort in the high-priority action queue. Naive FIFO ageing report hides the 20 new units in the 'Fresh 0–30 Days' bucket and understates total SKU overstock.

Putting an aged-inventory action queue into practice

To stop funding inbound purchase orders on slow-moving products and recover higher margin from aged stock, execute these four steps this week:

  1. Join your Open Purchase Order table to your Aged Inventory report today: Never review 90+ day stock without displaying Open_On_Order_Units and Total_Forward_Days_of_Cover right next to On_Hand_Units.
  2. Institute a hard rule: zero clearance markdowns on SKUs with open unshipped POs: Require buyers to cancel, defer, or swap open inbound PO quantities before finance approves any clearance price reduction.
  3. Run a weekly cross-store transfer match before approving regional discounts: Check whether another climate zone or high-footfall store has <30 days of cover at full price and can absorb 20–30% of the aged stock profitably.
  4. Localize markdowns to the overstocked store or hub: Stop cutting prices nationwide when overstock is concentrated in one regional warehouse; preserve full MRP in stores where the SKU is selling on plan.

Discuss this workflow

If your merchandising team is discounting slow-moving inventory while open purchase orders keep delivering more of the same SKUs, NextEdge Labs can help you build an automated aged-inventory action queue.

START A CONVERSATION

Let’s talk about your next build.

Prepare your brief below, then review and send it in your email app to sales@nextlabsonline.com.

SELECTED INDUSTRYRetail & ecommerce

Article: Aged retail inventory: build an action queue by SKU and location · Inventory

THE FIRST CONVERSATION

Your product idea, AI opportunity or automation challenge—and a useful first milestone.

All fields are required.

A few sentences about the problem, your users and timing are enough.

We’ll use your details to respond to your enquiry. Please don’t include patient records, passwords or confidential information. Privacy Policy · Website Terms.

References

Sources checked 15 October 2026. Vendor documentation supports platform facts; the worked examples and diagrams are original.

About the author

Vikasraj Yadav writes about operational decisions, software and automation for NextEdge Labs.