ml-connector
Wave AccountingZoho CRM

Wave Accounting and Zoho CRM integration

Wave Accounting holds your invoices and customer records. Zoho CRM manages leads, accounts, and deals. Connecting them keeps your sales team and accounting in sync: new customers and invoice data flow from Wave into Zoho automatically, so your CRM always reflects your actual customers and billing. ml-connector handles both OAuth flows, manages token refresh, validates Wave webhook signatures, and works around Zoho's regional API endpoints and channel expiry.

How Wave Accounting works

Wave Accounting exposes invoices, customers, products, accounts, and transactions through a single GraphQL endpoint at https://gql.waveapps.com/graphql/public using OAuth 2.0 with access tokens valid for 2 hours and refresh tokens for long-term access. Webhook events fire for invoice creation, approval, payment, and customer changes, and Wave retries failed deliveries for 5 minutes. The connected business must have a Wave Pro subscription. Invoices are read-only for updates (can be created or deleted, not patched), and bills, purchase orders, and payroll are not exposed through the GraphQL API. Webhook signature verification uses HMAC-SHA256 with a 5-minute replay window.

How Zoho CRM works

Zoho CRM exposes accounts, contacts, deals, invoices, and sales orders through region-specific REST APIs (base URL varies by region: .com, .eu, .in, .com.au, .jp, .ca, .com.cn) using OAuth 2.0 with either authorization code or client credentials flow. Access tokens expire after 1 hour and must be refreshed. Zoho sends webhook notifications on create/edit/delete events, but notifications contain only record IDs and must be fetched via a separate GET call; notification channels expire after approximately 1 day and require automated renewal. Invoices, sales orders, and other modules are only available in Professional edition and above. The token response includes an api_domain field that must be used for all subsequent requests.

What moves between them

Wave Accounting invoices and customers flow into Zoho CRM as accounts and contacts. On each Wave webhook event (invoice created, updated, paid, or customer created/updated), ml-connector fetches the full record from Wave and creates or updates the corresponding account or contact in Zoho CRM. The flow is one-directional, from Wave into Zoho CRM. If no webhooks are configured, ml-connector can poll Wave on a schedule. Reference data such as sales taxes and product mappings can be stored in Zoho for use in follow-on systems.

How ml-connector handles it

ml-connector handles OAuth 2.0 refresh on both sides, storing refresh tokens encrypted and fetching new access tokens before expiry. It validates every incoming Wave webhook with the HMAC-SHA256 signature in the x-wave-signature header, rejecting any with an invalid or expired (>5 minute) signature. On the Zoho side, it queries the token response for the api_domain field to ensure requests route to the correct regional endpoint. Because Zoho CRM invoices and accounts are only available in Professional edition, ml-connector checks the account tier on first connection and adjusts available modules accordingly. Wave invoices cannot be patched, only created or deleted, so ml-connector maps invoice updates to Zoho contact records by storing the Wave customer ID. Zoho notification channels expire after 1 day, so ml-connector automatically renews them via PATCH before lapse. When Wave reports that an invoice has been paid, ml-connector updates the associated Zoho account or contact record with a paid status or custom field. All records carry a full audit trail and can be replayed if a downstream call fails.

A real-world example

A small professional services firm uses Wave Accounting to invoice customers and track payments, and Zoho CRM to manage client relationships and sales pipeline. Before the integration, the sales team manually created contact records in Zoho when they closed deals, and accounting created invoice records after each engagement. The two records sets drifted, so month-end reconciliation involved searching Zoho contacts by name to match against Wave invoices, and sales lost visibility into which clients had outstanding balances. With Wave and Zoho CRM connected, each new Wave customer creates a contact in Zoho automatically, and when an invoice is paid, the contact record updates to reflect payment status. The sales team now sees up-to-date billing status on every contact, and accounting spends less time reconciling the two systems.

What you can do

  • Sync Wave customers into Zoho CRM as accounts or contacts with address, phone, and custom fields.
  • Sync Wave invoices into Zoho CRM, mapping invoice total, due date, and payment status to account or contact records.
  • Handle OAuth 2.0 refresh tokens for both Wave and Zoho CRM, keeping both connections alive without manual intervention.
  • Validate Wave webhook signatures (HMAC-SHA256) and route to the correct Zoho region endpoint based on the api_domain returned in the token response.
  • Automatically renew Zoho CRM notification channels before they expire, preventing loss of real-time updates.

Questions

Does this integration work with Wave Accounting free accounts?
No. Wave Accounting API access requires a Wave Pro subscription as of May 2026. Free and Essentials tier accounts cannot use this integration.
How does ml-connector handle Zoho CRM's regional endpoints?
Zoho returns an api_domain field in the OAuth token response, and ml-connector extracts and uses that value for all subsequent API calls, ensuring requests route to the correct region (.com, .eu, .in, etc). The integration automatically adapts to any region without manual configuration.
What happens when a Wave invoice is updated or deleted?
Wave invoices cannot be patched, so ml-connector treats invoice updates as new invoices and tracks the Wave customer ID to match against Zoho contact records. When an invoice is marked as paid in Wave, ml-connector updates the corresponding Zoho contact with payment status. If an invoice is deleted in Wave, ml-connector flags the related Zoho record for review but does not automatically delete it.

Related integrations

Connect Wave Accounting and Zoho CRM

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

Get started