---
title: AI Agent for Excess Inventory and Dead Stock (2026)
description: Monday, the slow movers and the open PO. An agent recommends stop-buy before markdown. Aging at 180 days is still HITL. We are not publishing a recovery-rate KPI.
url: https://www.joinhorizon.co/blog/ai-agent-excess-inventory-dead-stock-ecommerce-2026/
datePublished: 2026-08-27T00:00:00.000Z
dateModified: 2026-10-28T00:00:00.000Z
author: palaniappan-p
category: AI Agents
tags: ecommerce, ai-agents, amazon-bedrock, bedrock-agentcore, inventory, generative-ai
---

# AI Agent for Excess Inventory and Dead Stock (2026)

> Monday, the slow movers and the open PO. An agent recommends stop-buy before markdown. Aging at 180 days is still HITL. We are not publishing a recovery-rate KPI.

Monday, dead stock shows up as a merchandising argument: slow movers, aging units, overstock next to an open PO, and "we'll discount it later" that becomes never. None of that needs a chat widget. It needs a **margin-aware action**, then a human who owns price.

**The job.** Stop buying what will not move, then exit units you already own, without an uncontrolled markdown.

**This week.** Rank stop-buy, transfer, bundle, promo, or liquidation from aging, cost, inbound, and channel velocity. Draft the matrix. Do not change live price.

**A person still signs.** Live PDP price, coupon codes, marketplace price, PO cancel, and liquidation shipments.

**Skip it** when an aging report plus a merchandiser already decides markdowns, and the bottleneck is photography or channel mix, not analysis. Also skip it if you cannot name a gross-margin floor.

This is part 23 of the **2026** field guide series. It consumes class **D** from the [inventory reorder brief](https://www.joinhorizon.co/blog/ai-inventory-agent-reorder-ecommerce-2026/). PO change still belongs with [purchase orders](https://www.joinhorizon.co/blog/ai-purchase-order-agent-ecommerce-2026/). Back-office task 2 is the parent [ops slice](https://www.joinhorizon.co/blog/ecommerce-back-office-automation-ai-agents-2026/). Aging buckets and GM% floors below are labels for you to replace. Dead ≥**180** days is still HITL. We are not publishing a recovery-rate study from a FactualMinds store.

Do not merge this prompt with reorder. Class A wants a draft PO. Class D wants to **stop** the next PO. One specialist with both write sets is how a markdown tool fires on a stockout SKU.

> **Copy the matrix:** Copy [`excess-inventory-action-matrix.md`](https://www.joinhorizon.co/examples/architecture-blog-2026/ecommerce-ai-agents-series/excess-inventory-action-matrix.md). Fill **Margin floor** and **Owner**. Ship gates: [`monday-checklist.md`](https://www.joinhorizon.co/examples/architecture-blog-2026/ecommerce-ai-agents-series/monday-checklist.md).

**Our take:** recommend **stop purchasing first**, then transfer, bundle, promo, liquidation, and never an uncontrolled markdown. The trade-off is that stock sits longer than it would under a cowboy 40% off. You also avoid training shoppers to expect a coupon on every slow SKU.

## Automate first

If ERP already flags "no sale in 90 days" and merch has a markdown calendar, **do not wrap that in an agent** until the calendar fails (inbound ignored, GM% not computed, ads still live). Rules own aging buckets. The agent joins cost, open POs, and channel velocity and **drafts** the next action.

Shopify Flow "if inventory > N then tag" is not this job. Flow cannot compute post-discount GM% against an open PO. Flow keeps the tag, the agent makes the recommendation, and merch sets the price.

## The matrix

From the [artifact](https://www.joinhorizon.co/examples/architecture-blog-2026/ecommerce-ai-agents-series/excess-inventory-action-matrix.md):

| Action | When | Auto? |
| ------ | ---- | ----- |
| Stop purchasing | Overstock or dead; open PO exists | Recommend; PO change HITL |
| Channel transfer | Sells elsewhere, sits on DTC | Transfer ticket HITL |
| Bundle | Complementary SKU still moving | Draft; merch publish HITL |
| Promo / discount | Aging; GM% after discount ≥ floor | Price write HITL |
| Liquidation | Dead; floor cannot be met | Always HITL |

**Never auto:** live PDP price, coupon codes, marketplace price, PO cancel, liquidation shipment.

```mermaid
flowchart TD
  AgingInventory[Aging Inventory]
  AIAgent[AI Agent]
  ActionMatrix[Action Matrix]
  MerchApproval[Merch or Buyer Approval]
  ExitAction[Stop Buy Transfer Bundle Promo Liquidate]
  AgingInventory --> AIAgent
  AIAgent --> ActionMatrix
  ActionMatrix --> MerchApproval
  MerchApproval --> ExitAction
```

If cost is missing, refuse the markdown path. Recommend stop-buy only.

Margin is a **tool result**. The matrix should compute GM% at the proposed % off from unit cost + current price. If cost is `unknown`, the only legal recommendation is stop purchasing (and defer inbound). Bundles need a complementary SKU that still has velocity. Two dead items bundled together is not merchandising.

Channel transfer is a ticket, not a price write: move units, keep landed cost, let the destination channel's price list apply. Marketplace repricers stay out of this agent.

## Production shape

Bedrock = model. Harness or Runtime = host. Gateway + Cedar on every price and PO write. Browser off. Next.js can be the merch approval UI, not the runtime. Strands is not the VPC.

| Piece | Role |
| ----- | ---- |
| Gateway | Position, velocity, aging, cost, open POs, optional channel stock |
| Policy | DENY `updatePrice`, `createDiscount`, `cancelPurchaseOrder` except merch/buyer JWT |
| Identity | Shopper tokens never see this specialist |
| Observability | Markdown drafts vs actual price writes; PO-change attempts |

No native Shopify connector. Attach Admin, PIM, or ERP as **your** OpenAPI.

```text
# From excess-inventory-action-matrix.md — fill floors for your store
Slow-moving 45–89d → stop replenishment first
Aging 90–179d → promo/bundle/transfer if GM% ≥ floor
Dead ≥180d → liquidation candidate, still HITL
Overstock + open PO → defer/cancel PO before markdown
```

Week-one evals: inbound ETA inside 14 days blocks markdown-first; GM% below floor fails even if aging is 180d; `updatePrice` on a shopper JWT must DENY.

## What broke

> **What broke:** Sample turn recommended **40% off** on `SKU-HOOD-GRY-XL` because aging was 112 days. An open PO for 40 units had ETA in five days; GM% at −40% was below the 30% floor the prompt mentioned but Policy never encoded. **Detection:** eval required `getOpenPurchaseOrders` + post-discount GM%; the turn had neither in the tool trace. **Fix:** matrix order is stop-buy / defer PO, then margin-checked promo; Cedar DENY `updatePrice`; merch HITL. **Lesson:** aging without inbound and cost leads to discounting next week's receipt.

## What to do this week

1. Clone [`excess-inventory-action-matrix.md`](https://www.joinhorizon.co/examples/architecture-blog-2026/ecommerce-ai-agents-series/excess-inventory-action-matrix.md). Set a **GM% floor** with finance in the room.
2. Keep the aging report if it already works. Add the agent only to join cost + open POs.
3. Read tools only: position, velocity, aging, cost, open POs.
4. Harness or Runtime; Policy **`LOG_ONLY`**. Prove DENY on `updatePrice`.
5. Eval: inbound PO must block a markdown-first recommendation.
6. Price the job on the [AgentCore pricing calculator](https://www.joinhorizon.co/tools/amazon-bedrock-agentcore-pricing-calculator/). Need Policy on price writes? [Contact us](https://www.joinhorizon.co/contact-us/), [Bedrock](https://www.joinhorizon.co/services/aws-bedrock/), [retail / eCommerce](https://www.joinhorizon.co/industries/aws-retail-ecommerce/).

Full ship list: [`monday-checklist.md`](https://www.joinhorizon.co/examples/architecture-blog-2026/ecommerce-ai-agents-series/monday-checklist.md).

## Where to encode the floor

Encode the **GM% floor and open-PO check** in the action matrix and in Cedar, not only in the prompt. Stop-buy before markdown.

## For your technical lead

**On June 17, 2026**, AgentCore Harness reached general availability ([What's New](https://aws.amazon.com/about-aws/whats-new/2026/06/amazon-bedrock-agentcore-harness-generally-available/)). **Agents Classic** is in maintenance for new customers after **July 30, 2026**. Net-new builds should not use Classic ([lifecycle](https://www.joinhorizon.co/blog/aws-service-lifecycle-updates-june-2026/)).

> **First-party signals we reuse (not eCommerce outcomes):** Gateway server-side tools cut median tool round-trip **~180 ms → ~95 ms** on a **B2B CRM assistant** (12 tools, ~8k turns/day), per the [Gateway post](https://www.joinhorizon.co/blog/amazon-bedrock-agentcore-gateway-server-side-tool-execution-2026/). Platform TCO silhouette: support-style AgentCore at **50K sessions/mo ~$791/mo** platform + model ([decision guide](https://www.joinhorizon.co/blog/aws-bedrock-agentcore-vs-amazon-q-enterprise-decision-guide-2026/)). Model your mix on the [AgentCore pricing calculator](https://www.joinhorizon.co/tools/amazon-bedrock-agentcore-pricing-calculator/).

## What this post doesn't cover

- Live offer engines and session-aware coupons (later merchandising posts in this series).
- Reorder class A/B/C: [inventory agent](https://www.joinhorizon.co/blog/ai-inventory-agent-reorder-ecommerce-2026/).
- Marketplace liquidation networks as first-party tools.
- Measured sell-through or GM$ recovered from a FactualMinds client. We have no published agent case study that claims dead stock cleared by a percentage.
- AgentCore Browser on a wholesale buyer portal.
- Classic Agents cutover.
- A native Shopify markdown app (it does not exist).

## FAQ

### When should we NOT use an AI agent for excess inventory?

Skip it when an aging report plus a merchandiser already decides markdowns, and the bottleneck is photography or channel mix, not analysis. Also skip it if you cannot name a gross-margin floor. An agent that "clears stock" with no floor is a liquidation bot you did not approve.

### What could go wrong if the agent auto-markdowns?

You discount a SKU that has inbound arriving this week, cut below cost, or fire a sitewide code while ads still spend at full price. Price writes, coupons, and marketplace prices stay HITL. Policy DENY `updatePrice` and `createDiscount` for non-merch tokens.

### What could go wrong if we liquidate without stopping purchase?

You sell through dead units at 20 cents on the dollar while a PO for the same SKU is still open. Every dead-stock row must read open POs. Recommend defer or cancel (buyer HITL) before you talk liquidation.

### How is this different from the reorder inventory agent?

Reorder asks what to buy. This agent asks what to stop buying and how to exit units you already own. Same Gateway family, different writes (price, transfer, PO change), different evals. Do not merge the prompts in week one. See [inventory reorder](https://www.joinhorizon.co/blog/ai-inventory-agent-reorder-ecommerce-2026/).

### Should excess-inventory work run on Harness or Runtime?

Harness is enough for a scheduled matrix with read tools plus draft recommendations. Use Runtime plus Strands if merchandising and purchasing specialists must not share write tools. Net-new builds should not use Agents Classic after July 30, 2026.

### Is there a native Shopify AgentCore connector for markdowns?

No. Price, discount, and transfer APIs are your OpenAPI or MCP targets on Gateway. Do not wait for a Shopify AgentCore markdown app.

## How the excess and dead stock stays bounded

Flag SKUs that are excess or dead from age and velocity.

- **Maturity:** Level 2 — reference architecture
- **Risk:** high
- **Oversight:** approval
- **Starts when:** An inventory review for aged stock.
- **Tools:** A write goes through a router, a permission check, a policy check, and a budget check. The model does not commit it. An approval token lives in tool context, not in the user message.
- **Stops for a person:** Markdowns, transfers, and writes to the catalog wait for a buyer or merchandiser.
- **Checked by:** The class cites units, age, and the rule. A missing age does not become zero.
- **Untrusted data:** Vendor emails urging a write-off.
- **If it fails:** If the excess and dead stock stops, name the reason: completed, budget_exceeded, timed_out, cancelled, guardrail_blocked, approval_required, tool_failure, verification_failed, or partial_completion. Retry a timeout at most twice. Back off on rate limits. After repeated verification failure, escalate. Stop when the budget is exhausted or a permission is denied. No unbounded loop. Markdowns, transfers, and writes to the catalog wait for a buyer or merchandiser.
- **Lifecycle:** Explore, then act, then confirm, then verify. Explore gathers the context for the excess and dead stock. Act stays reversible. Confirm stops before an irreversible step. Verify is a separate check of the outcome.

Reference architecture, not a published production deployment. The shared contract is the [AWS store-agent architecture](https://www.joinhorizon.co/blog/aws-ai-agents-for-ecommerce-factualminds-2026/#operating-contract).

## FAQ

### When should we NOT use an AI agent for excess inventory?
Skip it when an aging report plus a merchandiser already decides markdowns, and the bottleneck is photography or channel mix, not analysis. Also skip it if you cannot name a gross-margin floor. An agent that "clears stock" with no floor is a liquidation bot you did not approve.

### What could go wrong if the agent auto-markdowns?
You discount a SKU that has inbound arriving this week, cut below cost, or fire a sitewide code while ads still spend at full price. Price writes, coupons, and marketplace prices stay HITL. Policy DENY updatePrice and createDiscount for non-merch tokens.

### What could go wrong if we liquidate without stopping purchase?
You sell through dead units at 20 cents on the dollar while a PO for the same SKU is still open. Every dead-stock row must read open POs. Recommend defer or cancel (buyer HITL) before you talk liquidation.

### How is this different from the reorder inventory agent?
Reorder asks what to buy. This agent asks what to stop buying and how to exit units you already own. Same Gateway family, different writes (price, transfer, PO change), different evals. Do not merge the prompts in week one. See inventory reorder.

### Should excess-inventory work run on Harness or Runtime?
Harness is enough for a scheduled matrix with read tools plus draft recommendations. Use Runtime plus Strands if merchandising and purchasing specialists must not share write tools. Net-new builds should not use Agents Classic after July 30, 2026.

### Is there a native Shopify AgentCore connector for markdowns?
No. Price, discount, and transfer APIs are your OpenAPI or MCP targets on Gateway. Do not wait for a Shopify AgentCore markdown app.

---

*Source: https://www.joinhorizon.co/blog/ai-agent-excess-inventory-dead-stock-ecommerce-2026/*
