ml-connector
Sage IntacctPlaid

Sage Intacct and Plaid integration

Sage Intacct manages your accounting and general ledger. Plaid gives you access to bank account data and the ability to initiate payments. Connecting the two means bank transactions from all your accounts flow into Intacct's general ledger automatically, posted to the correct GL accounts and cost centers, and reconciled without manual re-entry. Payments initiated in Intacct can move money through Plaid's ACH and wire transfer capabilities.

How Sage Intacct works

Sage Intacct is a cloud accounting and ERP system that exposes GL accounts, dimensions, vendors, invoices, and payments through a single XML gateway endpoint at https://api.intacct.com/ia/xml/xmlgw.phtml. Authentication uses session-based credentials: senderId, senderPassword, companyId, userId, and userPassword are exchanged in an initial getAPISession call for a sessionid that lasts 50 minutes and is cached for reuse. The XML gateway requires all operations to serialize through one HTTPS POST connection, and responses with HTTP 200 may contain application-level errors inside the XML body that must be parsed for status. Intacct does not offer webhooks, so all syncs are polling-driven, and forbidden XML control characters must be stripped before escaping.

How Plaid works

Plaid is a financial data network that connects applications to banks, investment accounts, and financial institutions via REST API at https://sandbox.plaid.com or https://production.plaid.com. Authentication uses an API key supplied as PLAID-CLIENT-ID and PLAID-SECRET headers, and per-user access tokens are obtained through a three-step Plaid Link flow. Plaid supports webhooks for transaction updates, item status changes, investment holdings, and transfer events, delivering them as HTTP POST with JWT signatures that must be verified using ES256 public keys and rejecting if the iat claim is older than 5 minutes. Transfers require an idempotency key and have strict description length limits: 15 characters for RTP and 10 for ACH.

What moves between them

Bank transactions flow from Plaid into Sage Intacct. When Plaid webhooks arrive with TRANSACTIONS_SYNC_UPDATES_AVAILABLE or RECURRING_TRANSACTIONS_UPDATE, ml-connector fetches the new transactions and posts them into Intacct's general ledger and expense accounts, matching each transaction to the correct GL account and cost center based on merchant name and account type. Vendor payments can flow from Intacct back to Plaid when a payment is marked for electronic processing, initiating an ACH transfer if the vendor is enrolled in Plaid's transfer network. The sync runs on Plaid webhook events rather than on a fixed schedule, so Intacct's books stay current as bank data arrives.

How ml-connector handles it

ml-connector maintains two credential sets: Intacct session credentials (senderId, senderPassword, companyId, userId, userPassword) which are refreshed every 50 minutes, and Plaid API credentials (client_id, secret) that persist across calls. When a Plaid webhook arrives, ml-connector validates the JWT signature using Plaid's public key, checks that the iat claim is no more than 5 minutes old, and verifies the request_body_sha256 claim against the raw payload. It then fetches transactions from Plaid using the supplied cursor for pagination. For each transaction, ml-connector maps the bank account to an Intacct GL account, derives the expense or revenue account from the merchant category and transaction type, and posts the entry into Intacct's general ledger using the XML gateway with a uniqueid flag for server-side deduplication. Outbound vendor payments use Plaid's /transfer/create endpoint, passing an idempotency key to prevent duplicates and respecting the character limit on transfer descriptions. Every transaction carries full audit data linking the Plaid transaction_id to the Intacct batch and entry, enabling replay if a downstream call fails.

A real-world example

A mid-sized accounting firm with multiple client accounts across different banks uses Sage Intacct for consolidated reporting and GL management, and relies on Plaid to aggregate transactions from corporate bank accounts, credit cards, and investment accounts. Before the integration, accountants spent hours each week downloading bank statements, categorizing transactions by account and GL dimension, and manually posting entries into Intacct, chasing reconciliation breaks when merchant names did not match or when transactions arrived out of order. With Sage Intacct and Plaid connected, each bank transaction appears in Intacct's ledger within minutes of posting to the bank, automatically categorized by account type and cost center, and reconciliation happens by comparing a single Plaid source against the posted ledger rather than juggling separate statements.

What you can do

  • Post bank transactions from Plaid into Sage Intacct's general ledger with automatic GL account and cost center assignment based on merchant name and account type.
  • Validate Plaid webhook signatures using JWT verification and reject messages older than 5 minutes, ensuring only authentic bank data flows into the ledger.
  • Support Intacct's 50-minute session refresh cycle and XML gateway serialization, mapping vendors and GL dimensions across the two APIs.
  • Initiate ACH transfers from Intacct vendor payments through Plaid's transfer network, with idempotency keys and description length enforcement.
  • Maintain a full audit trail linking Plaid transaction IDs to Intacct GL entries for reconciliation, replay, and regulatory compliance.

Questions

How does data flow between Sage Intacct and Plaid?
Bank transactions flow from Plaid into Sage Intacct. When a Plaid webhook arrives with a transaction update, ml-connector fetches the transactions and posts them into Intacct's general ledger, matched to the correct GL account and cost center. Vendor payments can flow from Intacct back to Plaid to initiate ACH transfers if the vendor is enrolled in Plaid's transfer network.
How does ml-connector handle Sage Intacct's XML gateway and session management?
ml-connector connects to Intacct's single XML gateway endpoint at https://api.intacct.com/ia/xml/xmlgw.phtml using session-based credentials. Sessions last 50 minutes and are cached for reuse; ml-connector refreshes the session automatically on the next call after expiry. All GL posting operations serialize through the XML gateway with a uniqueid flag for server-side deduplication.
What validation happens when Plaid webhooks arrive?
ml-connector validates the JWT signature using Plaid's public key with the ES256 algorithm, rejects messages where the iat claim is older than 5 minutes, and verifies the request_body_sha256 claim against the raw webhook body. Only signatures that pass all three checks proceed to transaction posting.

Related integrations

Connect Sage Intacct and Plaid

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

Get started