Wave Accounting and Salesforce integration
Wave Accounting keeps your books; Salesforce keeps your customer relationships. When you create a customer in Wave to issue an invoice, that customer should exist in Salesforce as an Account so your sales team sees the same person your accounting sees. Wave Accounting and Salesforce connected keep revenue records aligned across finance and sales. ml-connector moves customer and invoice data from Wave into Salesforce on a real-time schedule tied to your Wave webhooks, bridging two completely different authentication models and keeping both systems in sync without manual work.
What moves between them
The flow is one-way from Wave into Salesforce. When a customer is created or updated in Wave, ml-connector translates that customer into a Salesforce Account and upserts it by an external ID. When an invoice is created, paid, or updated in Wave, ml-connector creates or updates a corresponding record in Salesforce (typically a custom object or an Order/Invoice object if the org is configured for Revenue Cloud). The cadence is real-time or near-real-time because Wave publishes webhooks immediately, but Salesforce rate limits per org may cause ml-connector to queue and batch writes.
How ml-connector handles it
ml-connector subscribes to Wave webhooks and listens for invoice.created, invoice.updated, invoice.paid, customer.created, and customer.updated events. For each event, ml-connector verifies the HMAC-SHA256 signature against the x-wave-signature header with the Wave API client secret. It then stores the Wave OAuth tokens encrypted (access token refreshed every 90 minutes, refresh token stored at setup). ml-connector translates Wave customers into Salesforce Accounts and upserts by an external ID (the Wave customer ID) to avoid duplicates. Invoices are mapped to Salesforce Order or custom Invoice objects with line-item details. The integration refreshes the Salesforce bearer token when a call returns 401 Unauthorized. ml-connector backs off and retries on Salesforce rate limits (HTTP 429) with exponential backoff. Every record carries an audit trail including the original Wave webhook payload so the sync can be replayed if a downstream Salesforce call fails.
A real-world example
A small product business runs Wave Accounting for invoicing and bookkeeping and uses Salesforce Sales Cloud to track customer opportunities and closed deals. Before the integration, the sales team would create a deal in Salesforce but the customer record often existed in only one system. When accounting issued an invoice for an opportunity in Wave, the customer details would not sync to Salesforce, and the sales team had no visibility into which opportunities had been invoiced or paid. With Wave and Salesforce connected, every customer created in Wave automatically appears as a Salesforce Account, and every invoice created or paid updates the related opportunity so the sales team knows immediately when an account has been invoiced and when a payment clears. Month-end revenue reconciliation becomes automatic because every Salesforce opportunity that closed is linked to its Wave invoice.
What you can do
- Sync Wave customers into Salesforce Accounts on creation and update, using Wave customer ID as the external ID to avoid duplicates.
- Translate Wave invoices into Salesforce Orders or custom Invoice records with line-item detail, linked to the corresponding Account.
- Verify Wave webhook signatures using HMAC-SHA256 and acknowledge each event with HTTP 200 so Wave retries are not triggered.
- Refresh OAuth tokens on both sides independently, with Wave tokens cached for 90 minutes and Salesforce tokens refreshed on 401.
- Track every record movement in an audit log with the original Wave webhook payload so failed syncs can be replayed without re-fetching from Wave.
Questions
- Does ml-connector sync data from Salesforce back into Wave?
- No. The flow is one-way, from Wave into Salesforce. Wave is your accounting source of truth. ml-connector reads customers, invoices, and payments from Wave and writes them to Salesforce so your CRM matches your accounts. Edits to Salesforce accounts or orders do not flow back to Wave.
- How does ml-connector handle Wave's webhook signature verification?
- Wave includes an HMAC-SHA256 signature in the x-wave-signature header on every webhook delivery. ml-connector computes the expected signature using your Wave API client secret and the request body, verifies it matches the header value, and rejects unsigned or tampered events. The signature window is 5 minutes, so clock skew on either end must be minimal.
- What happens if Salesforce's rate limit is reached while syncing Wave customers?
- ml-connector detects the HTTP 429 response from Salesforce, backs off with exponential jitter, and retries the request. If retries exhaust, ml-connector logs the failure in its audit trail with the original Wave payload so the sync can be manually replayed once the rate limit resets. The Wave webhook acknowledgment (HTTP 200) is sent only after the sync succeeds.
Related integrations
More Wave Accounting integrations
Other systems that connect to Salesforce
Connect Wave Accounting and Salesforce
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started