ml-connector
XeroZoho CRM

Xero and Zoho CRM integration

Xero runs your accounting. Zoho CRM runs your sales pipeline. Connecting the two keeps your customer and invoice records visible in both places without manual sync. New invoices, customer contacts, and payment updates in Xero appear in Zoho CRM so your sales team sees the full customer picture. ml-connector handles the different webhook behaviors on each side and keeps the data flowing on a schedule you control.

How Xero works

Xero exposes invoices, contacts, accounts, purchase orders, payments, manual journals, and bank transactions through the Xero Accounting API, a REST service at https://api.xero.com/api.xro/2.0/ authenticated with OAuth2 bearer tokens that expire every 30 minutes and refresh tokens that expire after 60 days with offline access. The API supports webhooks for invoices, contacts, credit notes, payments, manual journals, purchase orders, and bank transactions, but webhooks deliver metadata only (resource ID and event type), requiring a follow-up GET request to fetch the full record. Xero also supports delta sync via the If-Modified-Since header for polling-based integrations, and requires the Xero-tenant-id header on every request to target the specific organization.

How Zoho CRM works

Zoho CRM exposes accounts, contacts, invoices, purchase orders, sales orders, quotes, vendors, products, leads, and deals through the Zoho CRM API, a REST service at a region-specific base URL (https://www.zohoapis.com/crm/v8 for US) authenticated with OAuth2 bearer tokens that expire after 1 hour and require refresh. Zoho CRM supports webhooks via notification channels that expire approximately every day and must be renewed by PATCH request before they lapse, and webhook notifications contain only record IDs, requiring a follow-up GET to fetch full payloads. Invoices, purchase orders, and quotes are available only in Professional edition and above.

What moves between them

Invoices, contacts, and payments flow from Xero into Zoho CRM. When an invoice or contact is created or updated in Xero, ml-connector fetches the full record via the Xero API, maps Xero contact records to Zoho CRM accounts and contacts, maps Xero invoices to Zoho CRM invoices, and writes or updates the records in Zoho CRM. Customer data is also aligned in the reverse direction so Zoho CRM contact changes can update Xero contacts. The sync runs on the webhook schedule (Xero webhooks push events, Zoho CRM channels renew automatically before expiry).

How ml-connector handles it

ml-connector stores encrypted credentials for both systems and manages the OAuth2 token refresh cycle for each: short-lived Xero tokens (30-minute expiry) and short-lived Zoho CRM tokens (1-hour expiry). On the Xero side, it receives webhook events containing only the resource ID and must immediately fetch the full record via GET before processing. On the Zoho CRM side, it manages webhook channel expiry by renewing Zoho's notification channels via PATCH before they lapse at 24 hours, and similarly fetches full records via GET when it receives webhook notifications with only record IDs. ml-connector maps Xero contacts to Zoho CRM accounts (the parent customer record) and Xero contacts to Zoho CRM contacts (end-user records within an account), and maps Xero invoices to Zoho CRM invoices with line-item details. It respects Xero's rate limits (60 calls per minute per tenant, 5000 per day) and the requirement for the Xero-tenant-id header on each call, and tracks token expiry on both sides to prevent auth failures mid-sync. Every record carries a full audit trail and can be replayed if a downstream write fails.

A real-world example

A mid-sized SaaS company runs Xero for accounting and invoice management, and uses Zoho CRM to track customer accounts and deals in the sales pipeline. Before the integration, the sales team had to manually check Xero to see if a customer had outstanding invoices or what they owed, and the finance team had to search Zoho CRM to find the associated account when posting payments. With Xero and Zoho CRM connected, each invoice created in Xero flows into the customer's Zoho CRM account record automatically, so the sales team sees payment status in the deal, and finance can trace payments back to the original account without switching systems.

What you can do

  • Sync customer contacts from Xero into Zoho CRM accounts and contacts, keeping customer records aligned across both platforms.
  • Push invoices and payments from Xero into Zoho CRM so sales and finance teams see the complete customer financial history.
  • Handle Xero webhook metadata by fetching full records on demand and respecting Xero OAuth2 token expiry and refresh-token rotation.
  • Manage Zoho CRM webhook channel expiry by renewing notification channels before they lapse, so notifications never stop flowing.
  • Map Xero contact and invoice records to Zoho CRM entities with a full audit trail and replay capability on sync failure.

Questions

Which direction does data flow between Xero and Zoho CRM?
Invoices, contacts, and payments flow from Xero into Zoho CRM so sales teams see the full customer picture. Customer account data can also flow in the reverse direction to keep Xero contact records updated with changes made in Zoho CRM. ml-connector maps Xero contacts to Zoho CRM accounts and contacts, and Xero invoices to Zoho CRM invoice records.
How does ml-connector handle Xero and Zoho CRM webhook limitations?
Both systems send webhook metadata only, not full payloads. ml-connector immediately fetches the full record via GET when it receives a webhook notification. Zoho CRM channels expire every 24 hours, so ml-connector automatically renews them via PATCH before they lapse to prevent notification loss.
What authentication and rate-limit challenges does this integration bridge?
Xero access tokens expire every 30 minutes and refresh tokens expire after 60 days, while Zoho CRM access tokens expire after 1 hour. ml-connector manages both token cycles and refreshes transparently. It also respects Xero's rate limits (60 calls per minute per tenant, 5000 per day) and includes the required Xero-tenant-id header on every call.

Related integrations

Connect Xero and Zoho CRM

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

Get started