EDI 997 Functional Acknowledgment: Reconciling Missing 997s Daily
For edi and integration analysts, it leads at shippers, 3pls and carriers · Understand the problem

EDI 997 Functional Acknowledgment: Reconciling Missing 997s Daily: Illustrative TMS–ERP order and invoice handoff review beside a warehouse floor; not a client facility.
Quick answer: edi 997 functional acknowledgment
An EDI 997 Functional Acknowledgment reports whether a receiver's translator accepted each transaction set in a functional group. Reconcile it daily: match AK1 group and AK2 set control numbers to GS06 and ST02 sent, alert on AK501 R or AK901 P within 60 minutes, and flag sets with no 997 after each document's agreed window.
TL;DR — what you’ll learn
- A 997 confirms syntax only, one per functional group; business refusals arrive in an 855 or 824, and 997s are never themselves acknowledged.
- AK501 values are A, E, M, R, W and X; only AK901 adds P, so a partially accepted group always hides at least one rejected set.
- Set overdue windows by document: about 60 minutes for 856 ship notices, 4 hours for 855s and 24 hours for 810 invoices, all illustrative.
- In the worked model, daily reconciliation avoids 80% of unread-rejection cost: about $31,325 a year for a US distributor and ₹9,26,688 for an Indian exporter.
Topics: edi 997 functional acknowledgment · 997 ak codes · overdue 997 alerts · 997 vs 999 vs ta1 · x12 acknowledgment reconciliation
All quantities, amounts, product codes and events are illustrative teaching examples.
The ship notice left the warehouse system at 16:42, the translator logged it as sent, and the integration dashboard stayed green. Next morning the trailer reached the customer's distribution centre with no advance ship notice on file, receiving scanned every carton by hand, and three weeks later a compliance deduction appeared on the remittance. The 997 that said "rejected" had arrived sixteen minutes after sending. Nobody read it.
A functional acknowledgment is only useful if someone compares it, every day, with what was sent. Reconcile each outbound transaction set against its 997 by partner, group control number and set control number, alert on rejections within the hour and on missing acknowledgments by an agreed deadline, and silent EDI failures become same-day fixes instead of month-end deductions.
- What this guide covers: what a 997 does and does not prove, how AK1 to AK9 map to your control numbers, the AK error codes, the TA1 and 999 alternatives, overdue windows and a daily reconciliation query.
- What it adds: a timestamped trace of a rejected ship notice, a worked cost of silent rejections in US ($) and India (₹), and a checklist for running the reconciliation every day.
What a 997 confirms about a functional group, and what it never does
A 997 confirms that the receiver's translator could parse your functional group and its transaction sets; it says nothing about whether the business accepted the content. The 997's own transaction set comments, in the 4010 text reproduced by the Health Industry Business Communications Council, say it reports syntactical analysis and does not report semantic meaning, such as the receiver's ability to comply with a request.
- One per group: there is only one 997 per acknowledged functional group, and its AK1 names that group. A 997 never acknowledges a single interchange or a single document on its own.
- No acknowledgment of acknowledgments: the same text says 997s shall not be acknowledged, and no 997 should report errors in a previous 997. Outbound 997s therefore never appear in your overdue list.
- Swapped sender codes: the 997's GS envelope exchanges the application sender and receiver codes of the group it answers, which is why routing rules that expect your own code in GS02 drop 997s into an error folder.
- Business rejection comes later: a purchase order can be syntactically perfect and still be refused. That answer travels in an 855 acknowledgment or an 824 application advice, not in the 997.
Reading AK1 to AK9 against your GS and ST control numbers
Every 997 can be matched to what you sent using three keys: the partner, the group control number and the transaction set control number. AK1 carries the functional identifier code and group control number of the group being answered, from your GS01 and GS06. Each AK2 carries a transaction set identifier and control number from your ST01 and ST02, in the order the sets were received.
AK5 closes each AK2 loop with AK501, the Transaction Set Acknowledgment Code. In the 5010 code list its values are A Accepted, E Accepted But Errors Were Noted, M Rejected because the message authentication code failed, R Rejected, W Rejected because assurance failed validity tests, and X Rejected because content after decryption could not be analysed. P is not an AK501 value.
- AK901 group code: uses the same letters plus P, Partially Accepted, At Least One Transaction Set Was Rejected.
- AK902 to AK904 counts: the number of sets in your GE01, the number the receiver got, and the number it accepted. AK903 lower than AK902 means sets went missing inside the group.
- AK905 to AK909 group errors: for example 4, group control number in header and trailer do not agree, and 5, number of included transaction sets does not match the actual count.
Partners differ on whether AK2 loops appear for accepted sets. Some translators, including Azure Logic Apps by default, generate AK2 loops only for rejected sets unless the agreement asks for all of them. Record that choice per partner, because it changes how a set with no AK2 should be read when the group status is P.
AK3, AK4 and AK5 codes that point to the faulty segment
When a set is rejected, the AK3 and AK4 segments tell you which segment and which element failed, so the fix rarely needs a phone call. AK3 gives the segment ID, its position counted from ST as 1, any bounded loop identifier and AK304, the segment syntax error code. AK4 gives the element position, the element reference number, AK403, the element error code, and a copy of the bad value.
Scroll horizontally to see all columns.
| Segment or element | Code and meaning | Usual cause in an outbound logistics map | First fix to try |
|---|---|---|---|
| AK304 | 1 Unrecognized segment ID | Segment from a newer version sent to a partner on 4010 | Check GS08 version against the partner profile |
| AK304 | 3 Mandatory segment missing | Empty source field suppressed a required segment | Default or block the source record |
| AK304 | 7 Segment not in proper sequence | Map emits DTM after a loop it belongs before | Correct segment order in the map |
| AK304 | 8 Segment has data element errors | See the AK4 lines that follow | Read AK403 for each AK4 |
| AK403 | 1 Mandatory data element missing | Carrier code or reference blank in WMS | Make the source field mandatory |
| AK403 | 5 Data element is too long | Order or load number longer than the element allows | Truncate by rule agreed with the partner |
| AK403 | 7 Invalid code value | Internal code passed without conversion | Add the value to the code cross-reference |
| AK403 | 8 Invalid date | Date computed from an unvalidated input | Validate dates before mapping |
AK502 to AK506 add set-level reasons. Code 5, one or more segments in error, accompanies most rejections with AK3 detail; code 3, header and trailer control numbers do not match, and code 4, segment count mismatch, point at the envelope builder rather than the data.
Outbound EDI monitoring in the translator should treat an X12 997 with AK501 code R, M, W or X, or AK901 code P or R, as a failure alert within 60 minutes, and store each AK3 segment position and AK4 error code so the analyst can correct the element before the partner's next cut-off.
TA1, 997 and 999 compared at three envelope levels
TA1 answers the interchange envelope, the 997 answers syntax inside a functional group, and the 999 adds conformance to a published implementation guide. A partner can ask for more than one. Knowing which level failed tells you whether to look at the transport and envelope settings, the map, or the implementation guide rules.
Scroll horizontally to see all columns.
| Acknowledgment | What it checks | Key codes | Where you meet it |
|---|---|---|---|
| TA1 Interchange Acknowledgment | ISA and IEA envelope: identifiers, dates, control numbers, separators | TA104 A, E or R; TA105 note codes such as 001 control number mismatch and 025 duplicate control number | Requested by ISA14 = 1; sent in its own ISA and IEA envelope |
| 997 Functional Acknowledgment | Syntax of each transaction set and the GS and GE group | AK501 A, E, M, R, W, X; AK901 adds P | Most retail, distribution and transport partners |
| 999 Implementation Acknowledgment | Syntax plus implementation guide rules, with situational context | IK3, IK4, IK5 and CTX; I-codes such as I5 implementation segments in error | Health care X12 5010 exchanges and some partners that publish guides |
The 999 matters to logistics teams that also serve health care customers. The Minnesota Department of Health adopted the 005010X231 implementation acknowledgment into rule in 2016 through its uniform companion guide. A logistics partner that sends a 999 instead of a 997 can still be reconciled with the same keys, because the 999 also uses AK1, AK2 and AK9.
Overdue windows by document type and who is alerted
An overdue window should be set by what the document must achieve before a physical event, not by a single global timer. A ship notice is worthless after the trailer arrives; an invoice can wait hours. The table gives illustrative windows and names who owns the alert and who may authorise a resend.
Scroll horizontally to see all columns.
| Outbound document | Illustrative 997 window | Alert goes to | Who authorises a resend |
|---|---|---|---|
| 856 Ship Notice | 60 minutes, and always before trailer arrival | Shipping supervisor and EDI analyst | Shipping supervisor |
| 855 Purchase Order Acknowledgment | 4 hours | Customer service lead | Order management manager |
| 810 Invoice | 24 hours | Accounts receivable lead | Credit and collections manager |
| 214 Shipment Status (carrier) | 2 hours | Carrier operations desk | Carrier EDI coordinator |
| 846 Inventory Advice | Before the next scheduled 846 | Inventory control lead | Inventory control lead |
| Any set from a partner on test status | No alert; log only | EDI analyst | EDI analyst |
Resends need a rule too. A corrected set should go out with new ST02 and GS06 control numbers, and the record should link the new set to the rejected one, otherwise the partner's duplicate check or your own reconciliation will treat it as a repeat. Our page on 846 inventory snapshot reconciliation and idempotency covers duplicate and replay handling for the inventory message itself; this one concerns the acknowledgment that sits above every message type.
The daily query that finds unacknowledged transaction sets
One query run on a schedule, and once each morning as a report, should classify every outbound set as accepted, rejected, pending or overdue. The logic has to handle partners that send AK2 loops only for rejected sets, because for them a missing AK2 inside a partially accepted group means accepted, not lost.
-- Classify every outbound transaction set that expects a 997 (last 7 days)
WITH sent AS (
SELECT o.partner_id, o.ts_code, o.gs06, o.st02, o.sent_at,
p.fa_window_min, p.ak2_for_accepted,
g.ak901, g.ak902, g.ak903, s.ak501
FROM edi_out_set o
JOIN edi_partner p ON p.partner_id = o.partner_id
LEFT JOIN fa_group g ON g.partner_id = o.partner_id AND g.ak102 = o.gs06
LEFT JOIN fa_set s ON s.fa_group_id = g.fa_group_id
AND s.ak201 = o.ts_code AND s.ak202 = o.st02
WHERE o.fa_expected = TRUE -- never TRUE for outbound 997s
AND o.sent_at >= now() - interval '7 days'
)
SELECT partner_id, ts_code, gs06, st02, sent_at,
CASE
WHEN ak501 IN ('A','E') THEN 'ACCEPTED'
WHEN ak501 IN ('R','M','W','X') THEN 'REJECTED'
WHEN ak901 IN ('A','E') THEN 'ACCEPTED_BY_GROUP'
WHEN ak901 = 'P' AND NOT ak2_for_accepted THEN 'ACCEPTED_IMPLIED'
WHEN ak901 = 'P' AND ak2_for_accepted THEN 'AK2_MISSING'
WHEN ak901 IN ('R','M','W','X') THEN 'REJECTED_BY_GROUP'
WHEN sent_at < now() - make_interval(mins => fa_window_min) THEN 'OVERDUE'
ELSE 'PENDING'
END AS fa_status,
(ak903 IS NOT NULL AND ak903 < ak902) AS sets_lost_in_group
FROM sent
ORDER BY fa_status, sent_at;
-- Daily acceptance rate R = sets ACCEPTED* / sets sent with fa_expected (target R >= 0.995)
Run the query every fifteen minutes for alerts and once at 07:00 for a report the EDI analyst signs off. Any row in REJECTED, REJECTED_BY_GROUP, AK2_MISSING or OVERDUE is an open exception until it is resent, written off with a reason, or explained by the partner. Our 204 load tender and 990 response timeout rules use a similar overdue ladder for a business response rather than a syntax one.
Daily 997 reconciliation joins each outbound X12 transaction set to the partner's AK1 group control number and AK2 set control number in the EDI translator log, treats sets without AK2 in a P group as accepted only for partners configured that way, and should keep the acceptance rate at or above 99.5%.
A rejected ship notice that surfaced weeks later as a deduction
Most silent EDI failures are not lost files; they are rejections that arrived on time and were never read. The trace follows one functional group of three ship notices from a US distributor to a retail customer, with the control numbers that let the failure be found.
- 4 Nov 2026, 16:42: The WMS releases three 856 ship notices in functional group 9150 (GS01 = SH); set 0417 covers a trailer of 14 pallets due at the customer's distribution centre at 06:30.
- 16:58: The 997 arrives: AK1*SH*9150, then AK2*856*0417 with AK3*DTM*4**8, AK4*2**8*20261131 and AK5*R*5, and finally AK9*P*3*3*2. The ship date was computed as 31 November.
- 17:00: The dashboard reads only AK9, shows P in amber, and an operator acknowledges the alert because two of three sets were accepted. Nobody opens the AK2 loop.
- 5 Nov, 06:30: The trailer arrives with no ship notice on file. Receiving scans every carton by hand, the appointment overruns by 90 minutes, and the cartons post a day late.
- 19 Nov: The customer's remittance carries a compliance deduction for the missing notice. Under daily reconciliation, set 0417 would have shown REJECTED at 17:00, the analyst would have fixed the date logic and resent the notice as a new set before 20:00.
Ship notice acknowledgment checks for X12 856 sets must read every AK2 loop and AK5 code, not only AK901, because a functional group returned as AK9*P*3*3*2 still contains one rejected set; alerting the shipping supervisor within 60 minutes leaves roughly 13 hours to resend before a 06:30 trailer arrival.
The date bug itself was found in an hour once someone read the AK4 line. The process failure was that a group-level P status was allowed to stand in for the status of each set. Our 856 ship notice hierarchy and error handling guide covers the ship notice structure that sets like 0417 must follow.
What silent rejections cost a US distributor and an Indian exporter
The cost of an unread rejection is mostly deductions and delayed cash, not EDI fees. The model compares a US distributor with an Indian exporter that sends X12 to US customers; the exporter's deductions are shown converted to rupees at its booking rate. Volumes, rates and the share avoided are illustrative.
Scroll horizontally to see all columns.
| Line | US distributor (USD) | Indian exporter (INR) | Basis |
|---|---|---|---|
| Outbound sets expecting a 997 each month | 6,000 | 2,000 | Translator log |
| Rejected and unread | 24 (0.4%) | 10 (0.5%) | Sample month before reconciliation |
| Ship notices among them, with deduction | 10 × $200 = $2,000 | 4 × ₹15,000 = ₹60,000 | Illustrative deduction per notice |
| Invoices among them, paid 30 days late | 8 × $14,500 at 9% a year = $858 | 4 × ₹9,80,000 at 10.5% a year = ₹33,830 | Value × rate × 30 ÷ 365 |
| Order acknowledgments reworked | 6 × 1.5 h × $45 = $405 | 2 × 1.5 h × ₹900 = ₹2,700 | Analyst and customer service time |
| Monthly cost of unread rejections | $3,263 | ₹96,530 | Sum of the three lines |
| Share avoided by same-day correction | 80% | 80% | Fixes before the physical or payment event |
| Monthly saving | $2,610 | ₹77,224 | Cost × share avoided |
| Annual saving | $31,325 | ₹9,26,688 | Monthly × 12 |
The twenty percent left are rejections found too late to matter, such as a ship notice for a trailer already unloaded. Shortening the alert window for 856 sets reduces that share more than any other change, which is why the ship notice row in the deadline table is the strictest.
Checks that run unattended and triage where software assists
Matching, classifying and alerting are fixed rules; deciding what caused a rejection and whether to resend is a person's call that software can speed up. Keep the classification logic in the query and away from any assistant, so the acceptance rate the analyst signs each morning is reproducible.
Scroll horizontally to see all columns.
| Task | Handled as | Rule applied or help offered | Who decides |
|---|---|---|---|
| Matching a 997 to sent sets by AK102 and AK202 | Fixed rule | Join on partner, group and set control numbers | Runs unattended |
| Classifying set status from AK501 and AK901 | Fixed rule | CASE logic with the per-partner AK2 setting | Runs unattended |
| Raising overdue alerts | Fixed rule | Window per document type from the partner profile | Alert owner in the deadline table |
| Detecting sets lost inside a group | Fixed rule | AK903 lower than AK902 | EDI analyst |
| Explaining an AK3 and AK4 pair in plain language | Software assists | Translate positions and codes into the field name in the source system | EDI analyst |
| Grouping a week of rejections by root cause | Software assists | Cluster by segment, element and error code | Integration lead |
| Drafting the note to a partner about a TA1 rejection | Software assists | Draft from TA105 note code and envelope values | EDI analyst before sending |
Putting 997 reconciliation into daily EDI operations
Start by switching every outbound flow to "acknowledgment expected" in the partner profile, then run the query in report-only mode for two weeks before turning on alerts. The checklist sets the conditions for each step. The wider set of messages these acknowledgments cover is listed across our logistics and supply chain library.
Scroll horizontally to see all columns.
| Step | Done when | Proof kept | Owner |
|---|---|---|---|
| Partner profile | Acknowledgment type, window and AK2 setting recorded for every partner | Profile export | EDI analyst |
| Inbound routing | 997s with swapped GS codes route to the right partner | Routing test log | Integration lead |
| Control number storage | GS06 and ST02 stored for every outbound set | Sample of translator records | Integration lead |
| Report-only run | Two weeks of daily reports reviewed and signed | Signed reports | EDI analyst |
| Alerts live | Rejections alert within 60 minutes; 856 alerts reach shipping | Alert test evidence | Shipping supervisor |
| Resend procedure | Corrected sets carry new control numbers linked to the original | Resend log | EDI analyst |
| Steady state | Acceptance rate at or above 99.5% for a month | Monthly trend | Integration lead |
For a review of how your translator, partner profiles and alerting handle acknowledgments, or for a monitoring build across many partners, the NextEdge RFP page lets you set out your partner count, message volumes and current tools.
Discuss this workflow
Describe your current systems, the recurring exception and the outcome you need. Keep shipment, customer and financial records out of the initial message.
Common operational questions
Practical answers for operations, engineering, and finance teams working on edi 997 functional acknowledgment in logistics & supply chain.
What does an EDI 997 functional acknowledgment actually confirm?
What is the difference between 997, 999 and TA1?
Why do some 997s have no AK2 loop for accepted documents?
How long should we wait before treating a 997 as overdue?
References
Sources checked 13 November 2026. US and India statutory authorities and vendor documentation support platform facts; the worked examples and diagrams are original.
- X12 - Transaction set index, 997 Functional Acknowledgment and 999 Implementation Acknowledgment (X12C)Purpose statements for the 997 and 999. Accessed 13 November 2026.
- X12 - Example 04, basic functional acknowledgment, partially accepted with detail (TR3 004010X363)AK3 and AK4 usage, AK5 R with code 5 and AK9 P with transaction set counts. Accessed 13 November 2026.
- Health Industry Business Communications Council - 997 Functional Acknowledgment, 004010HIBCC (2001)Reproduced 997 notes: syntax only, one 997 per functional group, AK2 order, exchanged GS application codes, and no acknowledgment of acknowledgments; GS01 code SH for the 856. Accessed 13 November 2026.
- Microsoft Learn - X12 997 acknowledgments and error codes (Azure Logic Apps)AK304, AK403, AK502 and AK905 code tables and the default of AK2 loops only for rejected sets. Accessed 13 November 2026.
- Microsoft Learn - X12 TA1 acknowledgments and error codes (Azure Logic Apps)TA101 to TA105 mapping to the ISA, TA104 A, E and R, and TA105 note codes including 001 and 025. Accessed 13 November 2026.
- Stedi - X12 release 5010 elements 717, 715, 618 and I13AK501 and AK901 code values, implementation codes I5 and I6, and ISA14 values 0 and 1. Accessed 13 November 2026.
- Minnesota Department of Health - Uniform Companion Guide v4.0 for the 005010X231 Implementation Acknowledgment (999)Adopted into rule by MDH on 23 May 2016. Accessed 13 November 2026.
- FMCSA — 49 CFR Part 395 Hours of Service & Electronic Logging Devices (ELD)US federal motor carrier dispatch and driver duty-status compliance mandate.
- ULIP & NIC GST E-Way Bill Portal — Unified Logistics & Rule 138 ComplianceIndian statutory goods-in-transit and multi-modal logistics verification framework.