EDI 945 Reconciliation: 3PL Shipping Advice, Step By Step
Learn how to receive, validate and reconcile an EDI 945 warehouse shipping advice against your 940 order before generating the 856 ASN.
If your 3PL's warehouse management system talks X12 but your ERP only understands "shipment confirmed," you've probably already run into the gap this tutorial fixes. The EDI 945 warehouse shipping advice is the document that closes the loop on an outbound warehouse order: it tells you what actually left the dock, not what you asked the 3PL to ship. Get the reconciliation wrong and you build an 856 ASN on bad data, which means a retailer deduction with your name on it. Here's the workflow, segment by segment, including what to do when the 945 reports a short shipment or a unit-of-measure mismatch against the original 940.
What You Need Before You Start
You need three things in place before a 945 ever hits your inbound queue. First, a trading partner agreement with the 3PL that explicitly covers the 940/945 pair plus functional acknowledgments. Second, a WMS-to-EDI mapping for the outbound 940 that's already tested and live. Third, a working ISA/GS envelope over whatever connection the 3PL uses, VAN or AS2.
Most 3PLs run this loop through a mid-market EDI platform like SPS Commerce, TrueCommerce, or Cleo Integration Cloud, or they bolt an EDI translator onto their own WMS, Deposco, Infoplus Commerce, Körber, or Manhattan Active WM among them. Which platform sits on their side rarely matters to you. What matters is that the 945 they send back maps cleanly to the 940 you sent out, and that someone on your team actually reconciles the two before the ASN goes out the door.
Receiving and Validating the 945, Step by Step
This is the actual reconciliation sequence. Run it in this order, every time, before anything downstream fires.
- Confirm the 945 matches an open 940. The W06 segment carries the shipment identifier, dates, and purchase order reference, so match on shipment ID, depositor order number, and PO number before you process anything else. If the W06 PO reference doesn't tie back to an open 940, stop and investigate, don't assume it's a typo.
- Check the W12 Ship Status Code before touching quantities. This single code tells you whether you're looking at a clean reconciliation or a problem. CC means shipment complete, but CP, PR, and BP all mean something shipped short, and they mean different things. The fuller code list runs to over a hundred values, including BO for fully backordered and CU for a cancelled line, so don't hardcode just CC and CP in your mapping logic.
- Reconcile quantity shipped against quantity ordered, line by line. The W12 segment carries both figures plus the unit of measure, and EA for each is the common default, but the unit or basis for measurement code field can carry case packs, pallets, or other UOMs depending on how the 3PL's WMS cartonized the order. If the UOM on the 945 doesn't match the UOM you sent on the 940, do not assume a 1:1 quantity match. A 945 reporting "10 CA" against a 940 ordered in "10 EA" is not a clean fill, it's a tenfold variance waiting to blow up your ASN.
- Validate carrier and tracking data against your TMS. The W27 carrier detail segment carries the SCAC code and transportation method, and the MAN segment carries SSCC-18 or carton tracking numbers tied to the physical labels on the pallet. Cross-check both against what your carrier or TMS system has on file for that pickup before you trust the tracking number on the ASN.
- Send the 997 or 999 functional acknowledgment back to the 3PL. This isn't optional housekeeping. When a 945 goes missing days later and someone asks whether the 3PL ever sent it, the functional acknowledgment is the record that answers the question.
- Build the 856 ASN from the validated 945, not the original 940. This is the step people skip under deadline pressure, and it's the one that causes the most damage. The 945 is what typically precedes the 856 ASN and 810 invoice in the document chain, which means the ASN should reflect what was confirmed shipped, including any short-ship or substitution codes, not what you originally told the warehouse to pick.
How You Know It Worked
Three things have to be true simultaneously. The 945 line totals match what was physically scanned onto the trailer or against pallet counts. The 997/999 round-trips cleanly with no segment errors. And the downstream 856 ASN posts to the retailer's portal, whether that's Walmart Retail Link or an SPS Commerce Fulfillment connection, without triggering a quantity-variance rejection. If any one of those three fails, don't send the invoice yet. A clean 997 with a mismatched ASN is still a failure, it just takes longer to surface as one.
Failure Mode: The Short-Shipment 945
This is where the workflow earns its keep. When the W12 segment reports a ship status of CP, it means a partial shipment considered no backorder, so the balance will never arrive and the line should be closed. That's a materially different situation from BP, which means a partial shipment with a backorder expected to ship later. Confuse the two in your mapping logic and you'll either close a line that's still coming, or keep chasing a quantity that the 3PL has already told you it's never going to fulfill.
The corrective sequence when you see a short-ship status code:
- Hold the 856 ASN. Don't let it auto-generate from the original 940 quantities while the short-ship flag is unresolved.
- Confirm with the 3PL, by phone or ticket if the EDI data doesn't make it clear, whether a follow-on shipment is coming for that line.
- Amend the ASN and invoice quantities to match what the 945 actually confirmed, not what the 940 originally requested.
- Log the discrepancy against the depositor order number so it's traceable if a retailer deduction shows up weeks later citing a quantity variance.
The deeper issue here usually isn't technical, it's contractual. The 940 acceptance timestamp versus the 945 ship timestamp is your evidence when a chargeback dispute arrives, which only works if someone has actually defined, in the 3PL contract, who owns catching the short-ship before it becomes the brand's problem at the retailer. A lot of 3PL agreements are silent on this, and that silence is exactly where short-ships turn into unexplained deductions three weeks later.
Where This Fits With Carrier Execution
Once the 945 confirms what left the dock, carrier selection, rate shopping, and track-and-trace typically move to a separate layer rather than staying inside the WMS/EDI stack. A TMS or multi-carrier shipping platform picks up from here: MercuryGate, Descartes, Alpega, Uber Freight, Transporeon, and Blue Yonder operate at the enterprise end, while lighter connectivity tools like Cargoson, ShipStation/ShipEngine, Sendcloud, or Shippo handle the carrier-booking and tracking layer for mid-market shippers who don't want to maintain direct carrier integrations themselves. The 945's W27 and MAN data is often the first input these systems consume once the shipment is confirmed, so treat the 945 reconciliation as the handoff point, not an afterthought bolted onto the EDI side.
Common Mapping Mistakes to Avoid
A few patterns show up repeatedly in 940/945 implementations, and they're worth checking your own mapping against.
- Auto-generating the 856 ASN from the 940 instead of the confirmed 945. This is the single most common root cause of retailer quantity-variance chargebacks in a 3PL fulfillment setup.
- Missing MAN segment SSCC data. Retail compliance programs built around GS1 labeling mandates expect that SSCC-18 to be present and correct, and a 945 that drops it will fail downstream label audits even if the quantities reconcile perfectly.
- Letting 945 latency slip against an undefined SLA. Tie the 945 turnaround to carrier pickup time, not end-of-day batch processing, because a late 945 becomes a late ASN, and the brand's name is on the deduction when that happens, not the 3PL's.
Quick Reference: 945 Segment Cheat Sheet
| Segment | Name | What to check |
|---|---|---|
| W06 | Warehouse Shipment Identification | Shipment ID, depositor order number, PO reference, ship date |
| N1/N3/N4 | Name/Address/Geographic Location | Ship-to party and warehouse identity match the 940 |
| G62 | Date/Time | Pickup and ship dates line up with carrier pickup records |
| W27 | Carrier Detail | SCAC code and transportation method match your TMS |
| MAN | Marks and Numbers | SSCC-18 or carton tracking numbers present for every container |
| W12 | Warehouse Item Detail | Ship status code (CC/CP/BP/PR/BO/CU), quantity ordered vs. shipped, unit of measure |
| W03 | Total Shipment Information | Total units and weight reconcile against W12 line sums |
Bookmark this table. If you're building or auditing a 940/945 mapping this week, start with step 2 above, the W12 status code check, since that single field determines whether the rest of the reconciliation is routine or exception handling.