An EDI 997 is an X12 functional acknowledgment: the receiver's translation system telling the sender, document by document, whether what it sent was accepted, accepted with errors, or rejected. It is the only receipt in the EDI chain that reports on the documents themselves. Almost every integration generates 997s automatically, parks them in a log, and reads them only when a customer calls — which is exactly when the cost of not reading them has already been paid.
What the 997 actually says
The 997 answers three questions, at three levels of the envelope.
Which group, which documents? AK1 identifies the functional group being acknowledged, by its group code and control number — the same numbers your outbound GS carried. AK2 identifies each transaction set inside it, by type and control number: AK2*940*0001 is the verdict for the 940 whose envelope said ST*940*0001. The join is mechanical and exact, which is what makes it possible to match a rejection back to the specific order it concerns.
What is the verdict? AK5, per transaction set, carries an acknowledgment code. The three that matter in practice:
| AK5 code | Meaning | What it implies |
|---|---|---|
| A | Accepted | Passed the receiver's syntax and structural validation |
| E | Accepted with errors | Accepted, but specific segments or elements failed checks and were flagged |
| R | Rejected | Not processed; the document has to be corrected and re-sent |
AK9, per group, carries the same verdict family at group level plus counts: sets sent, sets received, sets accepted.
What exactly failed? AK3 reports segment-level problems — which segment, at what position, with what syntax error. AK4 reports element-level problems inside a segment — which element position, which data element, and the error: required element missing, element too short, element too long, invalid code value. Together they are a diagnostic precise enough to fix the map without guessing.
Why nobody reads it, and what that costs
The 997 is automated end to end: generated by the receiver's translator, delivered by the VAN, consumed by the sender's translator. Nothing in that path requires a human, so in most setups nothing alerts one. Four silent-failure modes follow.
Rejections that accumulate without an owner. The AK5*R arrives, the translator logs it, the business system never sees the order, and the order does not move. In the retail 3PL program behind these pages, nobody tracked acknowledgments at all; rejections accumulated silently until a client called or a penalty letter arrived.
The missing acknowledgment nobody notices. No 997 is also a signal: the partner's translator is down, the VAN dropped the group, the outbound went nowhere. If your process treats silence as success, a transmission failure and a successful delivery look identical from your side. The fix is a response timeout on every outbound document — not a daily batch review, a per-document timer.
E verdicts tolerated into data loss. Accepted-with-errors means the document was processed with flagged defects — a dropped element, a truncated quantity. The business transaction proceeds on damaged data, and the damage surfaces later as an inventory mismatch or a short receipt, far from the AK4 that described it exactly.
Group-level comfort. AK9 says the group was handled; the AK5 lines say which sets inside it died. Dashboards that count group verdicts report green while individual orders fail. The unit of monitoring is the transaction set, never the group.
The effects compound beyond the lost orders. An unwatched rejection queue teaches the partner that your documents fail, and partner scorecards — the ones behind chargeback rates and allocation decisions — accumulate that history whether you see it or not.
The return path: how the 997 gets back to you
The acknowledgment travels back through the same plumbing the document went out on — VAN or AS2 — and the routing depends on the envelope. Whether a 997 comes back at all is set in the trading-partner agreement, not in the envelope; ISA14 only requests a TA1 interchange acknowledgment. The 997 that comes back names your group control number and your transaction control numbers exactly as sent; that matching is what lets a monitoring layer attribute verdicts to specific documents.
Three envelope-level failures belong in the catalog. The trading-partner agreement requires a response but nothing comes back — the partner's translator is configured not to acknowledge, or is down. The acknowledgment arrives with wrong control numbers — a partner-side defect that orphans the response: it exists, matches nothing, and your monitoring reads silence. Or acknowledgments sit in a VAN mailbox nobody polls, because the outbound flow and the acknowledgment consumer are two different queues owned by two different teams. From the business side, all three look identical: the document vanished.
997 vs 999: functional vs implementation acknowledgment
You may also meet the 999 implementation acknowledgment. It is standard in healthcare (HIPAA 5010) and rare in retail and logistics, where the 997 remains the norm on every version. If a partner does send 999s, the monitoring discipline is identical: timeout, verdict, owner.
What reading them looks like in production
Both engagements that ground this page arrived at the same shape.
In the retail program, the fix was specific and small: every outbound transaction got a response timeout, and rejections surfaced on the operations dashboard within 15 minutes, with a notification to the account coordinator (case C05). Not a new platform — a timeout, a dashboard, and a named human per account.
At a fulfillment hub moving 35,000+ shipments a day, the same discipline became an operating model: business signals on one dashboard — order throughput, carrier API latency, EDI success rates, scan frequency — with SLOs per critical flow, tiered on-call across three time zones, and P1 alerts routed and escalated within two minutes. Before that model existed, an interrupted EDI feed was discovered two to four hours later, when orders stopped moving. After it, P1 mean time to recovery fell from 45–90 minutes to 11, and critical-integration availability ran 99.6% against 94.1% the prior year (case C09).
The cost of the alternative is documented in the same casebook: a four-hour failure in the peak window at that hub stops outbound entirely and costs $80,000–$120,000 in SLA penalties; one overnight carrier-connectivity incident was caught early, avoiding an estimated $90,000 in SLA penalties (case C09). And unwatched integration failures do not need to be dramatic to be expensive — at a regional freight 3PL, a carrier API change ran unaddressed for three weeks, with the rating flow down and operations quoting by hand (case C01).
The minimum viable 997 discipline
Five items, none of them large:
- A response timeout on every outbound document, per document type and per partner.
- Any R verdict creates a work item with the AK3/AK4 detail attached, routed to a named owner.
- E verdicts are reviewed, not archived — they are data-loss events with a receipt.
- Missing acknowledgments escalate the same way rejections do.
- The unit of every count and alert is the transaction set, not the group.
This is the cheapest section of any EDI integration and the one most often absent, which is why it earns its own page. None of the five items is expensive; together they turn the 997 from an archived byproduct into what it actually is — the cheapest early-warning system in the stack. If you cannot say when your last 997 rejection happened and who fixed it, the two-week diagnostic will find out — $7,500, fixed scope, findings yours.
Written by the CrunchCode engineering team — the people who ran these integrations in production.