ml-connector
Epicor KineticAvalara

Epicor Kinetic and Avalara integration

Epicor Kinetic runs your ERP and finance. Avalara AvaTax calculates sales and use tax across jurisdictions. Connecting the two removes manual tax lookups and keeps every Epicor invoice taxed against current rates. When a sales invoice or AP purchase document is ready in Epicor Kinetic, ml-connector sends it to AvaTax for calculation, writes the tax amount back onto the Epicor document, and records the transaction in Avalara for reporting. ml-connector handles the different APIs on each side and runs on a schedule you control.

How Epicor Kinetic works

Epicor Kinetic exposes customers, items, sales orders, AP invoices, purchase orders, GL accounts, and vendors as OData v4 business object services such as Erp.BO.CustomerSvc and Erp.BO.APInvoiceSvc. The v2 URL is tenant and company specific, so there is no shared hostname, and every call carries Basic Auth credentials plus an API Key header, or an OAuth2 bearer token from Epicor IdP that still needs the API Key. Epicor has no native outbound webhooks, so changed records are read by polling a business object or a Business Activity Query with a date filter. Pagination uses OData $top and $skip in pages of 100.

How Avalara works

Avalara AvaTax exposes a transactions object as its core entity, plus companies, customers, items, tax codes, and exemption certificates, through a REST JSON API at rest.avatax.com with a separate sandbox host. Every call uses HTTP Basic Auth built from an account ID and a license key, with no OAuth for the calculation API. CreateTransaction is synchronous and returns the calculated tax inline, and the document code acts as the idempotency key. AvaTax does not push webhooks; its Notifications resource is pull only, and it stores no vendors, purchase orders, GL accounts, or payments, so those arrive as string references on transaction lines.

What moves between them

The main flow runs from Epicor Kinetic into Avalara. ml-connector polls Epicor for new or changed sales invoices and AP purchase documents, maps each to an AvaTax transaction of type SalesInvoice or PurchaseInvoice with addresses and a tax code per line, and posts it to AvaTax. AvaTax returns the calculated tax, which ml-connector writes back onto the Epicor invoice. Customer and item reference data flows the same direction so AvaTax has matching customer codes for exemption handling and item codes for tax codes. AvaTax holds no ERP master data, so nothing financial is written back from Avalara except the calculated tax amount.

How ml-connector handles it

ml-connector stores both credential sets encrypted and builds Avalara Basic Auth from the account ID and license key while presenting Epicor Basic Auth plus the API Key header on every Epicor call, refreshing an OAuth2 or token bearer when a call returns 401. Because Epicor is poll only, it queries the AP invoice and sales document business objects, or a Business Activity Query, with a date filter on the last sync timestamp rather than waiting for a push. Each Epicor document number becomes the AvaTax transaction code, so a retry hits createOrAdjust and updates the same transaction instead of creating a duplicate, and a committed transaction is never overwritten. Epicor customer and part codes map to AvaTax customer and item codes, and a tax code is set per line so taxable goods are not treated as exempt. Addresses are validated through the AvaTax resolve endpoint before calculation, since a bad address fails the tax call. AvaTax returns HTTP 429 when rate limits are hit, so ml-connector backs off with jitter and retries, and writes back to Epicor use the UpdateMaster pattern to keep GL lines intact. Every record carries a full audit trail and can be replayed if a downstream call fails.

A real-world example

A mid-sized industrial distributor runs Epicor Kinetic for order entry, purchasing, and finance, and ships to customers across many states. Before the integration, the billing team looked up tax rates by hand for each invoice and kept a spreadsheet of exemption certificates, which led to wrong rates on multi-state orders and a slow, error-prone filing process. With Epicor Kinetic and Avalara connected, every posted invoice is sent to AvaTax for an accurate rate based on the validated ship-to address, the tax is written straight back onto the Epicor invoice, and exempt customers are recognized from their AvaTax certificate. The manual lookups disappear and the recorded transactions feed Avalara reporting and returns.

What you can do

  • Send each posted Epicor Kinetic sales and purchase document to AvaTax and write the calculated tax back onto the invoice.
  • Use the Epicor document number as the AvaTax transaction code so retries adjust the same record instead of duplicating it.
  • Sync Epicor customer and part codes to AvaTax customer and item codes for exemption and tax code handling.
  • Validate ship-to addresses through AvaTax before calculation so bad addresses do not break the tax call.
  • Authenticate Epicor with Basic Auth plus an API Key and Avalara with an account ID and license key, with retries and a full audit trail.

Questions

Which direction does data move between Epicor Kinetic and Avalara?
The main flow is Epicor Kinetic into Avalara. Posted sales and purchase documents, along with customer and item reference data, move from Epicor into AvaTax. AvaTax calculates the tax and returns it, and ml-connector writes only that tax amount back onto the Epicor invoice, since AvaTax holds no ERP master data to send back.
How does the integration avoid duplicate tax transactions?
AvaTax uses the document code on a transaction as its idempotency key. ml-connector sets the Epicor document number as that code and uses the createOrAdjust call, so resubmitting the same document updates the existing AvaTax transaction rather than creating a second one. Once a transaction is committed its code is reserved, so ml-connector adjusts or voids instead of overwriting it.
How does the connection get data out of Epicor without webhooks?
Epicor Kinetic has no native outbound webhooks, so ml-connector polls. It queries the AP invoice and sales document business objects, or a Business Activity Query, with a date filter on the last sync timestamp to pick up new and changed records on the schedule you set. AvaTax is also pull only and its CreateTransaction call is synchronous, so the tax result comes back inline on the same request.

Related integrations

Connect Epicor Kinetic and Avalara

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

Get started