Sage Intacct and Brex integration
Sage Intacct runs your general ledger and accounts payable. Brex manages corporate spend and expense workflows. Connecting the two keeps your GL aligned with your actual spend without manual re-keying. When your team files an expense in Brex or a vendor bill arrives, ml-connector moves that record into Sage Intacct as an AP bill or GL entry, mapped to the correct cost center and expense account. Brex's accounting exports flow into Intacct on a schedule you control, so your books are reconciled automatically.
What moves between them
The main flow is Brex into Sage Intacct. When Brex generates an accounting export (flagged by the ACCOUNTING_RECORD_READY_FOR_EXPORT webhook event), ml-connector reads the accounting records and posts them into Intacct's general ledger. Individual Brex expenses are also pushed into Intacct as AP bills and mapped to the matching vendor. Brex vendor names and cost categories are synchronized into Intacct dimensions so expense allocations land on valid accounts. The GL posting direction is Brex-to-Intacct only, since Brex accounting records are generated from spend already recorded in Brex.
How ml-connector handles it
ml-connector stores the OAuth2 access token encrypted and refreshes it when a Brex call returns 401. On the Sage Intacct side, it exchanges session credentials for a sessionid, caches it for 45 minutes (5-minute refresh buffer before Intacct's 50-minute expiry), and refreshes automatically on next poll. ml-connector listens for the ACCOUNTING_RECORD_READY_FOR_EXPORT webhook event from Brex via Svix, validates the HMAC-SHA256 signature with the webhook secret, and immediately fetches the accounting records. Before posting any record into Intacct, it validates that the target GL account and cost center exist in Intacct's dimensions, and stops with an audit-logged error if a dimension is missing. It escapes forbidden XML control characters (C0 controls except tab, newline, carriage return) before serializing to Intacct's XML gateway. Every Brex-to-Intacct bill includes a uniqueid flag for server-side deduplication on Intacct's side, so a retry does not create a duplicate. Rate limits are retried with exponential backoff, and Brex 429 responses are tracked per the webhook event timestamp.
A real-world example
A mid-sized consulting firm runs Sage Intacct for GL and AP, and uses Brex for corporate cards and expense management across distributed teams. Before the integration, expenses filed in Brex sat in a pending state while the finance team manually reviewed them, exported them from Brex each week, and re-entered them into Intacct as AP bills, keyed to cost centers per project. Month-end reconciliation meant chasing discrepancies between Brex spend totals and the AP subledger in Intacct. With Brex and Intacct connected, Brex's accounting exports flow automatically into Intacct as GL postings and AP bills on the day they are ready, allocated to the correct cost center, and the manual re-keying step is eliminated. The finance team now reconciles with confidence, knowing Intacct reflects the true spend.
What you can do
- Push Brex accounting exports into Sage Intacct's general ledger as GL postings, mapped to the correct GL accounts and cost centers.
- Move individual Brex expenses into Intacct as AP bills, associated with the correct vendor and cost allocation.
- Synchronize Brex vendor names and cost categories into Intacct dimensions so every posting references a valid account.
- Authenticate Brex with OAuth2 (with automatic 1-hour token refresh) and Sage Intacct with session-based XML credentials, and validate Brex webhooks via Svix HMAC-SHA256 signature.
- Listen for Brex accounting exports via webhook, fetch the records, validate dimensions, and post to Intacct with server-side deduplication and automatic retries.
Questions
- Which direction does data move between Sage Intacct and Brex?
- The main flow is Brex into Sage Intacct. Brex accounting exports and expenses move into Intacct as GL postings and AP bills. Brex vendor and cost category data also flows into Intacct to populate dimensions. Sage Intacct general ledger accounts are read-only targets, so ml-connector does not write back into Brex spend records.
- How does ml-connector handle Sage Intacct's XML gateway and session expiry?
- ml-connector posts all operations to Intacct's single XML gateway endpoint, serializing operations into XML, and caches the sessionid for 45 minutes (with a 5-minute buffer before the 50-minute server expiry). When the buffer is reached, it automatically refreshes the session. Every XML response is parsed for error tags, since Intacct may return HTTP 200 with application-level errors inside the XML body.
- What happens if a Brex accounting export references a GL account or cost center that does not exist in Sage Intacct?
- Before posting any record, ml-connector validates that the target GL account and cost center exist in Intacct's dimensions. If a dimension is missing, the record is logged as a validation error in the audit trail and not posted. The operator is alerted so the missing dimension can be created in Intacct and the export retried.
Related integrations
More Sage Intacct integrations
Other systems that connect to Brex
Connect Sage Intacct and Brex
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started