Seven exception classes produced by the four-way EDI match engine — what triggers each, which documents diverge, and the dispute window governing remediation.
ordered_not_asnd
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.
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.
ordered_qty × unit_price
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
The 856 ASN shows more units shipped than the 810 invoice covers. Revenue left uncollected — goods delivered but not billed.
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.
abs(shipped_qty − invoiced_qty) × unit_price
PO 856-2024-012 (KeHE) — 24 cases shipped 810 invoice covers 20 cases → shipped_not_invoiced: 4 cases × $47.50 = $190 unbilled
short_pay
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.
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.
abs(invoice_amount − paid_amount)
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
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.
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.
abs(ordered_vs_shipped_delta) × unit_price
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
qty_mismatch
After UoM normalization, ordered and shipped quantities diverge beyond tolerance. Units agree; the supplier simply shipped a different quantity than ordered.
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.
abs(ordered_qty − shipped_qty_normalized) × unit_price
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_discrepancy
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).
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.
abs(sell_through_qty − shipped_qty) × avg(unit_price)
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)
No dollar impact — transmission integrity and SLA compliance.
missing_997_ack
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.
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.
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
| 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