An EDI 810 is the invoice a supplier sends against your purchase order, and it is the document your three way match depends on. This page maps the BIG header, the IT1 line loop, the ITD payment terms, the SAC allowances and charges and the TDS totals to spreadsheet columns, explains the implied decimal that makes an 810 total look a hundred times too small, and shows which BIG07 codes mean the file is a credit memo rather than a bill. It also covers the supplier invoices that arrive as PDFs instead of X12, which on most desks is the larger half.
Submit your purchase orders
Drop documents here, or click to file
Up to 50 files per batch
Uploading...
An 810 looks like the easiest transaction set in the family. It has a header, some lines and a total. The trouble is that the total and the lines are not written in the same numeric convention, and three optional fields decide whether the document is even a bill.
TDS amounts are element 610, declared N2, which means two implied decimal places and no decimal point in the file. TDS*152000 is $1,520.00. Unit prices in IT104 are element 212, declared R, an ordinary decimal. One document, two conventions.
BIG07 carries the transaction type code, and CR is Credit Memo, CN is Credit Invoice, DR is Debit Memo. Twenty invoice related codes share the same envelope. A parser that ignores BIG07 turns a supplier credit into money you pay twice.
BIG04 is where the PO number belongs, and it is an optional element. Some suppliers put it there, some put it in a REF, some only at line level. Matching logic written against one partner breaks on the next.
BIG08 is the transaction set purpose code, where 07 means Duplicate and 01 means Cancellation. Resent invoices are supposed to say so. Almost no home grown parser reads that element, so the resend becomes a second payable.
SAC01 is the allowance or charge indicator: A is an allowance, C is a charge, P is a promotion, S is a service. Summing SAC amounts without branching on that one character nets freight against a rebate and produces a plausible, wrong number.
CTT02 is summed without regard to decimal points or signs and truncates from the left when it overflows. A mismatch tells you something moved. It never tells you which line, and it is not evidence that an amount is wrong.
PurchaseOrders is a document extraction tool. It reads purchase orders, order confirmations and supplier invoices that arrive as PDFs, scans or email attachments and returns the header plus every line as clean columns. It is not an EDI translator and it does not sit on your AS2 connection. If your partner already sends X12, your translator writes the 810 and this page is the reference for reading what it produced. If half your suppliers email a PDF invoice instead, this is the tool that puts both halves in the same sheet.
Invoice number, invoice date, purchase order number and terms at the header, then one row per line with quantity, unit price, part number and extended amount. Line those up with your translator output and the two channels merge without a mapping exercise.
Quantities, unit prices and line amounts arrive as numeric columns with the decimal already where it belongs, so a variance against the order is a formula rather than a person reading two documents side by side.
No template to build per vendor and no coordinate mapping. A one page invoice from a machine shop that looks nothing like a distributor statement returns the same fields, which is the practical difference from per vendor template tools.
Every line comes back separately with its own quantity, price and part number. A header only capture can reconcile a total but it cannot tell you which line was billed at the wrong price.
Upload a folder of supplier invoices and get one sheet, so a quarter of PDF paperwork becomes a report you can match against your open purchase orders.
Take the output in whatever shape the next step wants, including a JSON payload when the match runs in code rather than in a spreadsheet.
The BIG segment is the first thing a parser should read and the last thing most home grown parsers look at properly. It is mandatory, it appears once, and four of its ten elements decide how the rest of the document should be treated. Two of those four are optional, which is exactly why invoices post wrong.
| Element | Number | Name | Requirement | What it means in practice |
|---|---|---|---|---|
| BIG01 | 373 | Date | Mandatory | The invoice date, CCYYMMDD. This is the date your terms clock starts from unless ITD02 says otherwise |
| BIG02 | 76 | Invoice Number | Mandatory | The supplier invoice number, up to 22 characters. Your duplicate check keys on this plus the vendor |
| BIG03 | 373 | Date | Optional | The purchase order date, not a second invoice date. Useful for confirming you matched the right order revision |
| BIG04 | 324 | Purchase Order Number | Optional | The PO number. Optional in the standard, required by almost every buyer trading partner specification |
| BIG05 | 328 | Release Number | Optional | The release against a blanket order, which is how a call off invoice identifies itself |
| BIG06 | 327 | Change Order Sequence Number | Optional | Ties the invoice to a specific revision of the order rather than the original |
| BIG07 | 640 | Transaction Type Code | Optional | Invoice, credit memo, debit memo, rebill, partial bill. The single most consequential element on the document |
| BIG08 | 353 | Transaction Set Purpose Code | Optional | 00 Original, 01 Cancellation, 07 Duplicate. A resend is supposed to declare itself here |
Notice which fields the standard leaves optional. BIG04 is how the invoice finds its order, BIG07 is how you know it is a bill rather than a credit, and BIG08 is how you know it is not a resend, and all three can legitimately be absent. A trading partner specification will usually require them. The X12 standard does not, so a file that omits all three is technically valid and will pass a 997 without complaint.
BIG07 uses element 640, the transaction type code. Roughly twenty of its values describe invoices, and they are not interchangeable labels for the same thing. Four of them mean money flows toward you rather than away.
| Code | Meaning | What it should do to your ledger |
|---|---|---|
| DI | Debit Invoice | An ordinary payable. This is the common case |
| CR | Credit Memo | Reduces what you owe. Posting it as an invoice pays the supplier twice |
| CN | Credit Invoice | Also a credit. Two codes exist because different industries adopted different terms |
| MC | Material Credit Invoice | A credit tied to returned or rejected material |
| DR | Debit Memo | An additional charge outside the original invoice, often freight or a claim reversal |
| AI | Adjusted Invoice | Replaces a previously sent invoice. Read BIG08 as well before you post it |
| RE | Rebill | The same charge sent again after a correction. A duplicate check on invoice number alone will miss it |
| PB | Partial Bill | Part of an order billed early. The line quantities will not match the PO and that is correct |
| FB | Final Bill | Closes out a partially billed order. Receiving one without the earlier partials is a red flag |
| PP | Prepaid Invoice | Already paid. Posting it creates a payable for money that left last month |
| PA | Progress Payment Invoice | A milestone bill on a project order, not a goods shipment |
| DO | Drop Shipment Invoice | Goods that never touched your dock, so there is no receipt to match against |
The drop shipment case deserves a moment because it quietly defeats a three way match. A DO invoice has no goods receipt at your location, so a matching rule that waits for a receipt will hold the invoice forever while the supplier chases payment. Our note on drop ship purchase orders covers how the order itself has to be flagged for this to work.
Every billed line is one IT1 segment, and everything about that line hangs below it. The part that surprises people writing their first parser is that the product identifier is not one field. It is a repeating qualifier and value pair, and there can be twelve of them.
| Element | Number | Name | Type | Note |
|---|---|---|---|---|
| IT101 | 350 | Assigned Identification | AN | The line number. Optional, and suppliers do not always keep it aligned with your PO line numbers |
| IT102 | 358 | Quantity Invoiced | R | A real decimal. Compare against the ordered quantity, not against the shipped quantity on the 856 |
| IT103 | 355 | Unit or Basis for Measurement Code | ID | Two characters, EA, CA, LB and so on. A unit mismatch against the order is a price variance in disguise |
| IT104 | 212 | Unit Price | R | An explicit decimal, unlike the totals in TDS. Up to 17 characters |
| IT105 | 639 | Basis of Unit Price Code | ID | Whether the price is per each, per hundred, per thousand. Ignoring it multiplies your variance by a hundred |
| IT106 to IT125 | 235 and 234 | Product ID Qualifier and Product ID | ID and AN | Repeating pairs: BP buyer part, VP vendor part, UP UPC, and so on. Read the qualifier, then take the value |
Match lines on the product identifier rather than on IT101. Suppliers consolidate two of your PO lines into one invoice line when the part and price are identical, and they split one line into two when part of it shipped from a second warehouse. Position based matching breaks on both. The same discipline applies when reading the order side, which is why our purchase order line item extraction page returns one row per line with the part number attached rather than a header summary.
TDS is the summary total, and all four of its elements are element 610, declared in the X12 dictionary as N2. N2 means two implied decimal places written with no decimal point in the file. This is the single most common cause of an 810 that reconciles to a number a hundred times too large or too small.
| Element | Requirement | Definition |
|---|---|---|
| TDS01 | Mandatory | Total amount of invoice including charges and less allowances, before any terms discount |
| TDS02 | Optional | The amount the terms discount is calculated on, which is not always the full invoice |
| TDS03 | Optional | The amount due if you pay by the discount due date |
| TDS04 | Optional | The terms discount amount itself |
So TDS*152000*152000*148940*3060 is an invoice of $1,520.00 with a discount of $30.60 leaving $1,489.40. Every value in that segment carries the implied decimal. IT104 in the same file does not, because element 212 is declared R. A parser that applies one rule to the whole document gets one of the two wrong, and because both results look like plausible money, nothing alerts.
TDS01 is also defined as the total after allowances and charges. If you are reconciling line extensions to TDS01 and coming up short, look for SAC segments before you look for a missing line.
ITD is where the discount and the due date live, and it is worth reading properly because early payment discounts are usually the cheapest yield in accounts payable. ITD01 is the terms type code, element 336, which has more than sixty values. These are the ones you will actually see.
| ITD01 | Meaning |
|---|---|
| 01 | Basic |
| 02 | End of Month, so the clock starts at month end rather than the invoice date |
| 05 | Discount Not Applicable |
| 08 | Basic Discount Offered |
| 12 | 10 Days After End of Month |
| 14 | Previously agreed upon, which means the terms are in your contract and not in this file |
| 22 | Cash Discount Terms Apply |
| 23 | Payment Due Upon Receipt of Invoice |
The discount itself can arrive in ITD03 as a percent, in ITD04 as a discount due date, in ITD05 as a number of days, in ITD07 as net days, or in ITD08 as a flat amount, and every one of those is optional or conditional. Two suppliers can express identical two percent ten net thirty terms with completely different element combinations. Terms type 14 is the one that catches people out: it means the terms exist, but not in this document, so a routine that reads ITD and finds nothing concludes there is no discount when there is.
Freight, handling, promotional allowances and rebates arrive as SAC segments, at header level or line level or both. SAC01 is element 248, and it is one character that flips the sign of everything after it.
| Code | Meaning |
|---|---|
| A | Allowance, which reduces the amount owed |
| C | Charge, which increases it |
| N | No Allowance or Charge, informational only |
| P | Promotion |
| Q | Charge Request |
| R | Allowance Request |
| S | Service |
Summing SAC amounts without branching on SAC01 nets a freight charge against a volume rebate and produces a number that looks reasonable and is wrong. The request codes, Q and R, are worse: they are proposals, not settled amounts, and treating them as posted allowances understates the payable. When a line disputes back and forth, that conversation usually happens in an EDI 824 application advice rather than on the invoice itself.
CTT01 is the number of line items, meaning the count of IT1 segments in the transaction set. Compare it to the number of rows your parser produced and a mismatch tells you a loop was dropped. CTT02 is the hash total, and the standard is explicit about how it is built: values are summed without regard to decimal points, explicit or implicit, and without regard to signs, and the result truncates from the leftmost digits if it overflows.
Two consequences follow. A hash mismatch means something changed, but it cannot tell you which line or whether the difference was a sign. And a hash match is weak evidence, because a credit and a charge of the same magnitude hash identically. Use CTT01 as the real integrity check and treat CTT02 as a transport level checksum, not as an accounting control. Note that CTT is optional in the 810 summary while TDS is mandatory, so an invoice with no line count at all is still a valid file and your parser has to cope with that rather than reject it. This is the same trap as reading a clean 997 functional acknowledgment and concluding the invoice was accepted. A 997 says the syntax parsed. It says nothing about whether the amounts were agreed.
If the point of the exercise is a sheet you can reconcile, this is the flattening that works: repeat the header on every line so the file is a normal table rather than a nested structure.
| Column | Source | Repeats per line |
|---|---|---|
| Invoice number | BIG02 | Yes |
| Invoice date | BIG01 | Yes |
| PO number | BIG04, falling back to REF | Yes |
| Document type | BIG07 | Yes |
| Purpose | BIG08 | Yes |
| Vendor | N1 loop with qualifier VN or SE | Yes |
| Terms code | ITD01 | Yes |
| Discount percent | ITD03 | Yes |
| Line number | IT101 | One per row |
| Quantity | IT102 | One per row |
| Unit | IT103 | One per row |
| Unit price | IT104 | One per row |
| Part number | IT106 to IT125 pairs, read by qualifier | One per row |
| Line allowance or charge | SAC at line level, with SAC01 kept as its own column | One per row |
| Invoice total | TDS01, divided by one hundred | Yes |
Keep BIG07 and SAC01 as their own columns rather than folding them into the amounts. The moment you bake a sign into a number you lose the ability to explain a variance to the supplier, and explaining it is most of the work. The same rule applies to the order side, which is why our EDI 850 to Excel converter page keeps the change and status codes as visible columns rather than resolving them silently.
The invoice is one leg of the match. The order is the 850, possibly amended by an EDI 860 purchase order change, and the receipt comes from your warehouse or from an EDI 945 warehouse shipping advice. Three practical rules save most of the arguing.
First, match quantity against the receipt and price against the order. Quantity variances are a receiving problem and price variances are a contract problem, and they route to different approvers. Second, apply tolerances per line, not per invoice: a total that falls inside tolerance can hide one line billed at double and another at half. Our note on purchase order tolerance works through where the thresholds usually sit. Third, if the order was amended after the goods shipped, match against the revision that was live at ship date. BIG06, the change order sequence number, is the field that tells you which revision the supplier billed against, and it is the reason that element is worth carrying through to your sheet.
The invoice that never arrives is its own category. If an 810 is late and the order is closed, the accrual has to come from the receipt rather than the bill, which is the situation our purchase order accrual note deals with.
Every buying desk has two invoice channels. The mapped partners send X12 and their invoices flow. Everybody else emails a PDF, and on most desks that is the larger group by count even when it is the smaller group by dollars. Those invoices get keyed by hand, which is where the cost and the errors live.
PurchaseOrders reads that half. Upload the PDF, the scan or the email attachment and it returns the same fields an 810 gives you, header and every line, as Excel, CSV or JSON. There is no template to build per supplier, so a one page invoice from a machine shop and a twelve page distributor statement both come back in the same columns. Line those up with your translator export and the two channels reconcile in one sheet instead of two processes. If you would rather push the data into a system than a spreadsheet, the purchase order API returns the same structure as JSON, and bulk purchase order upload clears a backlog of a few hundred documents in one pass.
Which one is right depends on whether this is one file you need to read today or an invoice channel you have to reconcile every week.
| Route | Best for | What it takes | Watch out for |
|---|---|---|---|
| EDI translator export | Ongoing 810 volume from mapped partners | Your existing translator writing a CSV or a database drop | Most translators apply the implied decimal on TDS for you and some do not, so verify one known invoice against the paper copy before you trust the column |
| ERP invoice inquiry | Invoices that already posted | Running the AP inquiry and exporting it | You see what your ERP accepted, not what the supplier sent, so a rejected or held 810 is invisible in this view |
| Parse it yourself | A few predictable partners | Split on the terminator and element separator, branch on BIG07 and BIG08, walk the IT1 loop, then divide TDS by one hundred | The BIG07 branch and the TDS decimal are the parts that have to be right. The splitting is the easy half |
| Excel text to columns | Almost nothing | Data then Text to Columns using the element separator | Produces one wide row per segment rather than one row per line, so the IT1 loop never becomes rows and SAC lands in the same columns as pricing |
| PurchaseOrders | Supplier invoices that arrive as PDFs rather than X12 | Uploading the document | It reads documents, not X12, so it is the other channel rather than a replacement for the translator |
Element numbers and data types in this table come from the X12 004010 dictionary: TDS amounts are element 610 declared N2, IT104 unit price is element 212 declared R.
This is the path for the invoices that do not arrive as X12, which for most buying desks is every supplier except the largest handful.
Drop in the PDF, the scan or the email attachment. Multi page invoices and a batch of mixed suppliers are both fine.
Tip: Start with the suppliers that bill most often, because that is where a price variance repeats fastest.
Invoice number, purchase order reference, dates, terms and every line come back together, so you can see a quantity or price variance before the invoice is approved for payment.
Tip: Compare the line count to the purchase order the same way a translator compares CTT01 to the IT1 count.
Take the columns in whatever shape the match wants, matching the layout your EDI drop already writes so both channels reconcile in one sheet.
Tip: Keep the invoice number and the PO number as separate columns. Merging them is what makes a credit memo impossible to trace later.
An EDI 810 is the X12 transaction a supplier sends to bill you for goods or services already ordered, normally against a purchase order sent as an EDI 850. It carries an invoice number and date in the BIG segment, one IT1 loop per billed line with quantity and unit price, payment terms in ITD, allowances and charges in SAC, and the invoice total in TDS.
An 850 is the purchase order you send to buy something and an 810 is the invoice the supplier sends to be paid for it. They are different transaction sets with different segments: the 850 uses BEG and PO1, the 810 uses BIG and IT1. The link between them is BIG04, the purchase order number carried on the invoice.
BIG04, element 324, is the purchase order number on an 810. It is an optional element, so some suppliers leave it empty and put the reference in a REF segment or only at line level instead. Any matching routine has to check BIG04 first and then fall back, because a single rule fails across partners.
Because TDS amounts use element 610, which the X12 dictionary declares as N2: two implied decimal places, written with no decimal point. TDS*152000 means $1,520.00. Unit prices in IT104 use element 212, declared R, which carries an explicit decimal. Divide the TDS values by one hundred and leave IT104 alone.
Read BIG07, the transaction type code. CR is Credit Memo, CN is Credit Invoice, MC is Material Credit Invoice and DR is Debit Memo, alongside ordinary values like DI for Debit Invoice. The element is optional, so when it is absent check whether the amounts are negative before you assume the file is a bill.
You can open the raw file, but Text to Columns gives you one wide row per segment rather than one row per invoice line. The IT1 loop, the SAC allowances and the ITD terms all end up in the same columns as each other. Getting usable rows means walking the loops, which is a script or a translator job rather than a spreadsheet one.
ITD carries the payment terms. ITD01 is the terms type code, where 08 is Basic Discount Offered, 05 is Discount Not Applicable, 02 is End of Month and 23 is Payment Due Upon Receipt of Invoice. The discount itself can be expressed as a percent in ITD03, a due date in ITD04, days in ITD05 or a flat amount in ITD08, and all of them are optional.
No. PurchaseOrders reads documents, not X12. It extracts supplier invoices, purchase orders and confirmations that arrive as PDFs, scans or email attachments and returns them as Excel, CSV or JSON columns that line up with your EDI output. For X12 translation you need a translator or a VAN, and this page is the reference for reading what it produces.
Match on BIG04 to the PO number first, then match lines by the product identifier in IT106 through IT125 rather than by line position, because suppliers renumber and consolidate lines. Compare IT102 against the ordered quantity and IT104 against the contracted price separately, since a quantity variance and a price variance need different approvals.
The purchase order this invoice bills against, flattened to rows.
The acknowledgment, with all 26 ACK01 status codes.
The purchase order change, with all 31 POC02 change codes.
The warehouse pair, 940 shipping order and 945 shipping advice.
The general EDI to spreadsheet guide, delimiters and envelopes.
The reverse direction, document to EDI ready data.
Turn an invoice or order into a plain spreadsheet.
Delimited output for building an import file.
Line level accuracy, one row per item.
The same fields as JSON for a scripted flow.
Clear an invoice backlog in one pass.
Built for high order volume buying desks.