ml-connector
Wave AccountingMicrosoft Dynamics 365 Sales

Wave Accounting and Microsoft Dynamics 365 Sales integration

Wave Accounting keeps your books. Microsoft Dynamics 365 Sales manages your pipeline. Connecting them puts every invoice and customer from Wave Accounting into Dynamics 365 Sales so your sales team sees the full financial picture without manual entry. New invoices, customer updates, and payment records from Wave flow automatically into your Dynamics 365 Sales accounts and contacts, keeping the two systems in sync as you grow.

How Wave Accounting works

Wave Accounting exposes invoices, customers, products, accounts, transactions, and vendors through a GraphQL API at https://gql.waveapps.com/graphql/public. Authentication uses OAuth 2.0 Authorization Code Flow with a 2-hour access token and refresh token (requires offline_access scope). The account must have an active Wave Pro subscription. Wave publishes webhooks for invoice.created, invoice.updated, invoice.paid, payment.created, customer.created, customer.updated, transaction.created, product.created, and product.updated events, with retries on failure and a 5-minute replay window. Webhook signatures use HMAC-SHA256 verification. Invoices cannot be patched in-flight, only created, approved, sent, or deleted.

How Microsoft Dynamics 365 Sales works

Microsoft Dynamics 365 Sales exposes accounts, contacts, leads, opportunities, quotes, orders, and invoices through a REST OData v4.0 API at https://{org-name}.api.crm.dynamics.com/api/data/v9.2/. Authentication uses OAuth 2.0 via Microsoft Entra ID with a client credentials flow for server-to-server integrations. Tokens expire in approximately 60 minutes. Dynamics 365 Sales supports webhooks via the Dataverse Event Framework with operations including Create, Update, Delete, and custom actions, with a 256 KB payload limit and a 60-second timeout with one automatic retry for 502/503/504 errors. Webhook registration requires the Plugin Registration Tool or Dataverse Web API access.

What moves between them

The main flow moves from Wave Accounting into Microsoft Dynamics 365 Sales. When invoices are created, updated, or marked paid in Wave, ml-connector receives the webhook notification and inserts or updates the corresponding account and contact records in Dynamics 365 Sales, mapping Wave customers to Dynamics 365 Sales accounts and invoice details to the quote or order timeline. Customer records created or updated in Wave are synced as accounts and contacts in Dynamics 365 Sales. Payment records from Wave are logged as activities on the corresponding Dynamics 365 Sales account. The integration is event-driven on the Wave side, responding in near-real time to webhook deliveries, and does not write back to Wave Accounting.

How ml-connector handles it

ml-connector subscribes to Wave Accounting's invoice and customer webhooks at setup and verifies each webhook signature using the HMAC-SHA256 x-wave-signature header with a 5-minute window. When Wave sends a notification, ml-connector retrieves the full invoice or customer record via the Wave GraphQL API using the OAuth access token, refreshing the token when it approaches expiry. The record is then mapped to the Dynamics 365 Sales schema: Wave customers become Dynamics 365 Sales accounts (mapped by email or external ID), and invoice line items create or update quote records linked to the account. ml-connector stores both credential sets encrypted and applies rate-limit backoff when either API returns 429. Because Dynamics 365 Sales uses client credentials OAuth, ml-connector exchanges the secret once at startup and caches the bearer token until refresh. Wave invoice updates are idempotent on the Dynamics 365 Sales side: the integration matches existing quotes or orders by external reference before inserting duplicates, and invoice paid events add a payment activity or mark the quote as won depending on the Dynamics 365 Sales workflow configuration.

A real-world example

A small consulting firm runs Wave Accounting for invoicing and general accounting and uses Dynamics 365 Sales to track pipeline and manage client relationships. Before the integration, the sales team manually logged invoices into Dynamics 365 Sales after they were sent in Wave, often days after the fact. With Wave and Dynamics 365 Sales connected, each invoice is instantly visible to the sales team as a Dynamics 365 Sales activity or linked quote on the client account. Customer records are automatically created as accounts in Dynamics 365 Sales so new clients added in Wave appear in the CRM pipeline without duplicating effort. Month-end, the entire invoice history flows from Wave into Dynamics 365 Sales without re-entry.

What you can do

  • Sync Wave Accounting invoices into Microsoft Dynamics 365 Sales as quotes or activities on the matching account.
  • Map Wave Accounting customers to Dynamics 365 Sales accounts so the CRM reflects the complete customer base.
  • Log customer creation, invoice updates, and payments from Wave as timeline events in Dynamics 365 Sales.
  • Subscribe to Wave webhooks for invoice and customer events with HMAC-SHA256 signature verification and automatic token refresh.
  • Deduplicate records by external ID or email match and apply idempotent updates to existing Dynamics 365 Sales accounts.

Questions

Which direction does data move between Wave Accounting and Microsoft Dynamics 365 Sales?
The main flow is from Wave Accounting into Microsoft Dynamics 365 Sales. Invoices, customers, and payment records move from Wave into Dynamics 365 Sales accounts and activities. ml-connector does not write back to Wave Accounting, so your Wave books remain the system of record for financial data.
How does ml-connector handle Wave and Dynamics 365 Sales authentication?
Wave uses OAuth 2.0 Authorization Code Flow with a 2-hour access token and refresh token. Dynamics 365 Sales uses client credentials OAuth via Microsoft Entra ID. ml-connector stores both credential sets encrypted, exchanges each at startup, and automatically refreshes them before expiry. All requests to Wave include webhook signature verification with HMAC-SHA256.
What happens when a Wave invoice is updated or a payment is marked paid?
ml-connector receives the webhook, verifies the signature, retrieves the full invoice record from Wave, and syncs it to the matching Dynamics 365 Sales account. Updates are idempotent: if a quote already exists for that invoice (matched by external ID), it is updated rather than duplicated. Payment events are logged as activities on the account timeline.

Related integrations

Connect Wave Accounting and Microsoft Dynamics 365 Sales

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

Get started