ml-connector
Wave AccountingCin7

Wave Accounting and Cin7 integration

Wave Accounting runs invoicing and customer billing for small businesses. Cin7 Core manages inventory and accounting for product-based companies. When the two are connected, invoice records and customer master data flow from Wave into Cin7, so accounting entries post to the right GL accounts and cost dimensions without manual re-keying. ml-connector handles the transport differences, credential encryption, and the mappings that align Wave's customer and transaction data with Cin7's chart of accounts.

How Wave Accounting works

Wave Accounting exposes customers, invoices, products, transactions, accounts, and sales taxes through a GraphQL single endpoint at https://gql.waveapps.com/graphql/public over HTTPS. Access requires OAuth 2.0 authorization with a 2-hour access token and long-lived refresh token (refresh token scope requires offline_access). Wave sends webhooks for invoice lifecycle events (created, updated, paid) and customer changes, and returns HTTP 200 for successful delivery and 500 to trigger retries. Webhook payloads are signed with HMAC-SHA256 (x-wave-signature header) on a 5-minute replay window. Bills and purchase orders are not exposed through Wave's GraphQL API, and invoices cannot be patched in-place, only created, approved, sent, or deleted.

How Cin7 works

Cin7 Core exposes suppliers, purchases, sales, customers, products, and a chart of accounts through REST endpoints at https://inventory.dearsystems.com/externalapi/v2/ over HTTPS. Authentication uses custom API key headers (api-auth-accountid and api-auth-applicationkey) rather than OAuth, and multiple API keys can be created per account with rate limits per key. Cin7 supports webhooks for sales, purchases, customers, and stock changes configured through the UI Automation module, though webhook payloads are not HMAC-signed; Cin7 recommends mTLS or query-parameter tokens for security. The chart of accounts is read-only via REST API. Purchases cover the full procure-to-pay lifecycle through an Approach field (ORDER, INVOICE, RECEIVE).

What moves between them

Customer and invoice records move from Wave into Cin7. Wave customers are mapped to Cin7 customers or suppliers depending on role, and Wave invoices create corresponding sales records in Cin7 with amounts posted to the configured GL accounts. When Wave invoices are marked paid, the corresponding Cin7 records are updated to reflect payment status. Reference data such as the chart of accounts and product catalog is kept in sync so that invoice line items map to valid Cin7 products and GL dimensions. The sync runs on a schedule tied to Wave's webhook events and polling cadence, with no writes back to Wave.

How ml-connector handles it

ml-connector stores Wave's OAuth refresh token and Cin7's API keys encrypted and refreshes the Wave access token on each use (it expires after 2 hours). It translates Wave's GraphQL queries into REST calls against Cin7's endpoints, mapping Wave customer IDs to Cin7 customer/supplier identifiers and invoice amounts to the corresponding GL accounts configured per business. Because Wave sends webhooks for invoice events, ml-connector can subscribe to those notifications and pull the full record from Wave on each event, then post the equivalent transaction to Cin7. For Cin7 webhooks, ml-connector listens and deduplicates records using the Wave invoice ID and Cin7 sale ID to prevent double-posting. Rate limits are respected on both sides with exponential backoff and retry, and every record carries a full audit trail so failed postings can be replayed once the downstream block is cleared.

A real-world example

A small product-based business uses Wave Accounting to invoice customers and track cash flow, and Cin7 Core to manage inventory, purchase orders, and manufacturing. Before the integration, the finance team exported Wave invoices weekly and manually created sales orders in Cin7 with the same amounts and customer names, a process that introduced data entry errors and delays in accounting close. With Wave and Cin7 connected, each new Wave invoice automatically creates a sales record in Cin7 with the customer, amount, and GL account already populated, eliminating the manual entry step and ensuring the two systems agree on customer names and invoice totals. Month-end accounting close now starts with reconciliation already done.

What you can do

  • Sync Wave customers into Cin7 as customers or suppliers, keeping both systems aligned on customer master data.
  • Create Cin7 sales records from Wave invoices, mapped to the correct chart of accounts.
  • Track Wave payment status and update corresponding Cin7 sale records when invoices are marked paid.
  • Refresh Wave OAuth tokens automatically and store both credential sets encrypted.
  • Subscribe to Wave invoice webhooks and Cin7 stock/purchase events to trigger syncs with full audit trail and replay on failure.

Questions

What data moves from Wave to Cin7?
Customer records, invoices, and products move from Wave to Cin7. Wave customers are mapped to Cin7 customers or suppliers depending on their role, and Wave invoices create corresponding sales records in Cin7 with amounts posted to your configured GL accounts. Bills and purchase orders are not exposed in Wave's GraphQL API, so only invoicing and customer data are included in the sync.
How does ml-connector handle the GraphQL-to-REST translation?
ml-connector translates Wave's GraphQL queries into REST calls to Cin7's inventory and accounting endpoints. It maps Wave's customer IDs to Cin7's customer or supplier IDs, and maps invoice line items to Cin7 products and GL accounts. The two systems have different credential schemes (OAuth for Wave, API keys for Cin7), so ml-connector stores both sets encrypted and presents each to its respective system.
What happens if an invoice post fails in Cin7?
Every record movement carries a full audit trail with timestamps and status. If a Wave invoice fails to post to Cin7 (for example, because the GL account is invalid), ml-connector logs the failure with the full record and stops processing that batch. Once the downstream issue is fixed, failed records are replayed from the audit log without re-querying Wave, so no data is lost and no duplicate postings occur.

Related integrations

Connect Wave Accounting and Cin7

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

Get started