ml-connector
IFS CloudTaxJar

IFS Cloud and TaxJar integration

IFS Cloud manages your sales orders, customers, and general ledger across manufacturing and finance. TaxJar calculates real-time sales tax rates and manages nexus tracking across all your tax jurisdictions. Connecting the two keeps your order fulfillment and your tax reporting in sync. Completed sales orders from IFS Cloud flow to TaxJar for tax calculation and transaction reporting, while nexus regions from TaxJar flow back into IFS dimensions so your GL tax accounts are always current.

How IFS Cloud works

IFS Cloud exposes sales orders, customers, items, and GL accounts through OData v4 REST API. The API endpoint is tenant-specific, formatted as https://<tenant>.ifs.cloud/main/ifsapplications/projection/v1/<ProjectionName>.svc/<EntitySet>. Authentication uses OAuth2 client credentials with a token lifetime of approximately 60 minutes. IFS Cloud has no standard webhook subscription API; Event Actions require manual per-customer configuration in the admin UI and are not self-registerable. Integration relies on polling the OData API using modified timestamps or state filters. Large result sets must stay under 5000 elements, rate limits enforce approximately 1000 requests per minute per tenant returning HTTP 429 on exceeded, and all financial entities require a company code.

How TaxJar works

TaxJar is a REST API service at https://api.taxjar.com/v2/ (production) with a sandbox at https://api.sandbox.taxjar.com/v2/. Authentication uses API keys provided from the merchant's TaxJar account with either Bearer or Token header format; OAuth2 is not supported. TaxJar exposes tax calculation endpoints, transaction reporting (orders and refunds), nexus region tracking, and address validation. It also provides tax rates by location and VAT validation. All operations are poll-based or merchant-initiated; TaxJar does not publish webhooks or push events to external endpoints. Transaction reporting calls do not count toward monthly API rate limits. Sandbox is stateless and validates request/response format only.

What moves between them

Sales orders move from IFS Cloud to TaxJar after fulfillment. ml-connector polls IFS Cloud for orders in a fulfillment state or flagged as changed, reads customer address and line item details, posts the transaction to TaxJar's transaction endpoint for calculation and reporting, and stores the tax result in IFS Cloud GL accounts mapped to jurisdictions. Nexus regions from TaxJar flow back to IFS as dimension updates to enable proper tax account allocation. The sync runs on a schedule tied to your fulfillment cycle or daily for high-volume sites.

How ml-connector handles it

ml-connector obtains OAuth2 tokens for IFS Cloud using stored client credentials and manages token refresh on the 60-minute expiry schedule. For TaxJar, ml-connector stores the API key encrypted and presents it in each request header. It polls IFS Cloud CustomerOrderSet and related expansions for orders in fulfillment status using OData filters, respecting the 5000-element limit by paginating if needed. It reads IFS GL accounts to identify available tax posting dimensions. For each order, ml-connector extracts ship-to address, line items, and amount, then POSTs to TaxJar /transactions/orders with all required fields. TaxJar returns calculated tax by jurisdiction; ml-connector stores these in IFS GL dimensions and optionally posts vouchers to the appropriate GL accounts. Nexus regions are fetched from TaxJar periodically and stored in IFS dimension tables. If IFS rejects a mutation with an ETag conflict (optimistic concurrency), ml-connector retries by re-reading the record and reapplying the change. TaxJar's lack of webhooks means no real-time push; polling cadence should align with order fulfillment latency (same-day or next-day). Every transaction carries an audit trail and can be replayed if a downstream posting fails.

A real-world example

A mid-sized e-commerce and manufacturing company ships orders from a warehouse managed by IFS Cloud across 12 states and 3 Canadian provinces, triggering different sales tax obligations in each jurisdiction. Before the integration, the finance team downloaded fulfilled orders from IFS daily, manually looked up tax rates in TaxJar, calculated tax liability, and posted the GL entries by hand. Reconciliation took days and errors were common. With IFS Cloud and TaxJar connected, each fulfilled order automatically posts to TaxJar for tax calculation, the tax journal entries post into IFS GL on the correct tax liability accounts, and nexus changes are synchronized back to IFS so new jurisdictions are ready on day one. Tax reporting to state authorities is automated, and month-end close tax reconciliation is now a simple audit of the audit trail.

What you can do

  • Post completed sales orders from IFS Cloud to TaxJar for real-time tax calculation and jurisdiction reporting.
  • Sync calculated tax amounts back to IFS Cloud GL accounts, mapped to the correct tax liability and expense accounts.
  • Track nexus regions from TaxJar and update IFS Cloud dimensions so tax allocations always reflect current jurisdiction requirements.
  • Authenticate IFS Cloud with OAuth2 client credentials and TaxJar with API key, managing token refresh and secure credential storage.
  • Poll IFS Cloud on your fulfillment cycle with retries, audit trails, and transaction replay for failed downstream postings.

Questions

Which direction does data move between IFS Cloud and TaxJar?
Sales orders move from IFS Cloud to TaxJar after fulfillment. TaxJar calculates the tax by jurisdiction and returns the tax amount; ml-connector posts these amounts into IFS Cloud GL accounts and tracks the nexus regions. Nexus regions from TaxJar are also synchronized back to IFS dimensions to ensure tax account allocations are always current.
How does ml-connector handle the difference between IFS Cloud's pull-only OData API and TaxJar's lack of webhooks?
Both systems require polling. ml-connector polls IFS Cloud on a schedule tied to your order fulfillment cycle, checking for new or changed orders using OData filters and timestamps. TaxJar does not offer webhooks, so real-time calculation happens at fulfillment time via a direct POST to TaxJar's transaction endpoint. Transaction reporting calls to TaxJar do not count against monthly rate limits.
What happens if IFS Cloud rejects a GL posting due to a concurrent update?
IFS Cloud uses optimistic concurrency control via ETag headers. If a mutation fails with a 412 conflict, ml-connector re-reads the record to capture the current ETag, recalculates the posting with the latest state, and retries. Every attempt is logged in the audit trail and can be replayed without creating duplicate entries.

Related integrations

Connect IFS Cloud and TaxJar

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

Get started