ml-connector
IFS CloudAvalara

IFS Cloud and Avalara integration

IFS Cloud runs your supply chain, manufacturing, and finance. Avalara automates sales and use tax calculation across jurisdictions. Connecting them means every transaction in IFS Cloud gets real-time tax determination from Avalara, and the calculated tax amounts flow back into IFS Cloud's general ledger without manual reconciliation. Multi-state and multi-country compliance becomes automatic, and your month-end close includes accurate tax accounts.

How IFS Cloud works

IFS Cloud is a cloud ERP exposing suppliers, purchase orders, customer orders, supplier invoices, GL accounts, vouchers, and accounting dimensions through OData v4 REST. It authenticates via OAuth 2.0 client credentials against a tenant-specific endpoint (https://<tenant>.ifs.cloud/auth/realms/<SystemID>/protocol/openid-connect/token), with tokens lasting approximately 60 minutes. The API is pull-only with no standard webhook subscription; Event Actions can be configured manually in the IFS admin UI but require per-customer setup and are not API-driven. OData queries support filtering on modified timestamps and state fields, but result sets must stay under 5000 elements and requests must include If-Match ETags for mutations.

How Avalara works

Avalara is a cloud tax platform that calculates sales and use tax in real time via synchronous REST calls. It authenticates with HTTP Basic Authentication using Account ID and License Key (recommended for connectors and not sensitive to password resets). Avalara exposes Transactions, Companies, Customers, TaxCodes, and Addresses. It is pull-only with no push webhooks or outbound callbacks; integrations poll the ListTransactionsByCompany endpoint for reconciliation. Document codes act as idempotency keys, and committed transactions cannot be reversed. Requests have a maximum page size of 1000, and rate limits are enforced with HTTP 429 responses.

What moves between them

The flow runs from IFS Cloud into Avalara. When a customer order or sales invoice is posted in IFS Cloud, ml-connector reads the transaction (customer, address, line items, amounts) and submits it to Avalara for tax calculation. Avalara returns calculated tax by jurisdiction. ml-connector then creates a corresponding tax GL voucher in IFS Cloud, posting the tax amounts to the correct tax liability accounts by jurisdiction and company code. Line-item details and the original transaction reference are preserved so reconciliation is automatic.

How ml-connector handles it

ml-connector handles the two different authentication schemes: OAuth 2.0 Client Credentials on IFS Cloud (storing and rotating tokens every 60 minutes) and HTTP Basic Authentication on Avalara (using a stored Account ID and License Key that persist across password changes). On IFS Cloud, it queries customer orders and sales invoices using OData filters on created/modified timestamps, pages through results in batches under the 5000-element limit, and reads the If-Match ETag from each transaction before attempting mutations. When submitting to Avalara, it constructs the tax request with customer address, line items, and amounts, uses the IFS transaction number as the Avalara document code for idempotency, and handles Avalara's DocumentCodeConflict response by treating it as a successful prior submission (idempotent). After Avalara returns calculated tax, ml-connector uses the IFS OData projection for vouchers to create the corresponding GL entry, mapping tax totals by jurisdiction to the appropriate tax GL accounts in the customer's chart of accounts. Company code is always included per IFS requirements. Polling frequency is tunable per customer; reconciliation queries use $filter on posted date and reconciliation status to find unmatched transactions.

A real-world example

A mid-sized manufacturing and distribution company runs IFS Cloud for ERP and sells across three US states and one Canadian province. Before the integration, the finance team manually looked up tax rates for each order, sometimes using outdated jurisdiction tables, and re-entered calculated tax into IFS Cloud at month-end, creating reconciliation errors and month-end delays. With IFS Cloud and Avalara connected, each order posted to IFS Cloud is instantly submitted for tax calculation. Avalara returns the correct tax by state or province, and ml-connector writes it back to IFS Cloud's GL as a tax liability entry. The finance team no longer re-keys tax; the GL is always current, and month-end close is compressed by two days.

What you can do

  • Submit sales transactions from IFS Cloud to Avalara in real time and return calculated tax by jurisdiction.
  • Post tax GL vouchers back into IFS Cloud with amounts correctly allocated to tax liability accounts per company code.
  • Use IFS Cloud's OData API with proper ETag / If-Match handling and pagination within the 5000-element limit.
  • Authenticate IFS Cloud with OAuth 2.0 client credentials (token rotation every 60 minutes) and Avalara with HTTP Basic Auth.
  • Handle Avalara's document code idempotency so resubmitting a transaction for recalculation does not create duplicate GL entries.

Questions

How does ml-connector handle the two different authentication methods?
IFS Cloud uses OAuth 2.0 Client Credentials; ml-connector stores the client_id and client_secret encrypted, obtains a token at startup and every 60 minutes before expiry, and includes it as a Bearer token on every OData call. Avalara uses HTTP Basic Auth with Account ID and License Key; ml-connector stores these encrypted and Base64-encodes them on every request. The License Key does not expire on password change, so it is stable for connectors.
What happens if an IFS Cloud transaction is resubmitted to Avalara for recalculation?
ml-connector uses the IFS transaction number as the Avalara document code. If the same document code is resubmitted, Avalara returns a DocumentCodeConflict error, which ml-connector treats as a successful idempotent operation (the transaction was already calculated). This prevents duplicate GL entries in IFS Cloud even if a transaction is recalculated or manually retried.
How does ml-connector handle IFS Cloud's 5000-element result limit and ETag requirement for mutations?
When querying OData entities, ml-connector uses $filter on created/modified timestamps and $skip/$top pagination to keep result sets under 5000 elements per request. Before mutating any record (posting a tax GL voucher), it reads the If-Match ETag from the transaction, then includes that ETag in the PATCH or POST request to enforce optimistic concurrency and prevent write conflicts.

Related integrations

Connect IFS Cloud and Avalara

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

Get started