ml-connector
AcumaticaAsana

Acumatica and Asana integration

Acumatica runs finance, procurement, and distribution. Asana runs the work that surrounds those documents: reviews, approvals, and project tracking. Connecting the two means an AP bill or purchase order raised in Acumatica becomes an Asana task with its key figures attached, and the approval that happens in Asana flows back to release or approve the document in Acumatica. ml-connector handles the very different APIs on each side and moves records on a schedule or by webhook, with the financial values carried in Asana custom fields you map once.

How Acumatica works

Acumatica exposes vendors, AP bills, purchase orders, payments, GL accounts, journal transactions, customers, items, and employees through its Contract-Based REST API. The base URL is tenant-specific and the endpoint version in the path must exactly match the running ERP release, or the call returns a 404. Authentication is OAuth 2.0 through the built-in OpenID Connect server, or a legacy cookie session via /entity/auth/login. All field values are wrapped in value objects, and Acumatica can push record changes through Push Notifications (SM302000) using a shared-secret header rather than a signed payload.

How Asana works

Asana exposes tasks, projects, portfolios, users, teams, goals, and custom fields through its REST API at app.asana.com/api/1.0, using a Personal Access Token or OAuth 2.0 bearer token. It has no native invoice, purchase order, payment, or GL account objects, so financial data is carried in customer-defined custom fields on tasks and projects. Asana sends push webhooks signed with HMAC-SHA256 keyed on a secret exchanged during a handshake, and those webhooks silently auto-delete after 24 hours of failed delivery or missed heartbeats.

What moves between them

The main flow runs from Acumatica into Asana. ml-connector reads new and changed bills and purchase orders and creates or updates an Asana task for each one, writing the amount, due date, vendor, and reference number into mapped Asana custom fields. Employee records move the same direction so the Asana user roster reflects active staff. Task completion and custom field changes flow back from Asana into Acumatica, where a completed approval task can trigger the Release action on the matching bill. GL accounts and the chart of accounts stay in Acumatica and are not written from Asana.

How ml-connector handles it

ml-connector stores both credential sets encrypted, refreshes the Acumatica OAuth token when a call returns 401, and accepts the full tenant URL plus endpoint version per customer since Acumatica publishes no shared base address. Because Asana has no finance objects, each bill or purchase order is represented as a task and its figures land in custom fields that you map once; custom fields are resolved by GID, not name, because names can change. On the Asana side ml-connector registers a webhook, completes the X-Hook-Secret handshake, verifies the HMAC-SHA256 signature on every event, and re-registers automatically because Asana deletes webhooks after 24 hours of failures. On the Acumatica side it can receive Push Notifications via a shared-secret header or fall back to polling LastModifiedDateTime with offset pagination, since push delivery is not guaranteed. Acumatica field values are wrapped and unwrapped on each request, both APIs return 429 with backoff so requests are retried, and because Acumatica has no idempotency key, the connector checks for an existing record by natural key and stores the Asana GID before re-creating.

A real-world example

A mid-sized construction firm runs Acumatica for project accounting and accounts payable and runs Asana for day-to-day project coordination across field teams and the office. Before the integration, every subcontractor bill entered in Acumatica was copied by hand into an Asana task so a project manager could approve it, and the approval then had to be re-keyed back into Acumatica to release the bill. With Acumatica and Asana connected, each new bill becomes an Asana approval task automatically with its amount and due date in custom fields, and marking the task complete releases the bill in Acumatica. The duplicate data entry on both ends is gone, and approvals stop falling through the cracks.

What you can do

  • Create or update an Asana task for each new or changed Acumatica bill and purchase order.
  • Write Acumatica amounts, due dates, vendors, and reference numbers into mapped Asana custom fields by GID.
  • Release or approve an Acumatica document when its matching Asana approval task is completed.
  • Keep the Asana user roster aligned with active Acumatica employees.
  • Bridge Acumatica OAuth or session login with an Asana token, with retries and a full audit trail on every record.

Questions

How does the integration handle the fact that Asana has no invoice or purchase order objects?
Asana has no native finance objects, so ml-connector represents each Acumatica bill or purchase order as an Asana task. The financial values, such as amount, due date, and reference number, are written into Asana custom fields that you map once during setup. Those custom fields are matched by GID rather than name, because Asana lets field names be renamed.
Which direction does data move between Acumatica and Asana?
The main flow is Acumatica into Asana, where bills, purchase orders, and the employee roster create or update Asana tasks and users. Task completion and custom field changes flow back from Asana so a finished approval can trigger the Release action on the matching Acumatica document. The Acumatica chart of accounts stays in Acumatica and is not written from Asana.
Does it use webhooks or polling to detect changes?
Both, depending on the system. Asana sends signed push webhooks, so ml-connector completes the handshake, verifies the HMAC-SHA256 signature, and re-registers when Asana auto-deletes a webhook after repeated delivery failures. On the Acumatica side it can receive Push Notifications through a shared-secret header, and because that delivery is not guaranteed it also polls LastModifiedDateTime as a catch-up.

Related integrations

Connect Acumatica and Asana

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

Get started