Blog

Your 856 is a pure function of your data

An EDI 856 is not a file you maintain. It is a deterministic projection of your carton records. Once you see it that way, generation and transport separate, and the chargebacks that come from a drifting ASN stop.

17 September 2026

Ask most import teams where their EDI 856 comes from and you get a description of a transport: a value-added network, an AS2 connection, a mapping tool. That describes how the document travels. It says nothing about how the document is made, and the making is where the quality lives.

The useful mental model is that an 856 is a pure function of your data. Given the same carton contents, the same destinations and the same routing guide, the correct 856 is determined. There is no judgement in it, no negotiation, no free text. It is a deterministic projection of records you either have or do not have.

The 856 is an output, not an input

This sounds obvious and it is routinely violated. When an 856 is assembled by hand, or patched after the fact, it becomes an input: a document someone maintains. The moment that happens, it can drift from the carton. The quantity on the 856 and the quantity in the carton become two facts that have to be kept in agreement by a person, at volume, under time pressure.

Treat the 856 as an output and the drift cannot start. It is generated from the pack record at the point the cartons are closed, and it either matches the cartons or the pack is wrong. There is no third state in which the document and the goods quietly disagree.

Generation and transport are separate problems

Generation is: read the carton record, apply the retailer's guide, emit a valid 856. Transport is: move those bytes to the retailer's system over whatever pipe they accept, AS2, SFTP, a VAN or an API. These are different jobs with different failure modes, and collapsing them is a mistake.

A transport failure is an infrastructure event. A generation failure is a data event, and it is the one that produces chargebacks, because the retailer receives a well-formed document that disagrees with the goods. Keeping the two separate means a network outage is an outage, and a data problem is a data problem, and you can see which one you have from the alert alone.

Why the split matters at retail scale

At retail scale the volume of documents is high and the tolerance for error is low. If generation is a function, it is testable: for a given pack record and guide, the output is fixed, so it can be asserted before you ever connect to a retailer. A test suite for an ASN generator is a set of input records and expected documents, which is exactly the kind of thing a machine checks better than a person.

If generation is a manual process, it is not testable, only audited, and an audit runs after the goods have shipped. That is too late to be a control. It is a diagnosis.

What this means for your stack

If your 856 is generated from a source of truth that also produced the SSCC, you have one fewer reconciliation in the chain. If it is generated somewhere else, you have a reconciliation, and reconciliations fail at the rate of the least careful hand in the process. The cheapest way to stop ASN-driven chargebacks is to make the document a function rather than a file, and to keep the pipe that carries it boring.

It also changes who debugs a failure. When generation is a function, a bad ASN is a bad input, and the fix is a data fix at the source. When generation is a process, a bad ASN is a mystery, and the fix is an apology and a credit. The first is cheap and repeatable. The second is neither.

Related reading: Pre-ship ASN validation  ·  The agent surface  ·  Integrations  ·  What causes a chargeback

See the 856 generated from a real pack.

We will show an ASN built from carton contents, and the checks that run before it is ever transmitted.