ml-connector
Sage IntacctAsana

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.

How Sage Intacct works

Sage Intacct exposes vendors, AP bills, AP payments, GL accounts, and dimensions through a single XML gateway endpoint at https://api.intacct.com/ia/xml/xmlgw.phtml. Authentication is session-based: an initial call exchanges senderId, senderPassword, companyId, userId, and userPassword for a sessionid that is valid for 50 minutes and must be refreshed before expiry. All data is pulled via polling; Intacct has no webhook system. HTTP 200 responses can contain application-level errors in XML errormessage tags, so responses must be parsed for error status even on success codes. The XML gateway serializes all operations through a single POST connection, and the API includes no native idempotency mechanism, relying on a uniqueid flag in the control block for server-side deduplication.

How Asana works

Asana exposes tasks, projects, portfolios, custom fields, and webhooks through REST APIs at https://app.asana.com/api/1.0. Authentication uses a Personal Access Token in the Bearer header or OAuth 2.0. Asana supports task and project creation and updates, and can push webhook events to a registered endpoint with an at-most-once delivery guarantee, averaging delivery within 1 minute and guaranteed within 10 minutes. Webhooks auto-delete if they receive no 2xx response for 24 hours or miss 24 consecutive heartbeats. Asana has no native financial objects; financial data such as vendor names, bill amounts, and GL account codes are carried as custom fields on tasks or projects.

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

Connect Sage Intacct and Asana

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

Get started