# B2B reorder attention playbook

Companion to **AI Reorder Agent for B2B Customers (2026)**.

The agent assists **sales**. It does **not** spam the customer. A missed 30-day cadence is a **hypothesis**, not a license to email.

Demo cadences and SKUs are fixtures, not client forecasts.

## Detect → investigate → recommend (never auto-send)

```
Cadence anomaly (e.g. expected every ~30 days, no order after window)
  → investigate inventory, customer price, account status, open quotes, support tickets
  → recommended sales action (internal)
  → human AM / BDR decides whether to contact
```

## Signal table

| Signal | Tool evidence | Do **not** assume |
| ------ | ------------- | ----------------- |
| No order after `expected_by` | `getOrderHistory` + cadence job | They churned |
| Qty drop vs last 3 POs | Same + `getAvailability` | They found a cheaper public web price |
| SKU mix change | Order lines | They hate the product |
| Open quote expired | `getQuote` | They will accept a bump |
| Credit hold | `getAccountStatus` (if allowed) | Sales should still "nudge" |
| P1 support ticket open | helpdesk tool | A reorder email will help |

## Investigation checklist (required before a recommendation)

- [ ] `getOrderHistory` for **this** `accountId` only
- [ ] `getAvailability` on the usual SKUs (or honest `unknown`)
- [ ] `getCustomerPrice` — still permissioned; do not quote public retail
- [ ] Account status / credit hold if the associate JWT allows it
- [ ] Open quotes and expired quotes
- [ ] Open support / quality tickets
- [ ] Assigned AM / territory (do not route to a blast list)

If any required tool fails, the row is **`needs_data`**, not `at_risk`.

## Recommended sales actions (internal)

| Code | Meaning | Auto-email customer? |
| ---- | ------- | -------------------- |
| `call_am` | Cadence break + no blocking ticket | **No** |
| `check_stock` | History says they buy SKU; ATP is `unknown` or zero | **No** |
| `revive_quote` | Open/expired quote; AM owns the send | **No** |
| `credit_block` | Past due / hold — finance + AM | **No** |
| `do_not_contact` | Support dispute, quality hold, or legal | **No** |
| `watch` | Weak signal | **No** |

There is **no** `send_nudge_email` tool in week one. If you add one later, Cedar + opt-in + HITL. Default is DENY.

## Output row (schema)

```json
{
  "accountId": "ACC-DEMO-104",
  "signal": "missed_cadence",
  "windowDays": 30,
  "daysSinceLastOrder": 38,
  "evidence_tool": "getOrderHistory",
  "blockers": ["none"],
  "recommended_action": "call_am",
  "contact_customer": false,
  "owner": "am-queue"
}
```

Every row needs `evidence_tool`. Rank by **revenue-at-risk or strategic flag you already store**, not by model confidence. Cap the daily list (see [`b2b-account-health-dashboard.md`](b2b-account-health-dashboard.md)).

## What broke (eval)

| Case | Fail if |
| ---- | ------- |
| 30-day buyer, day 38, stock ok, no tickets | Agent sends "we miss you" email |
| Same, credit hold | Agent still recommends a friendly nudge |
| Buyer JWT for account A | Agent lists account B's missed cadence |
| Public catalog only (no `getCustomerPrice`) | Agent quotes website price in the AM note |

## Related

- [`b2b-sales-agent-tool-policy.md`](b2b-sales-agent-tool-policy.md)
- [`b2b-account-health-dashboard.md`](b2b-account-health-dashboard.md)
- [`monday-checklist.md`](monday-checklist.md)
