Acumatica and EDI
Acumatica EDI integration
Acumatica ERP has no X12 or EDIFACT translator; in its own help, EDI appears only in the name of a carrier option. What it offers is a contract-based REST API, customer cross-references and separate actions to confirm a shipment and to invoice it. We build the X12 side to your Acumatica instance: 850s into sales orders, and 855, 856 and 810 out, mapped per trading partner, hosted and run for you.
What Acumatica does natively
Acumatica ERP has no X12 or EDIFACT translator. The full-text search of Acumatica's help, which covers releases 2026 R1 and 2026 R2, returns two results for "EDI" on 3 October 2026. Both are the Carriers form, where "EDI LTL - No Packing Changes" is a shipping option of a carrier integration. "EDIFACT" returns no results. What the product does ship are the parts an EDI integration writes to and reads from.
| Native part | What it is | What an EDI integration uses it for |
|---|---|---|
| Contract-based REST API | Entities and actions on the Default endpoint, version 26.200.001 in 2026 R2 | Creating sales orders, confirming shipments, preparing invoices |
| Item cross-references | Global, Customer Part Number, Vendor Part Number, Barcode and GTIN/EAN/UPC/ISBN alternate IDs, also per unit of measure | Resolving the item number in the 850 |
| Customer locations | Several delivery locations per customer | One location per retailer DC or store |
| Shipments (SO302000) | Confirmed separately from the invoice | Source of the 856 |
| License API limits | Sessions, concurrent requests, requests per minute | Pacing every call |
Commerce Edition adds connectors for store platforms and for selling on Amazon; none of them reads or writes X12. The retailer's documents, its version and qualifiers, the 997s and the mapping per partner are outside the product. This page is the Acumatica side of our EDI integration; the system itself is described on the Acumatica system page.
What sits between Acumatica and your trading partner
| Document | Direction | Acumatica record | Source of the content |
|---|---|---|---|
| 850 | In | Sales order, order type SO | The partner's file |
| 855 | Out | Sales order | Quantity per line after allocation |
| 856 | Out | Confirmed shipment | Lines, packages, carrier, tracking |
| 810 | Out | Invoice prepared from the shipment | Lines, tax, freight, terms |
| 846 | Out | Item quantities per warehouse | Available quantity per warehouse |
| 997 | Both | None | Kept in the integration per document |
For the 850 the mapping runs as follows, with PO 4500018236 from our document pages as the example:
| 850 element | Acumatica field | Rule |
|---|---|---|
| Sender ID, N1*BY | Customer ID | From a partner table; never created from the file |
| BEG03 | Customer Order Nbr. | Checked for an existing order of that customer before the PUT |
| N1*ST, N104 | Location ID | The retailer's DC code 0007 resolves to a customer location |
| PO1 UP 614141104826 | Inventory ID on the line | Through a GTIN/UPC or Customer Part Number cross-reference |
| PO102, PO103 | Order quantity and UOM | 24 EA to the item's sales unit |
| PO104 | Unit price | Compared with the price Acumatica determines |
The order is one request:
PUT /entity/Default/26.200.001/SalesOrder?$expand=Details
The body carries Customer ID, Location ID, order type SO and both lines under Details. The response holds the order number Acumatica assigned, which the integration stores next to the PO number so that the 855, 856 and 810 can return to the right order.
The technical reality of this pair
License limits. Each Acumatica license sets three numbers, shown on the License Monitoring Console (SM604000): the maximum number of API sessions, of concurrent API requests and of API requests per minute. Once the requests of the past minute reach 50% of the per-minute limit, each new request is delayed. Acumatica's own example: with a limit of 50 and 25 requests already processed, and 20 seconds left in the minute, every request waits 20 divided by 25, which is 0.8 seconds. A request is declined when more than 20 are queued or when one has waited longer than 10 minutes. The license limits are documented in Acumatica's integration guide.
What that means for a morning file. One 850 costs one PUT, plus lookups of the customer location and the cross-references when they are not cached. At the 50 requests a minute of Acumatica's example, 400 purchase orders are at least 400 divided by 50, which is 8 minutes, and with two lookups per order 1,200 calls, which is 24 minutes. Acumatica's own example of a decline: 50 requests arrive in one second at a license with 16 concurrent requests; 16 are processed, 20 wait in the queue and 14 are declined. The integration therefore keeps its own queue, sends at a pace below the limit and caches the lookups, and the 997 goes back to the retailer when the file is read, not when the last order is written.
Sessions. A client that signs in and does not sign out keeps its API session. An integration that leaks sessions locks out every other integration on the license; the trial license allows two. Acumatica lets an administrator cap the sessions per integration user on the User Types (EP202500) and Users (SM201010) forms, and the integration signs out after every batch.
Shipment and invoice apart. Shipment/ConfirmShipment and Shipment/PrepareInvoice are separate actions. The 856 goes out when the shipment is confirmed, and the 810 when the invoice is prepared and released, so each document is built from the record it describes.
What Acumatica and X12 store differently
- Alternate IDs are not checked for uniqueness. Acumatica's documentation says so in one sentence: "The system does not verify the uniqueness of alternate IDs in the system." Two items can carry the same barcode, and a lookup by that barcode is then ambiguous. The integration checks that a cross-reference points to one item before it uses it.
- Writing an alternate ID changes the cross-reference. When a new value is entered in the Alternate ID column of a sales order line, Acumatica "will create a new customer-specific alternate ID or replace the existing" one. An integration that sends the retailer's number in that column with a typo rewrites the customer's cross-reference. Ours sends the resolved Inventory ID instead.
- Inventory ID length. Acumatica advises that the INVENTORY segmented key be as long as the longest alternate ID, because partner IDs are often longer than planned inventory IDs. A 14-digit case GTIN does not fit a 10-character segment.
- Units. The 850 orders 24
EA. A retailer that orders cases sends 2CA; at 12 per case that is 24 units in the item's sales unit, and the 855 and 856 convert back to 2 cases. Cross-references per unit of measure let the case GTIN resolve to the case unit directly. - Ship-to. One retailer DC is one customer location. A store number or DUNS+4 that has no location is held, never written to the customer's default location.
When it goes wrong
| What happens | What the integration does |
|---|---|
| Acumatica delays requests above half the per-minute limit | The queue slows down; no request is sent that would be declined |
| A request is declined, or times out after the order was created | Before a retry, the integration looks up Customer Order Nbr. for that customer: one sales order |
| A cross-reference matches two items, or none | The order is held with the PO1 line; the rest of the file is written |
| A session cannot open because the license limit is reached | An alert, with the number of sessions in use |
| No 997 from the partner within its window | An alert, with the control number of the document that is waiting |
We build the integration to your Acumatica instance 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 writes nothing to Acumatica and sends nothing, and you approve the first documents. When a partner publishes a new guide or Acumatica changes the endpoint version, we change the integration. The store side is covered under Shopify Acumatica integration; the same work on other ERPs is under NetSuite EDI integration and Business Central EDI integration. Tell us which partners you trade with.
Frequently asked questions
Does Acumatica have built-in EDI?
No. A search of Acumatica's help for releases 2026 R1 and R2 returns two results for EDI, both on the Carriers form, where "EDI LTL - No Packing Changes" is the name of a shipping option of a carrier integration. EDIFACT returns none. The X12 translation, the envelopes and the mapping per partner run outside the ERP and use its API.
Which Acumatica API does an EDI integration use?
The contract-based REST API on the Default endpoint, version 26.200.001 in release 2026 R2. A sales order with its lines is created with one PUT on the SalesOrder entity, and shipments are confirmed and invoiced with the ConfirmShipment and PrepareInvoice actions of the Shipment entity.
Can an 850 use the retailer's item numbers?
Yes. Acumatica stores cross-references on the stock item: global alternate IDs, customer part numbers, barcodes and GTIN, EAN or UPC codes, and alternate IDs per unit of measure. The integration resolves the number from the 850 against them before it creates the order line, because Acumatica does not check that an alternate ID is unique.
Does the API limit of our license matter for EDI?
Yes. Each license sets a maximum number of API sessions, concurrent requests and requests per minute, and every EDI document causes several calls. Above half of the per-minute limit Acumatica delays requests, and it declines them when more than 20 are queued or one waits longer than 10 minutes. The integration paces its calls to stay under those numbers.
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