ml-connector
Epicor KineticTaxJar

Epicor Kinetic and TaxJar integration

Epicor Kinetic runs manufacturing and distribution. TaxJar manages sales tax compliance and state transaction reporting. Connecting the two keeps your tax obligations current and removes manual steps from fulfillment. Orders created in Epicor flow to TaxJar with customer location and line detail, where sales tax is calculated and transaction records are prepared for quarterly state filing. ml-connector handles the polling schedule, credential storage, and dedup logic, so your tax liability is always accurate.

How Epicor Kinetic works

Epicor Kinetic exposes customers, orders, line items, GL accounts, and vendors through REST endpoints with OData v4 query support. The cloud product uses OAuth2 client credentials or API Key authentication against a tenant-specific URL, while on-premises instances use Token Resource Service or Basic Auth. Epicor has no native webhook system, so integrations read records by polling with OData filter expressions on date fields like UpdatedOn, using offset pagination with $top and $skip parameters. Write operations follow a two-step pattern: fetch the new object template, then update it with the required fields.

How TaxJar works

TaxJar calculates sales tax rates and manages transaction reporting through a REST API that accepts an API token in the Authorization header. The service supports real-time tax calculation via POST to /taxes, transaction reporting via POST to /transactions/orders, and lookup of nexus regions and tax rates by location. TaxJar is read-only for compliance records but accepts order and refund postings for state filing. The sandbox environment validates request format only and does not persist data, so all testing must work against the live API with test credentials. TaxJar rate limits are generous and undocumented, with no webhooks or event push capability.

What moves between them

Orders flow one direction, from Epicor Kinetic into TaxJar. ml-connector polls Epicor on a configurable schedule, reads orders with status Released or higher, extracts customer location and line amounts, and POSTs them to TaxJar for tax calculation and transaction recording. TaxJar's nexus table is read periodically to validate that tax is being calculated in all jurisdictions where the business has a filing obligation. Tax rates returned from TaxJar are logged for audit but do not write back to Epicor, since Epicor holds the source of truth for order line amounts.

How ml-connector handles it

ml-connector stores both credential sets encrypted and uses Epicor's API Key header with OAuth2 bearer token on every request. It polls Epicor with OData filters on UpdatedOn to find orders changed since the last sync, pages through results with $top=100 and $skip, and extracts customer ship-to address and order line detail. Before posting to TaxJar, it validates the customer location against TaxJar's nexus table to ensure the state is covered. TaxJar requests include order number, customer exemption type if present, and line-item detail with tax category. If TaxJar returns 422 (duplicate transaction), ml-connector falls back to a PUT request to update the existing record, ensuring idempotency. Epicor bearer tokens expire in roughly one hour, so ml-connector refreshes the token on a 50-minute timer to avoid mid-batch failures. Every order carries a full audit trail linking the Epicor order number to the TaxJar transaction ID so reconciliation is fast.

A real-world example

A mid-sized distributor with nexus in eight states runs Epicor Kinetic for order management and inventory. Before the integration, the finance team exported orders from Epicor at month-end and manually uploaded them to TaxJar in batches, often days after fulfillment, causing late state filings and manual corrections when orders changed. With Epicor Kinetic and TaxJar connected, each released order flows to TaxJar immediately after fulfillment, tax is calculated in real time with the correct nexus, and quarterly transaction records are automatically accurate. The finance team no longer re-keys data, and state filings go out on time.

What you can do

  • Sync released orders from Epicor Kinetic to TaxJar on a configurable schedule with customer location and line detail.
  • Validate customer ship-to address against TaxJar nexus regions to ensure tax is calculated only in jurisdictions with filing obligations.
  • Handle TaxJar idempotency by detecting duplicate transaction errors and falling back to PUT to update the existing record.
  • Refresh Epicor OAuth2 bearer tokens automatically before expiry so long-running syncs do not fail mid-batch.
  • Track and log all transactions with Epicor order number to TaxJar transaction ID mapping for fast reconciliation and audit.

Questions

Which direction does data move between Epicor Kinetic and TaxJar?
Orders move one direction, from Epicor Kinetic into TaxJar. ml-connector reads released orders from Epicor, posts them to TaxJar for tax calculation and transaction recording, and logs the mapping between Epicor order numbers and TaxJar transaction IDs. Tax rates and nexus information are read from TaxJar but do not write back to Epicor.
How does the integration handle Epicor Kinetic's API token expiry?
Epicor OAuth2 bearer tokens expire in roughly one hour. ml-connector tracks the token age and refreshes it automatically on a 50-minute timer, ensuring that long-running order syncs do not fail mid-batch. The refresh happens transparently without pausing the integration.
What happens if TaxJar reports that a transaction already exists?
If TaxJar returns a 422 Unprocessable Entity error indicating a duplicate transaction, ml-connector falls back to a PUT request to update the existing record instead of posting a new one. This ensures that if an order is retried, only one TaxJar transaction is created, keeping the tax calculation and state filing records clean.

Related integrations

Connect Epicor Kinetic and TaxJar

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

Get started