ml-connector
QuickBooks OnlineAsana

QuickBooks Online and Asana integration

QuickBooks Online manages invoices, bills, vendors, and the general ledger for small-to-mid-market businesses. Asana tracks projects and tasks where teams coordinate work. Connecting the two keeps financial data and project status in sync. Vendors and customers created in QuickBooks appear in Asana custom fields, project costs tracked in Asana flow back as bills and journal entries in QuickBooks, and Asana class and department mappings ensure costs land on the correct GL accounts and cost centers.

How QuickBooks Online works

QuickBooks Online exposes vendors, customers, employees, invoices, bills, purchase orders, payments, and general ledger accounts through the QuickBooks Online Accounting API (REST, base URL https://quickbooks.api.intuit.com/v3/company/{realmId}). Authentication uses OAuth 2.0 authorization code flow with access tokens valid for one hour and refresh tokens that rotate every 24-26 hours. QuickBooks offers both webhooks (best-effort push on entity create, update, delete, void, merge) and a CDC polling endpoint at /cdc with 30-day history. Webhook payloads contain only entity ID and operation, requiring a full fetch via GET to retrieve the complete record. All creates and updates require the exact object representation with a SyncToken for concurrency control.

How Asana works

Asana exposes tasks, projects, portfolios, users, teams, workspaces, custom fields, and goals through a REST API (base URL https://app.asana.com/api/1.0) authenticated with personal access tokens or OAuth 2.0. Asana offers push webhooks with at-most-once delivery guaranteed within 10 minutes, with heartbeat every 8 hours; webhooks auto-delete after 24 consecutive hours of failed delivery. Asana has no native finance objects (invoices, bills, GL accounts), so financial data is carried through custom fields. Users, workspaces, and workspace creation are read-only via API. Workspace and portfolio-level webhooks require filters; task-level webhooks are optional.

What moves between them

The main flow is vendor and customer records from QuickBooks Online into Asana custom fields, populated when QuickBooks entities are created or modified and retrieved via CDC polling or webhook push. Asana projects can carry cost metadata through custom fields that map to QuickBooks class and department values, so project budgets and actuals align with QuickBooks cost center tracking. Bills created in Asana custom fields based on project milestones flow back into QuickBooks as bills or journal entries, allocated to the project's class and department. Changes propagate on webhook receipt or on a scheduled polling cycle that checks QuickBooks CDC and Asana project updates.

How ml-connector handles it

ml-connector authenticates to QuickBooks with OAuth 2.0, refreshing the access token before expiry, and to Asana with a personal access token or OAuth 2.0 bearer token. It listens to QuickBooks webhooks for vendor, customer, invoice, bill, and journal entry changes, fetching the full record on receipt because webhook payloads contain only IDs and operation type. For Asana, it registers a workspace-level webhook to receive project and task updates. Vendor and customer names, IDs, and contact details are mapped into Asana custom fields; bill amounts and due dates from QuickBooks also populate custom fields so teams see financial obligations without switching systems. Asana projects linked to QuickBooks classes or cost centers ensure project costs posted as bills in QuickBooks land on the correct GL account. ml-connector handles OAuth token refresh on both sides, retries webhook processing if Asana rejects a delivery, and tracks concurrency control (QuickBooks SyncToken) so updates do not overwrite concurrent changes. Every record carries an audit trail and can be replayed if a downstream call fails.

A real-world example

A services firm uses QuickBooks Online for invoicing clients and tracking vendor bills, and Asana for project delivery and resource planning. Before the integration, project managers manually updated a spreadsheet with client names and project budgets, and accounting had to re-enter project cost allocations from Asana into QuickBooks bills, causing delays and rework. With QuickBooks Online and Asana connected, vendors from QuickBooks appear in Asana automatically so project managers see real supplier names and terms, and project costs posted as bills in Asana flow back into QuickBooks with the correct cost center, eliminating manual re-entry and keeping the ledger current throughout the project cycle.

What you can do

  • Sync vendors and customers from QuickBooks Online into Asana custom fields so project teams have current supplier and client information.
  • Map Asana projects to QuickBooks classes and cost centers so project costs land on the correct GL accounts.
  • Post project bills created in Asana custom fields back into QuickBooks as bills or journal entries with automatic cost center allocation.
  • Handle OAuth 2.0 token refresh on both sides and manage QuickBooks concurrency control (SyncToken) to prevent overwriting concurrent updates.
  • Receive QuickBooks webhook push notifications and Asana task/project updates, with full audit trail and replay capability for every record.

Questions

How does ml-connector handle the fact that Asana has no native finance objects?
Asana carries financial data through custom fields rather than native objects. ml-connector maps vendor names, bill amounts, due dates, and class/cost center IDs into custom field values so teams can view financial context in their project view without switching to QuickBooks. Bills created in custom fields flow back to QuickBooks for posting to the ledger.
What happens if a QuickBooks webhook arrives with only an ID and operation type?
QuickBooks webhook payloads do not include the full record, only entity ID, name, and operation. ml-connector fetches the complete record via GET immediately after receiving the webhook, then maps the data into Asana custom fields. If the fetch fails, the event is queued for retry on the next sync cycle.
How does the integration handle OAuth token refresh and concurrency?
ml-connector refreshes QuickBooks access tokens before their one-hour expiry and rotates Asana tokens as needed. For concurrent updates, it reads and respects the QuickBooks SyncToken on every update so a simultaneous change in QuickBooks does not overwrite a local change in Asana, preventing data loss.

Related integrations

Connect QuickBooks Online and Asana

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

Get started