ml-connector
Oracle JD EdwardsAvalara

Oracle JD Edwards and Avalara integration

Oracle JD Edwards EnterpriseOne runs your financials, procurement, and distribution. Avalara calculates and records sales and use tax across jurisdictions. Connecting the two sends each posted sales and purchase document from JD Edwards to AvaTax so tax is determined the same way on every invoice without anyone keying rates by hand. Customers and items flow across as well, so exemption status and tax codes line up with what your ledger already holds. ml-connector handles the very different access models on each side and moves the data on a schedule you control.

How Oracle JD Edwards works

Oracle JD Edwards EnterpriseOne is on-premises, so each customer runs its own AIS Server and there is no shared base URL. It exposes data through the AIS REST gateway under /jderest/v2/: a read-only data service over F-tables for AP vouchers (F0411), customers (F03012), items (F4101), and GL accounts (F0901), plus named Orchestrator endpoints for reads and writes. Authentication is a session token obtained by posting JDE credentials, then sent in the jde-AIS-Auth header on every call. JD Edwards has no native outbound webhooks, so changes are found by polling tables with a date filter on the updated date.

How Avalara works

Avalara AvaTax REST v2 is a cloud tax service reached at a fixed base URL, with a separate sandbox host. It authenticates with HTTP Basic auth using a numeric account ID and a license key, Base64-encoded on every request. Its central object is the transaction, created with a type such as SalesInvoice or PurchaseInvoice and a set of lines carrying amount, item code, and tax code along with ship-from and ship-to addresses. AvaTax is synchronous and returns the calculated tax inline. It has no vendor, purchase order, payment, or GL account objects and no outbound webhooks, so those values are passed as string references and any reconciliation is done by polling.

What moves between them

The flow runs from Oracle JD Edwards into Avalara. ml-connector polls posted sales and purchase documents from JD Edwards through the AIS data service and posts each one to AvaTax as a SalesInvoice or PurchaseInvoice transaction for tax calculation and recording. Customer records move the same direction to support exemption tracking, and item records carry their tax codes so each line is classified correctly. Cadence follows a schedule you set, typically aligned to your posting cycle, because neither system pushes events. Avalara holds no vendor, GL, or payment data, so ml-connector never writes financial entries back into JD Edwards.

How ml-connector handles it

ml-connector stores both credential sets encrypted. On the JD Edwards side it accepts the full AIS Server URL, JDE username and password, environment, and role per customer, requests a session token, and renews it when AIS returns HTTP 444 for an invalid token, which happens whenever the AIS Server restarts. On the Avalara side it sends the account ID and license key as HTTP Basic auth and selects the sandbox or production host by environment. Because neither side has webhooks, it polls JD Edwards tables on a date filter and tracks the last-polled timestamp between runs. Each JDE document number becomes the Avalara transaction code, so a retried post uses createOrAdjust to update the same uncommitted transaction rather than create a duplicate; once a transaction is committed its code is reserved. Item tax codes and customer codes are mapped first so every line carries a valid tax code and addresses are resolved before calculation. AIS uses an IP allowlist, so the connector's egress addresses must be added or calls return HTTP 405, and Avalara returns HTTP 429 when rate limited, so the connector backs off and retries. Every record carries a full audit trail and can be replayed if a post fails.

A real-world example

A mid-sized industrial distributor runs Oracle JD Edwards EnterpriseOne for procurement, inventory, and finance, and sells into a dozen states with mixed taxability. Before the integration, staff looked up tax rates by hand and keyed them onto sales invoices, and the use tax on inbound purchases was estimated at month-end, which drew questions in every audit. With Oracle JD Edwards and Avalara connected, each posted sales document is sent to AvaTax for an exact rate by jurisdiction, purchase invoices are sent as PurchaseInvoice transactions so use tax is self-assessed automatically, and exemption certificates tie to the right customers. The manual rate lookups stop and the tax position is consistent and defensible.

What you can do

  • Send posted Oracle JD Edwards sales documents to Avalara as SalesInvoice transactions for exact tax by jurisdiction.
  • Send JD Edwards purchase documents as PurchaseInvoice transactions so use tax is self-assessed automatically.
  • Sync JD Edwards customers and items so exemption status and Avalara tax codes line up with your ledger.
  • Bridge the JD Edwards AIS session token, renewed on an invalid-token response, and Avalara HTTP Basic account ID and license key.
  • Use each JDE document number as the Avalara transaction code so a retry updates the same record instead of duplicating it.

Questions

Which direction does data move between Oracle JD Edwards and Avalara?
The flow runs from Oracle JD Edwards into Avalara. Posted sales and purchase documents, customers, and items move from JD Edwards into AvaTax for tax calculation and recording. Avalara holds no vendor, GL, or payment objects, so ml-connector does not write financial entries back into JD Edwards.
How does the integration handle JD Edwards having no webhooks?
JD Edwards EnterpriseOne does not push events to an external endpoint, so ml-connector polls the AIS data-service tables on a date filter and tracks the last-polled timestamp between runs. Avalara is also pull-only, which fits this design since the ERP is the trigger. Polling runs on a schedule you set, typically aligned to your posting cycle.
What stops a retried document from creating a duplicate tax record?
ml-connector uses each JD Edwards document number as the Avalara transaction code, which AvaTax treats as the idempotency key. A retry on an uncommitted transaction uses createOrAdjust to update the same record in place rather than create a new one. Once a transaction is committed its code is reserved, so the connector adjusts or voids instead of reposting.

Related integrations

Connect Oracle JD Edwards and Avalara

Free to use. Add your credentials, ping your real systems, and see if we fit.

Get started