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.
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
More Xero integrations
Other systems that connect to Zoho CRM
Connect Xero and Zoho CRM
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started