Executive Summary
The Sage Intacct ↔ Tipalti integration represents a high-value pairing for mid-market and enterprise finance teams seeking to automate the full accounts payable lifecycle — from vendor master management and bill creation in Intacct through to global mass payments, tax compliance, and payee self-onboarding in Tipalti. Intacct serves as the system of record for the general ledger, chart of accounts, and AP subledger, while Tipalti acts as the execution layer for supplier payments across 200+ countries in 120+ currencies. The canonical data flow pushes vendor records and approved bills outbound from Intacct to Tipalti, and returns enriched payment status, confirmation references, and reconciliation data back to close the loop on the GL.
⚡ Accelerate your integration roadmap
Stop wrestling with API rate limits, undocumented endpoints, and unreliable webhooks. Our engineering team designs and deploys resilient, enterprise-grade integration architectures in days. Prefer to build it in-house? Leverage our recommended middleware platform.
A critical architectural consideration is the asymmetry between the two platforms’ API paradigms: Sage Intacct’s primary integration surface remains its mature XML Web Services gateway (with session-token authentication), while the Sage Intacct REST API (OAuth 2.0, hosted at developer.sage.com/intacct) is growing but does not yet achieve feature parity with the XML API. Tipalti, by contrast, offers a modern REST API secured with OAuth 2.0 client credentials. This mismatch means a stateless direct-connect architecture is impractical — a middleware layer (MuleSoft, Celigo, Boomi, or custom Node.js/Python) is strongly recommended to handle protocol translation, session lifecycle management, retry logic, and idempotency guarantees.
Logical Architecture & Data Flow
Architecture Component Breakdown
https://api.intacct.com/ia/xml/xmlgw.phtml. Handles vendor, AP bill, and GL journal CRUD operations via session-authenticated SOAP-like envelopes.developer.sage.com/intacct, secured via OAuth 2.0 authorization code flow with 1-hour access tokens. New objects and features are released here going forward, though XML API still has broader coverage.https://api.tipalti.com. Covers payee lifecycle, invoice submission, payment batch execution, and payment status retrieval.https://api.tipalti.com/oauth2/token. Returns short-lived Bearer tokens that must be cached and refreshed by the middleware to avoid unnecessary token generation on every API call.getAPISession on the Intacct XML gateway to obtain a temporary session ID and dynamic endpoint URL. Sessions expire after 30 minutes of inactivity and must be refreshed proactively.Authentication Architecture
This integration requires managing two fundamentally different authentication paradigms simultaneously. On the Sage Intacct side, the XML Web Services API uses a two-factor credential model: a Web Services Sender ID and password (provisioned by Sage Intacct and requiring an active Web Services Developer License), plus either a company login credential pair or a temporary session ID obtained via the getAPISession function. Sessions are dynamic — each successful auth returns a company-specific endpoint URL (e.g., https://na12.intacct.com/ia/xml/xmlgw.phtml) that must be used for subsequent calls in that session. Session timeouts are configurable at the user or company level and reset on each API call; the projected expiry is returned in every API response. For the newer Intacct REST API, OAuth 2.0 authorization code flow is used, with access tokens expiring in 1 hour and refresh tokens valid for 6 months. On the Tipalti side, all REST API calls use OAuth 2.0 client credentials grant: POST to https://api.tipalti.com/oauth2/token with client_id, client_secret, and grant_type=client_credentials to obtain a Bearer access token. The middleware must implement a token cache for Tipalti (refreshing before expiry), and a session pool or refresh-on-expiry handler for Intacct XML sessions. Storing credentials in a secrets manager (AWS Secrets Manager, Azure Key Vault, HashiCorp Vault) is mandatory given that this integration touches live financial data.
3.3 Data Flow Diagram
graph LR A["Sage Intacct\nAP & Vendors"] -->|"Export vendor/bill"| B["Middleware\nOrchestrator"] B -->|"Auth token request"| C["Tipalti OAuth\nToken Service"] C -->|"Bearer token"| B B -->|"POST payee/invoice"| D["Tipalti REST\nAPI"] D -.->|"IPN callback"| B B -->|"Write-back status"| A
Enterprise Use Cases
Use Case 1: Vendor Master Synchronization
VENDOR object (XML: <create><VENDOR>), the middleware polls for new records using a scheduled query on the VENDOR object filtered by WHENCREATED. The enriched vendor payload — including VENDORID, NAME, EMAIL, CURRENCY, and COUNTRY — is transformed and posted to Tipalti’s POST /api/Payees endpoint. Tipalti then triggers its self-service onboarding iFrame workflow, collecting banking details and W-9/W-8 tax information directly from the vendor, removing the AP team from the sensitive data collection process entirely. The Tipalti-assigned payeeId is written back to a custom field on the Intacct VENDOR record for future correlation.Use Case 2: Approved Bill-to-Invoice Handoff
APPROVED state (queryable via APBILL object with STATE = 'A'), the middleware extracts key fields — RECORDNO, VENDORID, TOTALENTERED, CURRENCY, DUEDATE, and line-item details — and submits them to Tipalti’s invoice endpoint. Tipalti’s built-in approval workflow and tax-engine validation then process the invoice before it is included in a payment batch. The Tipalti invoice ID is stored against the Intacct bill for reconciliation. This pattern eliminates manual data re-entry and reduces payment cycle time from days to hours.Use Case 3: Payment Execution & GL Reconciliation
paymentId, payeeId, amountPaid, currencyCode, paymentDate, and refCode. The middleware maps these fields back to the originating Intacct APBILL RECORDNO via the stored correlation key, then uses the Intacct XML API to post a APPAYMENT record — closing the bill and debiting the AP account while crediting the cash account — achieving automated, real-time GL reconciliation without manual payment posting.Use Case 4: Multi-Entity / Multi-Currency Mass Payments
paymentInstructions containing payeeId, amountSubmitted.amount, amountSubmitted.currency, and refCode. Tipalti handles FX conversion, sanctions screening, and local payment method routing (ACH, wire, PayPal, etc.) across 200+ countries. Upon batch settlement, individual payment confirmations are processed by the middleware to post entity-specific GL entries back into Intacct, with FX gain/loss calculated and posted to the configured unrealized FX account.Use Case 5: Tax Compliance & 1099/W-8 Document Retrieval
VENDOR record’s custom 1099ELIGIBLE field and tax classification. This ensures that Intacct-generated 1099 reports at year-end accurately reflect the tax status validated and stored in Tipalti, reducing compliance risk and eliminating the need to cross-reference two systems during audit.Standard API Field Mapping
| Entity | Sage Intacct Field | Method | Tipalti Field | Method | Type |
|---|---|---|---|---|---|
| Vendor / Payee | VENDOR.VENDORID |
GET | payees.idap |
POST | String (ID correlation key) |
| Vendor / Payee | VENDOR.NAME |
GET | payees.payeeName |
POST | String |
| Vendor / Payee | VENDOR.EMAIL1 |
GET | payees.email |
POST | String (RFC 5321) |
| Vendor / Payee | VENDOR.CURRENCY |
GET | payees.preferredPaymentMethod |
POST | ISO 4217 currency code |
| AP Bill | APBILL.RECORDNO |
GET | invoices.refCode |
POST | String (external reference) |
| AP Bill | APBILL.TOTALENTERED |
GET | invoices.amount |
POST | Decimal |
| AP Bill | APBILL.CURRENCY |
GET | invoices.currency |
POST | ISO 4217 |
| AP Bill | APBILL.DUEDATE |
GET | invoices.dueDate |
POST | ISO 8601 Date |
| Payment | APPAYMENT.PAYMENTAMOUNT |
POST | paymentInstructions.amountSubmitted.amount |
GET | Decimal |
| Payment Status | APBILL.STATE |
PATCH | payments.status |
WEBHOOK | Enum (IPN event) |
| Payment | APPAYMENT.FINANCIALENTITY |
POST | paymentInstructions.paymentMethod |
GET | String (ACH/Wire/PayPal) |
| Vendor / Payee | VENDOR.COUNTRY |
GET | payees.countryCode |
POST | ISO 3166-1 alpha-2 |
Limitations & Rate Limits
Sage Intacct Rate Limits
| Constraint | Limit | Detail | Mitigation |
|---|---|---|---|
| Monthly API Transactions (Tier 1) | 100,000 / month | Default tier for all Intacct subscribers. Each query, readByQuery, create, update, or delete command counts as one transaction. Overage billed in packs of 10. | Upgrade Performance Tier; batch operations; use DDS for bulk data extraction instead of repeated API queries. |
| Query Result Page Size | 2,000 records / query | A single query call returns a maximum of 2,000 records. Retrieving 5,500 records requires 3 separate API transactions using the offset parameter. |
Implement pagination loop with offset increments; count total transactions against monthly limit before bulk extracts. |
| Session Timeout (Inactivity) | 30 minutes (default) | Sessions expire after 30 minutes of inactivity. The projected timeout is returned in every API response’s authentication element. | Implement proactive session refresh; call getAPISession before timeout; handle GW-0011 Invalid Session errors with automatic re-auth. |
| Concurrent Request Throttling | DATA_UNAVAILABLE | Sage enforces rate limiting for burst protection (HTTP 429 returned). Specific concurrent request limits are not published in official documentation. | Implement exponential backoff on 429 responses; avoid polling loops; use asynchronous request patterns; contact Sage TAM for contracted limits. |
| REST API OAuth Token Expiry | 1 hour (access token) | Intacct REST API OAuth 2.0 access tokens expire in 1 hour; refresh tokens are valid for 6 months. | Cache access tokens and refresh proactively before expiry using the refresh token; store refresh token securely in secrets manager. |
Tipalti Rate Limits
| Constraint | Limit | Detail | Mitigation |
|---|---|---|---|
| API Request Rate (Burst) | DATA_UNAVAILABLE | Tipalti documentation states the API “employs several safeguards against bursts of incoming traffic” but does not publish specific numeric thresholds. HTTP 429 is returned on rate limit breach. | Implement exponential backoff with jitter on 429 responses; batch payee creation and invoice submissions where the API supports it; monitor error rates. |
| OAuth 2.0 Token Lifetime | DATA_UNAVAILABLE | Access token expiry duration for the client credentials grant is not explicitly published in available documentation. | Inspect the expires_in field in the token response and cache accordingly; implement token refresh logic triggered before expiry. |
| Payment Batch Size | DATA_UNAVAILABLE | Maximum number of paymentInstructions per batch API call is not documented publicly. |
Test batch limits in sandbox environment; implement chunking logic to split large batches; consult Tipalti TAM for production limits. |
| IPN Delivery Guarantee | DATA_UNAVAILABLE | Retry behavior, delivery order guarantees, and IPN timeout windows are not published in available documentation. | Design IPN listener to be idempotent; implement a reconciliation polling fallback to catch missed IPN events; log all IPN receipts with timestamps. |
6.3 Critical Engineering Constraints
Official Documentation
Sage Intacct
XML Web Services Guide
VIEW DOCS →
Sage Intacct
XML API Reference
VIEW DOCS →
Sage Intacct
REST API Developer Portal
VIEW DOCS →
Tipalti
Tipalti Developer Hub
VIEW DOCS →
Tipalti
Procurement REST API Documentation
VIEW DOCS →
Tipalti
Tipalti SOAP & REST API Overview
VIEW DOCS →