Sage Intacct and Asana integration
Finance teams using Sage Intacct for accounting often manage vendor payments and approval workflows separately in project tools like Asana. Connecting Intacct and Asana ensures pending bills are visible to project teams, approval workflows in Asana trigger bill processing in Intacct, and vendor information stays in sync. ml-connector handles Intacct's XML gateway endpoint and session caching, maps bill details to Asana task custom fields, and listens for task updates that signal approval or routing decisions.
What moves between them
The main flow moves vendor and bill data from Sage Intacct into Asana. ml-connector polls Intacct on a configurable schedule for vendors and bills, then creates or updates Asana tasks for each bill, encoding the vendor name, amount, GL account, and approval status in Asana custom fields. When an Asana task is updated (for example, a comment indicating approval or a custom field set to Approved), Asana pushes a webhook event that triggers an acknowledgment in Intacct. Bill payment details flow from Intacct to Asana in the same way, keeping project teams informed of cash outflows. Vendor reference data is synced bidirectionally when team assignments in Asana need to map to Intacct vendor codes.
How ml-connector handles it
ml-connector maintains an Intacct session by exchanging credentials on the first call and caching the sessionid; when the session approaches its 50-minute expiry, ml-connector refreshes it automatically on the next poll to avoid dropped connections. Each XML request is serialized through the single gateway endpoint, with forbidden C0 control characters stripped before escaping. Responses are parsed for both HTTP status and XML errormessage elements, since a 200 response can still contain an application error. On the Asana side, ml-connector uses OAuth 2.0 or a Personal Access Token to authenticate, creates or patches tasks with bills as the core entity, and maps Intacct vendor names and GL accounts to Asana custom fields so teams can filter and sort by financial attributes. Asana webhooks are registered at the task level and trigger whenever a bill task is updated; ml-connector receives the webhook, validates it, and if a custom field signals approval, it records the status change in Intacct. Retries use the Intacct uniqueid flag for deduplication; failed Asana webhook deliveries are retried by Asana's delivery system up to 24 hours before auto-deletion.
A real-world example
A mid-sized services firm runs Sage Intacct for vendor management and accounting, and uses Asana to coordinate project work across teams and clients. Before the integration, the AP team submitted bills to Intacct weekly and sent spreadsheets to project managers in Asana, then spent hours re-keying approval decisions back into Intacct. With Sage Intacct and Asana connected, each new bill in Intacct appears as a task in Asana with the vendor, amount, and GL account embedded as custom fields. Project managers review and approve bills in Asana by updating a task custom field, and the approval decision flows back to Intacct automatically. The AP team no longer re-keys approvals, and project teams see vendor commitments in context with project scope and budget.
What you can do
- Poll Sage Intacct vendors and bills on a schedule and create or update Asana tasks with financial metadata in custom fields.
- Map Intacct vendor names and GL accounts to Asana custom fields so project teams can filter and report on financial data.
- Authenticate Intacct using session-based XML gateway credentials and refresh the session automatically before expiry.
- Receive Asana task update webhooks and record approval decisions back to Sage Intacct, closing the approval loop.
- Handle Intacct XML parsing including error detection in HTTP 200 responses and deduplication via uniqueid.
Questions
- How does the integration handle Sage Intacct's 50-minute session expiry?
- ml-connector caches the Intacct sessionid after the initial authentication call and monitors the session age. As the session approaches 50 minutes, ml-connector refreshes it by calling getAPISession again before expiry, ensuring uninterrupted polling. If a call returns an invalid session error, ml-connector immediately refreshes and retries the request.
- What financial data can be stored in Asana custom fields?
- Asana has no native invoice or GL account objects, so ml-connector encodes Intacct data as custom fields on Asana tasks: vendor name, bill amount, invoice number, GL account code, cost center, and approval status are common examples. Your custom fields define what metadata appears in Asana, and the mapping is configured per flow.
- How do Asana task updates trigger changes in Sage Intacct?
- ml-connector registers webhooks on Asana bill tasks and receives a push notification whenever a task is updated. When a custom field signals approval (for example, set to Approved), ml-connector reads the Asana task, extracts the Intacct bill ID, and records the approval status in Intacct via an API call to mark the bill as approved or for payment.
Related integrations
More Sage Intacct integrations
Other systems that connect to Asana
Connect Sage Intacct and Asana
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started