QuickBooks and EDI
QuickBooks EDI integration
QuickBooks Online and QuickBooks Desktop have no X12 or EDIFACT in them, and QuickBooks Online has no sales order. A retailer's 850 becomes an estimate or an invoice through the QuickBooks Online API, with the PO number in a custom field, and the 855, 856, 810 and 846 are built from those records and the item quantities. We build that layer per trading partner, host it and run it.
What QuickBooks does natively
Neither QuickBooks edition has an X12 or EDIFACT translator. What each one ships is the accounting side that an EDI flow writes to and reads from, and the two editions differ on the record an order becomes.
| QuickBooks Online | QuickBooks Desktop | |
|---|---|---|
| API | REST accounting API, JSON | qbXML through the Web Connector |
| Who starts an exchange | The integration, at any time | The Web Connector, on its schedule |
| Record for an 850 | Estimate or invoice; no sales order | Sales order, Premier and above |
| PO number | One of up to three custom fields | Field on the transaction |
| Shipment data | ShipDate, TrackingNum, ShipMethodRef on the invoice |
Ship date and ship method on the invoice |
| Stock | One QtyOnHand per inventory item |
Per item |
A supplier that trades with a US retailer still needs the 850, 855, 856 and 810 in X12, with the retailer's version, qualifiers and pack hierarchy. That part runs outside QuickBooks. This page is the QuickBooks side of our EDI integration; the system itself is covered under QuickBooks integrations.
Which QuickBooks record each document becomes
| Document | Direction | QuickBooks Online record | What it takes from there |
|---|---|---|---|
| 850 | In | Estimate, TxnStatus Pending |
Customer, lines, PO number in a custom field |
| 855 | Out | Estimate | Quantities after the stock check |
| 856 | Out | Invoice | ShipDate, TrackingNum; cartons and SSCCs from packing |
| 810 | Out | Invoice | DocNumber, lines, totals, terms |
| 846 | Out | Item | QtyOnHand minus open estimates |
| 997 | Both | None | Kept in the integration per document |
An estimate converts to an invoice and the two stay linked through LinkedTxn, with the estimate's status moving to Closed. That link is how the integration finds the invoice that answers a given PO when the 810 is due.
How an 850 becomes an estimate
PO 4500018236, the example used on our document pages, orders 24 units of item 10482 at 12.50 and 16 units of item 10499 at 8.75. Item 10499 has 12 free, so the estimate carries 24 and 12 and the 855 confirms the same:
{
"CustomerRef": { "value": "58" },
"TxnStatus": "Pending",
"CustomField": [
{ "DefinitionId": "1", "Type": "StringType", "Name": "PO Number", "StringValue": "4500018236" }
],
"ShipAddr": { "Line1": "HARBOR RETAIL DC 07", "Line2": "1200 DOCK STREET",
"City": "COLUMBUS", "CountrySubDivisionCode": "OH", "PostalCode": "43215" },
"Line": [
{ "DetailType": "SalesItemLineDetail", "Amount": 300.00,
"SalesItemLineDetail": { "ItemRef": { "value": "31" }, "Qty": 24, "UnitPrice": 12.50 } },
{ "DetailType": "SalesItemLineDetail", "Amount": 105.00,
"SalesItemLineDetail": { "ItemRef": { "value": "32" }, "Qty": 12, "UnitPrice": 8.75 } }
]
}
24 times 12.50 is 300.00 and 12 times 8.75 is 105.00, so the estimate totals 405.00, the merchandise total on the 810. When the goods ship, the invoice is created from the estimate with the ship date and tracking number, and the 810 adds freight of 18.50 and a 2% trade discount of 8.10 for a total of 415.40.
The technical reality of this pair
Request limits. The QuickBooks Online API allows 500 requests per minute per company (realm ID) and 10 requests per second per company and app. A batch request carries up to 30 operations, and batch requests are throttled at 40 per minute per company and app. Above the limit the API returns 429; Intuit asks to wait 60 seconds before retrying, and any request that runs longer than 120 seconds times out. A morning file of 120 purchase orders is 120 estimates: 4 batch requests of 30, well inside the limits. The integration waits the full 60 seconds after a 429 and holds the rest of the file in the queue.
Stock. An estimate does not reduce QtyOnHand; the invoice, or a sales receipt, does. Open EDI orders held as estimates are therefore still counted as on hand. The diagram shows item 10499.
The integration keeps the open estimates per item and subtracts them before it confirms a line in the 855 or reports a quantity in the 846. Which stock a partner sees is set per partner; see which stock counts.
Desktop. With QuickBooks Desktop, the Web Connector polls the integration's web service at an interval set in minutes and carries qbXML both ways. No firewall port is opened, and nothing reaches QuickBooks between two runs. An interval of 15 minutes means an 850 waits up to 15 minutes before it becomes a sales order, which the 855 timing has to allow for.
What QuickBooks and X12 store differently
- Item identity. The 850 sends a UPC in PO107. A QuickBooks Online item has a
Nameof up to 100 characters, unique and without colons, and aSkuof up to 100 characters; there is no UPC field. The integration keeps the lookup from UPC or case GTIN to the item ID. - Units. A sales line has
QtyandUnitPriceand no unit of measure. 2CAwith 12 per case is 24 on the estimate, and the 855, 856 and 810 convert back to 2 cases. See units of measure. - Invoice number.
DocNumberholds up to 21 characters and BIG02 up to 22. QuickBooks assigns the next number when custom transaction numbers are off; a duplicateDocNumberis accepted only withinclude=allowduplicatedocnum, which the integration never sends. - Cartons. An invoice holds a ship date, a ship method and one tracking number. The HL loop of an 856 needs cartons, their contents and an SSCC per carton, which come from packing or the 3PL.
When it goes wrong
| What happens | What the integration does |
|---|---|
| A UPC in the 850 has no item | The order is held with the PO1 line shown; no estimate is created |
| The same PO arrives twice | The custom field already holds this PO for this customer: held, no second estimate |
| QuickBooks returns 429 | The queue waits 60 seconds and continues |
| A request times out after 120 seconds | Before a retry, the integration searches for the PO: one estimate |
| The partner rejects an 810 with a 997 | AK3 and AK4 are shown with segment and element; the corrected invoice goes out under a new control number |
Every document has a status in the dashboard, with the raw file and the QuickBooks record it became or came from.
We build the integration to your QuickBooks company and your trading partners, host it and run it, for a fixed build price and a monthly fee. A new partner starts as a dry run that creates nothing in QuickBooks and sends nothing, and you approve the first documents. With a store in front of QuickBooks, see Shopify QuickBooks integration; the same model on a larger ERP is under NetSuite EDI integration. Tell us which retailer asked you for EDI.
Frequently asked questions
Does QuickBooks have native EDI?
No. QuickBooks Online exchanges JSON through its accounting API and QuickBooks Desktop exchanges qbXML through the Web Connector; neither reads or writes X12 or EDIFACT, sends a 997 or keeps control numbers. The translation, the envelope and the acknowledgments run outside QuickBooks, and the integration writes the business data through the API.
Where does an EDI purchase order go in QuickBooks Online?
QuickBooks Online has no sales order. Intuit's API schema marks the SalesOrder entity as QuickBooks Desktop only, Premier and above. In QuickBooks Online the 850 becomes an estimate, which is converted to an invoice when the goods ship, or it becomes an invoice straight away when orders ship the same day.
Can the retailer's PO number be stored on the invoice?
Yes, in a custom field. A QuickBooks Online invoice or estimate carries up to three custom fields configured for the company, and the integration writes the PO number into one of them. The 810 then carries the PO number from that field, and the retailer matches the invoice to its order.
Does it work with QuickBooks Desktop?
Yes, through the Web Connector, a Windows application on the QuickBooks machine or its network that exchanges qbXML with a web service on a schedule. Desktop Premier and above has sales orders, so the 850 becomes a sales order and the invoice follows it. The Web Connector starts every exchange, so orders arrive at the interval it runs, not the moment the 850 arrives.
Can QuickBooks Online hold stock per warehouse for the 846?
An inventory item in the QuickBooks Online API has one QtyOnHand. An 846 that reports per ship-from location needs the quantity per location from a warehouse system or a 3PL, and the integration reads it there.
Tell us what you need
Tell us which systems you use and what needs to work better. We reply personally within one working day. We help you define the work, then agree the price and timing before you commit.
- You know the price and the timeline before you commit to anything
- We work out the connection that takes the work off your hands
- We handle the build, hosting, monitoring and maintenance
- Your team has less information to retype and fewer discrepancies to chase