ml-connector
Microsoft Dynamics 365 Business CentralTaxJar

Microsoft Dynamics 365 Business Central and TaxJar integration

Microsoft Dynamics 365 Business Central runs finance, sales, and inventory. TaxJar calculates sales tax and files transaction data with state tax authorities. Connecting the two means the sales invoices and credit memos posted in Business Central are reported to TaxJar as committed transactions, so sales tax filings reflect real revenue without anyone re-keying it. ml-connector also keeps customer exemption status aligned and pulls the merchant's nexus regions back into the ERP. It handles the very different APIs on each side and moves the data on a schedule you control.

How Microsoft Dynamics 365 Business Central works

Microsoft Dynamics 365 Business Central exposes customers, sales invoices, sales orders, sales credit memos, GL accounts, dimensions, and items through its REST API built on OData v4, scoped under a company on a tenant and environment URL. It authenticates with OAuth 2.0 client credentials through Microsoft Entra ID, so an unattended connector uses a registered app's client id and secret rather than a user login. Business Central supports push webhook subscriptions for entities including sales invoices and credit memos, but a notification only signals that a record changed and carries no data, so the resource must be fetched afterward, and subscriptions expire every three days unless renewed. Sales orders and invoices exist as drafts until a bound post action commits them.

How TaxJar works

TaxJar exposes sales tax calculation, order and refund transaction reporting, customer exemption records, address validation, and nexus regions through a REST JSON API over HTTPS, versioned by an x-api-version header. It authenticates with a single per-merchant API token sent in the Authorization header, with no OAuth2 and no client id or secret. TaxJar publishes no push webhooks, so all integration is poll-based or merchant-initiated: a system pushes finalized transactions in and pulls nexus regions and rates out. Transactions are reported through order and refund endpoints, and the transaction_id field acts as the natural deduplication key.

What moves between them

The main flow runs from Microsoft Dynamics 365 Business Central into TaxJar. When a sales invoice is posted in Business Central, ml-connector reports it to TaxJar as an order transaction with its line items, ship-to address, and totals, and a posted sales credit memo is reported as a refund transaction linked back to the original order. Customer exemption status is aligned so exempt buyers are flagged on both sides. In the other direction, ml-connector pulls TaxJar nexus regions on a schedule so the ERP reflects where the merchant has a tax obligation. Transactions are only sent after the document is posted, never while it is a draft.

How ml-connector handles it

ml-connector stores both credential sets encrypted, requesting a Business Central bearer token from Microsoft Entra ID with the client credentials grant and refreshing it when a call returns 401, while sending the TaxJar API token in the Authorization header on every TaxJar request. It learns of posted sales invoices and credit memos through Business Central webhook subscriptions, but because those notifications carry no payload, it fetches the full document over OData before mapping it, and it renews each subscription before the three-day expiry so the feed never goes dark. Each Business Central document number becomes the TaxJar transaction_id, and ml-connector follows TaxJar's upsert rule: a create that returns 422 because the transaction exists falls back to an update, and an update that returns 404 falls back to a create. Shipping is always sent even when zero, and zero-tax orders are still reported, because states want gross sales. Business Central sales orders are skipped until they post as invoices, since only committed revenue belongs in a filing. Rate limit responses on either side trigger backoff with jitter, and every record carries a full audit trail and can be replayed if a call fails.

A real-world example

A mid-sized online retailer with about 120 staff sells across more than a dozen states and runs Microsoft Dynamics 365 Business Central for order management, invoicing, and finance. Before the integration, an accountant exported posted invoices and credit memos each month and uploaded them into TaxJar by hand so the sales tax returns would tie out, a slow step that drifted whenever an invoice was corrected after export. With Business Central and TaxJar connected, every posted invoice flows into TaxJar as an order transaction and every credit memo as a refund, automatically, with exempt customers flagged. The monthly upload disappears, and the filing numbers match the ledger because they come straight from posted documents.

What you can do

  • Report posted Business Central sales invoices into TaxJar as order transactions with line items and ship-to addresses.
  • Report posted sales credit memos into TaxJar as refund transactions linked to the original order.
  • Use the upsert pattern so corrected documents update the matching TaxJar transaction instead of duplicating it.
  • Keep customer exemption status aligned and pull TaxJar nexus regions back into the ERP on a schedule.
  • Bridge Business Central OAuth2 client credentials and the TaxJar API token, with retries and a full audit trail on every record.

Questions

Which direction does data move between Microsoft Dynamics 365 Business Central and TaxJar?
The main flow is Business Central into TaxJar. Posted sales invoices are reported as TaxJar order transactions and posted credit memos as refund transactions, while customer exemption status is aligned on both sides. In the other direction, ml-connector pulls TaxJar nexus regions back into Business Central on a schedule so the ERP knows where the merchant has a tax obligation.
Does TaxJar send push notifications back to Business Central?
No. TaxJar publishes no webhooks and has no event subscription mechanism, so it is a pull-only target for reads. ml-connector pushes finalized transactions into TaxJar and pulls nexus regions and rates out on a schedule, and it relies on Business Central webhook subscriptions to learn when a new invoice or credit memo is posted.
How does the integration avoid duplicate transactions in TaxJar?
Each Business Central document number is used as the TaxJar transaction_id, which TaxJar treats as a natural deduplication key. ml-connector follows TaxJar's recommended upsert pattern: a create that returns 422 because the id already exists falls back to an update, and an update that returns 404 falls back to a create. This keeps a corrected invoice updating the same transaction rather than creating a second one.

Related integrations

Connect Microsoft Dynamics 365 Business Central and TaxJar

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

Get started