ml-connector
XeroAsana

Xero and Asana integration

Xero tracks your invoices, bills, and purchase orders. Asana tracks your work. Connecting the two brings financial documents into your project workflow without re-entry. New Xero invoices and POs land in Asana as tasks with the contact name, amount, and due date attached as custom fields. Your team sees the financial context alongside their project work, and a centralized audit trail shows what synced and when.

How Xero works

Xero exposes invoices, purchase orders, contacts, bank transactions, and general ledger accounts through a REST API at https://api.xero.com/api.xro/2.0/. Authentication uses OAuth2 with 30-minute access tokens and 60-day refresh tokens. Xero publishes webhooks for invoice and PO events, but the webhook payload contains only the resource ID; a follow-up GET retrieves the full record. Every API request must include the Xero-tenant-id header to target the correct organization. Xero rate-limits at 5 concurrent calls and 60 per minute per tenant, with pagination at 100 records per page.

How Asana works

Asana exposes tasks, projects, portfolios, and custom fields through a REST API at https://app.asana.com/api/1.0. Authentication uses OAuth2 or a Personal Access Token (Bearer header). Asana has no native finance objects such as invoices or accounts; financial data lives as custom field values on tasks. Asana publishes webhooks with at-most-once delivery and auto-deletes them after 24 hours of failed delivery. Users and workspaces are read-only via the REST API.

What moves between them

The main flow is Xero into Asana. When a new invoice or purchase order is created in Xero, ml-connector creates a corresponding task in Asana with the contact name, invoice or PO number, amount, and due date populated as custom field values. Updates to the Xero record trigger task updates in Asana. Contact records from Xero can populate a custom field on tasks as a lookup or free-text reference. The flow is one-way; Asana tasks do not write back to Xero.

How ml-connector handles it

ml-connector stores both OAuth2 credential sets and maintains separate refresh tokens for Xero and Asana. Xero sends webhook notifications with the resource ID; ml-connector fetches the full invoice or PO details via GET and parses the amount, due date, and contact ID. It then creates or updates an Asana task and populates custom fields with that financial metadata. Because Xero rate-limits at 60 calls per minute, ml-connector queues and de-duplicates requests using the Xero record ID as the idempotency key, retrying 429 responses with exponential backoff. Asana requires custom fields to be pre-created at the workspace level; ml-connector maps Xero record fields to the named Asana custom fields you specify (e.g., Invoice Amount, Invoice Due Date, Vendor Name). If Xero webhooks are disabled or latency-sensitive, ml-connector can poll the invoice and PO endpoints on a fixed schedule.

A real-world example

A medium-sized professional services firm uses Xero for accounting and Asana for project delivery. Project managers track task milestones in Asana but lose sight of what invoices and bills are open. Before the integration, the finance team manually copied invoice totals and due dates into Asana task descriptions, and project managers had to switch between tools to see what had been billed. With Xero and Asana connected, each invoice or bill syncs to a task automatically with amount and due date as custom field values. Project managers see upcoming invoice due dates alongside project deadlines, and the finance team can track invoice-to-project mapping inside Asana's native views. The manual copy-paste step is eliminated.

What you can do

  • Sync Xero invoices and purchase orders to Asana tasks with amounts, due dates, and contact names as custom field values.
  • Create or update Asana tasks automatically when Xero invoices or bills are created or edited.
  • De-duplicate and retry failed syncs using Xero record IDs to ensure no duplicates during polling or retransmitted webhooks.
  • Respect Xero's 5 concurrent call and 60 per minute rate limits while maintaining delivery speed.
  • Audit every sync with timestamp and Xero-to-Asana record mapping for troubleshooting and reconciliation.

Questions

How does ml-connector handle Xero rate limits?
Xero enforces 5 concurrent calls and 60 per minute per tenant. ml-connector queues outbound API requests, batches them to stay within limits, and retries any 429 (too many requests) responses with exponential backoff. De-duplication by Xero record ID prevents duplicate tasks during retries.
Can Xero data write back to Asana and vice versa?
The primary flow is Xero into Asana. Xero invoices and POs become Asana tasks with financial data in custom fields. The flow is one-way; Asana tasks do not write back to Xero, and Xero maintains its own invoice and PO state.
What financial metadata appears on Asana tasks?
Xero invoices and POs sync to Asana as task custom fields: invoice or PO number, amount, due date, contact or vendor name, and description. Custom fields are pre-created at the workspace level and mapped by name, so you control which financial attributes appear on your tasks.

Related integrations

Connect Xero and Asana

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

Get started