Revenue-Affecting Exceptions

Ordered, Not ASN'd ordered_not_asnd
60 days from PO date 850 → (missing 856)

A PO line has no matching 856 ASN. Supplier did not ship — or shipped without sending an ASN. Triggers OTIF chargeback for the full line value.

Why it matters

Retail OTIF programs penalize suppliers when an ASN is absent before the delivery window closes. The retailer's WMS cannot receive the shipment without an ASN, converting a potential revenue event into a chargeback.

Dollar impact
ordered_qty × unit_price
Partner patterns
  • Walmart — ASN required before 10am on ship date; any miss is an immediate OTIF trigger
  • UNFI — ASN optional on promo lines but breaks inventory visibility when absent
  • KeHE — Multi-stop 856 with O-level HL loops; key resolution falls back to BOL
Example
PO 850-2024-001 (Walmart) — 24 cases SKU-GRANOLA-6PK @ $47.50 = $1,140
No 856 found within the match window → ordered_not_asnd: $1,140 at risk
Shipped, Not Invoiced shipped_not_invoiced
60 days from invoice date 856 ASN ↔ 810 Invoice

The 856 ASN shows more units shipped than the 810 invoice covers. Revenue left uncollected — goods delivered but not billed.

Why it matters

Systematic underbilling compounds into material revenue leakage. After the 60-day window, the retailer has little obligation to reconcile the gap, turning an accounting error into a permanent write-off.

Dollar impact
abs(shipped_qty − invoiced_qty) × unit_price
Partner patterns
  • KeHE — REF*IA (internal account) on 810; missing it orphans the invoice from the PO
  • UNFI — Credit + rebill on 3rd order creates a temporary shipped_not_invoiced gap
Example
PO 856-2024-012 (KeHE) — 24 cases shipped
810 invoice covers 20 cases → shipped_not_invoiced: 4 cases × $47.50 = $190 unbilled
Short Pay short_pay
30 days from payment date 810 Invoice ↔ 820 Remittance

The 820 remittance shows a payment lower than the 810 invoice. Retailer deducted from the invoice — earned or unauthorized. Shortest dispute window of any exception class.

Why it matters

Short pays are the most time-sensitive exception. At 30 days from the 820 date, the dispute window is half of most chargeback windows. Unauthorized deductions not disputed within the window become permanent write-offs.

Dollar impact
abs(invoice_amount − paid_amount)
Partner patterns
  • UNFI — Every 3rd 820 omits REF*PO — invoice number is the only match key
  • Walmart — High deduction volume; reason codes in REF segments must be decoded before disputing
Example
810 invoice WMT-INV-055: $1,140.00 for 24 cases
820 remittance: $898.50 paid
→ short_pay: $241.50 deducted, 30-day dispute window
UoM Mismatch uom_mismatch
60 days 850 ↔ 856 ↔ 810 (unit divergence)

The unit of measure in the PO (850 PO1) does not match the ASN (856 IT1) and normalization cannot resolve the divergence. The document counts look plausible — the units don't.

Why it matters

UoM mismatches are stealth errors. Both documents may say '24' but one means cases and the other means eaches. A 12-count case pack means the retailer ordered 288 units but received 24 — a 12× gap invisible without unit normalization.

Dollar impact
abs(ordered_vs_shipped_delta) × unit_price
Partner patterns
  • Walmart — 850 PO1 in CA (cases); 856 IT1 in EA (eaches) — Walmart eaches quirk
  • UNFI — SLN promo segment uses different UoM than the line item PO1
Example
850 PO: 24 CA (cases) SKU-GRANOLA-6PK (case_pack = 6)
856 IT1: 24 EA (eaches)
Normalized: 24 cases ordered vs 4 cases shipped
→ uom_mismatch: 20-case delta × $47.50 = $950 exposure
Quantity Mismatch qty_mismatch
60 days 850 ↔ 856 (after UoM normalization)

After UoM normalization, ordered and shipped quantities diverge beyond tolerance. Units agree; the supplier simply shipped a different quantity than ordered.

Why it matters

Short-ships create OTIF exposure and may trigger vendor compliance chargebacks. Overshipments can result in unauthorized deductions or warehouse refusal. Distinguished from uom_mismatch: here the units agree, the quantities don't.

Dollar impact
abs(ordered_qty − shipped_qty_normalized) × unit_price
Example
850 PO: 48 cases SKU-OAT-BARS-12CT
856 ASN: 36 cases shipped (short-ship)
→ qty_mismatch: 12-case variance × $47.50 = $570 chargeback exposure
852 Sell-Through Gap 852_discrepancy
852 Product Activity ↔ 856 shipped (period)

Distributor sell-through (852) does not reconcile with quantities shipped in the same period. Either a forecasting problem (stockout) or a reporting problem (stale 852 data).

Why it matters

For brands selling through UNFI or KeHE, the 852 is the only visibility into what is actually moving off distributor shelves. A systematic sell-through gap signals inventory building, stockouts, or corrupted reporting — none visible without this reconciliation.

Dollar impact
abs(sell_through_qty − shipped_qty) × avg(unit_price)
Partner patterns
  • UNFI — 852 sent weekly; ASNs are event-driven — week-boundary effects
  • KeHE — 852 aggregates multi-DC inventory; per-DC ASNs can create apparent gaps
Example
UNFI 852 (week of 2024-02-05): 96 cases SKU-GRANOLA-6PK sold
856 ASNs in same period: 120 cases shipped
→ 852_discrepancy: 24-case gap (destock or return risk)

Operational Exceptions

No dollar impact — transmission integrity and SLA compliance.

Missing 997 ACK missing_997_ack
Outbound transaction → (missing 997)

An outbound document (856 ASN, 810 invoice) was transmitted but no 997 functional acknowledgment was received within 48 hours. The document may have been dropped, rejected, or failed to reach the VAN.

Why it matters

Without a 997 ACK, the supplier cannot confirm the trading partner received the document. A dropped 856 means the retailer's WMS will refuse the physical shipment at dock. A dropped 810 means the payment cycle never starts.

Partner patterns
  • Walmart — 997 SLA is 24 hours; any delay triggers AS2 retransmission requirement
  • UNFI — 997 sometimes omitted for test ISA envelopes — filter by ISA11 qualifier
Example
856 ASN sent to KeHE — ISA control 000000042
No 997 received within 48 hours
→ missing_997_ack (operational, $0 dollar impact)
   Check VAN delivery logs; retransmit if no delivery confirmation

Quick Reference

Exception class Documents Dollar impact formula Dispute window
ordered_not_asnd 850 → (missing 856) ordered_qty × unit_price 60 days from PO date
shipped_not_invoiced 856 ASN ↔ 810 Invoice abs(shipped_qty − invoiced_qty) × unit_price 60 days from invoice date
short_pay 810 Invoice ↔ 820 Remittance abs(invoice_amount − paid_amount) 30 days from payment date
uom_mismatch 850 ↔ 856 ↔ 810 (unit divergence) abs(ordered_vs_shipped_delta) × unit_price 60 days
qty_mismatch 850 ↔ 856 (after UoM normalization) abs(ordered_qty − shipped_qty_normalized) × unit_price 60 days
852_discrepancy 852 Product Activity ↔ 856 shipped (period) abs(sell_through_qty − shipped_qty) × avg(unit_price) None — velocity signal
missing_997_ack Outbound transaction → (missing 997) $0 — operational only None

Full documentation: catalog/failure_patterns.md — dbt models: transforms/models/marts/fct_exceptions.sql