ml-connector
Exact OnlinePlaid

Exact Online and Plaid integration

Exact Online runs your accounting and general ledger. Plaid connects your bank accounts and investment accounts so you can see balances and transaction history. When you connect the two, bank transactions flow from Plaid into Exact Online's bank entries without re-keying, and account balances reconcile automatically against your GL bank accounts. ml-connector manages the token lifecycle on both sides, maps Plaid accounts to Exact Online bank accounts, and keeps the reconciliation audit trail complete.

How Exact Online works

Exact Online exposes GL accounts, bank accounts, bank entries, transaction lines, cost centers, and journal entries through a REST API with OData v3 query syntax (filter, select, orderby, top, skip). Authentication uses OAuth 2.0 with a 10-minute access token lifetime and 30-day rotating refresh token. Exact Online publishes region-specific base URLs (Netherlands, Belgium, UK, Germany, France, Spain, USA) and requires a division ID on every call. Webhook subscriptions are available for GL accounts, bank entries, and transaction lines, using HMAC-SHA256 signature verification, but most accounts require polling due to the constraint that the $expand operator is not supported and related entity data must be fetched in separate requests.

How Plaid works

Plaid connects applications to users' bank accounts, investment accounts, and financial institutions via REST API, delivering read access to account balances, transaction history (up to 24 months), and account metadata. Authentication uses API key credentials (client_id and secret) for backend calls, plus per-user access tokens provisioned through the Plaid Link flow (a three-step user-facing authorization). Plaid supports webhook delivery of transaction sync updates, item errors, and new accounts available events, with signature verification via JWT (ES256) and SHA-256 body hash. Pagination uses cursor-based offsets for transactions, with a maximum 500-record page size.

What moves between them

The flow runs from Plaid into Exact Online. ml-connector polls Plaid for new and updated transactions from connected bank accounts on a daily or weekly schedule tied to your bank reconciliation cycle, then upserts them as bank entries in Exact Online. Account balances from Plaid are written to Exact Online's bank accounts so your GL reconciles to live bank data. Plaid accounts are mapped to Exact Online bank accounts and cost centers, so transaction lines land on the correct GL account and cost dimension. Plaid provides 24 months of transaction history; ml-connector respects that window and deduplicates on the Plaid transaction ID to avoid double-posting.

How ml-connector handles it

ml-connector stores both credential sets encrypted and manages the OAuth 2.0 token lifecycle on both sides, refreshing Exact Online access tokens (10-minute expiry) and Plaid access tokens (obtained via the Link flow and rotated per user) before each call. On the Exact Online side, it accepts the region-specific base URL and division ID per customer and uses OData filter and orderby syntax to query bank entries and transaction lines efficiently, working around the lack of $expand by fetching related GL accounts and cost centers in batched parallel requests. On the Plaid side, it uses the transactions/sync endpoint with cursor-based pagination to capture all transactions since the last sync window, then maps each transaction to the matching Exact Online bank account by account number or IBAN. Transaction description and amount are posted as bank entry lines with the cost center from the account mapping. Plaid webhooks notify ml-connector of new transactions and account changes, but polling remains the default cadence since webhook delivery on the Exact Online side is limited to certain entity types. ml-connector tracks the Plaid 30-day refresh token expiry per user and alerts before re-authorization is needed, retries failed Exact Online posts with exponential backoff, and maintains a full audit trail of every transaction mapped and posted so month-end bank reconciliation includes the source transaction ID from Plaid.

A real-world example

A mid-market professional services firm runs Exact Online for accounting and project billing across three offices in different countries. They use bank accounts from multiple institutions (commercial, payroll, international). Before the integration, the finance team exported transaction reports from each bank weekly and manually coded them into Exact Online's bank entries by hand, a process that took 3 to 4 hours per week and frequently introduced posting errors on the GL. With Exact Online and Plaid connected, transaction history flows automatically from all bank accounts into Exact Online each morning, coded to the correct bank account and cost center per office. Month-end bank reconciliation is automated, and the manual coding step is gone.

What you can do

  • Pull bank transactions from Plaid and post them as bank entries in Exact Online's general ledger, mapped to the correct bank account and cost center.
  • Keep Exact Online bank account balances synchronized with live balances from Plaid so your GL reconciles to your actual bank positions.
  • Map Plaid accounts to Exact Online bank accounts and cost centers so transaction lines land on the correct GL account and cost dimension.
  • Manage OAuth 2.0 token lifecycle for both Exact Online (10-minute tokens with 30-day refresh) and Plaid (user tokens via Link flow), refreshing before expiry on each request.
  • Sync on a schedule you control, with deduplication by Plaid transaction ID, retries on failed posts, and a full audit trail of every transaction mapped and posted.

Questions

Which direction does data move between Exact Online and Plaid?
The main flow is Plaid into Exact Online. Bank transactions and account balances flow from Plaid into Exact Online's bank entries and GL accounts. Exact Online GL accounts, bank accounts, and cost centers are queried to match Plaid transactions and determine where to post each entry, but no data is written back into Plaid.
How does the integration handle Plaid's per-user access token provisioning?
Plaid requires a separate user-facing token for each bank account via the Plaid Link flow. ml-connector stores each user's Plaid access token encrypted, provisioning it once and then rotating it as needed according to Plaid's token lifetime policy. Exact Online OAuth 2.0 tokens (10-minute lifetime) are also refreshed automatically before each call.
What happens when Plaid's $expand operator is not supported or Exact Online's division ID changes?
Exact Online does not support the $expand operator, so ml-connector fetches related GL accounts and cost centers in parallel requests, then joins them in memory to determine posting dimensions. Division IDs are accepted per customer; if a division ID changes, the configuration update ensures all subsequent API calls target the new division. Plaid transactions are matched to Exact Online bank accounts by account number or IBAN.

Related integrations

Connect Exact Online and Plaid

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

Get started