Xero and AvidXchange integration
Xero runs accounting for small and mid-sized businesses. AvidXchange runs accounts payable automation and payment execution. Connecting the two moves supplier bills out of Xero into AvidXchange for coding, approval routing, and payment, and brings the settled payment record back into Xero without re-keying. Vendor master records and the chart of accounts flow from Xero first so every invoice is coded against an account and supplier that already exist. ml-connector handles the very different auth on each side and moves the data on the schedule you set.
What moves between them
The main flow runs from Xero into AvidXchange. ml-connector reads suppliers and authorised ACCPAY bills from Xero, including line items and PO references, and pushes them into AvidXchange for coding, approval, and payment. The Xero chart of accounts and tracking categories are pushed first as GL codes and dimensions so AP staff code invoices against accounts that exist. Payment data flows the other direction: after AvidPay executes a payment, ml-connector pulls the settled check, ACH, or virtual card record and writes it back to the matching Xero bill as a Payment. New and changed Xero records are picked up by delta read, while AvidXchange is polled on a schedule because it cannot push.
How ml-connector handles it
ml-connector stores both credential sets encrypted. On the Xero side it runs the OAuth refresh cycle, renewing the 30-minute access token before it expires and sending the Xero-tenant-id header on every call. On the AvidXchange side it sends the opaque Company and User tokens as headers, since AvidConnect does not use standard OAuth for self-service customers. Vendors are synced before bills, because a missing vendor in AvidXchange means a payment cannot be routed. Xero bills are read with the If-Modified-Since header for efficient delta sync, and where Xero invoice webhooks are enabled an event triggers a follow-up GET, since the webhook payload carries only an ID. AvidXchange has no webhooks, so settled payments are pulled on a poll, typically every 15 to 30 minutes, and each payment is matched to its Xero bill by invoice number and vendor before a Payment is created. The supplied Xero InvoiceID and PaymentID GUIDs act as idempotency anchors so a retried write does not create a duplicate. Xero rate limits return HTTP 429 with a Retry-After header at 60 calls per minute and 5,000 per day per organization, so ml-connector backs off and respects that header, and every record carries a full audit trail and can be replayed if a write fails.
A real-world example
A property management firm with about 90 staff runs Xero for the books across a portfolio of buildings and uses AvidXchange to handle the high volume of vendor bills. Before the integration, accounts payable staff entered each approved bill into AvidXchange by hand, then after payment ran they typed the check and ACH details back into Xero and reconciled the bank feed line by line. With Xero and AvidXchange connected, authorised bills and the property tracking categories flow into AvidXchange for coding and approval automatically, and once AvidPay pays a vendor the settled payment posts back to the right Xero bill. The double entry disappears and the bank reconciliation starts from payments that already match.
What you can do
- Push Xero suppliers and authorised ACCPAY bills into AvidXchange for coding, approval, and payment.
- Sync the Xero chart of accounts and tracking categories into AvidXchange as GL codes and dimensions.
- Write settled check, ACH, and virtual card payments from AvidXchange back to the matching Xero bills.
- Bridge Xero OAuth 2.0 refresh tokens and the Xero-tenant-id header to AvidXchange opaque Company and User tokens.
- Read Xero with If-Modified-Since delta sync and poll AvidXchange on a schedule, with retries and a full audit trail.
Questions
- Which direction does data move between Xero and AvidXchange?
- Suppliers, ACCPAY bills, and GL codes move from Xero into AvidXchange for coding, approval, and payment. Settled payment records move the other way, from AvidXchange back into Xero as Payments against the original bill. Approval routing stays inside AvidXchange, so ml-connector reads only the resulting status, not the workflow.
- How does the integration handle that AvidXchange has no webhooks?
- AvidXchange runs on a scheduled pull and batch model with no public webhook system, so ml-connector polls it on a schedule, typically every 15 to 30 minutes, to pick up settled payments and invoice status. On the Xero side it uses the If-Modified-Since header for efficient delta reads, and it can act on Xero invoice webhooks where those are enabled by making a follow-up GET for the full record.
- Do vendors need to exist in AvidXchange before bills can be paid?
- Yes. A bill cannot be coded and paid in AvidXchange unless its vendor already exists there, and a missing vendor causes a payment failure. ml-connector syncs Xero supplier contacts into AvidXchange before it pushes any bills, so every invoice lands against a known payee. Payment delivery method such as check, ACH, or virtual card is set by the supplier in the AvidPay Network, not by the connector.
Related integrations
More Xero integrations
Other systems that connect to AvidXchange
Connect Xero and AvidXchange
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started