ml-connector
Wave AccountingGoogle Sheets

Wave Accounting and Google Sheets integration

Wave Accounting handles your invoicing and chart of accounts for a small business. Google Sheets is where your team stores reports, analysis, and operational data. Connecting the two keeps your Sheets reporting layer fed with fresh invoice data, customer records, and transactions from Wave, so your reports run against current numbers without manual export and re-keying. ml-connector bridges the two platforms and keeps them in sync.

How Wave Accounting works

Wave Accounting exposes businesses, customers, invoices, transactions, products, accounts, vendors, and sales taxes through a GraphQL API endpoint. The platform authenticates with OAuth 2.0 authorization code flow, using access tokens that expire every two hours and refresh tokens that require the offline_access scope. Wave publishes webhook events when invoices are created, updated, or paid, when payments arrive, when customers are created or updated, when transactions are posted, and when products are created or updated. Webhook delivery includes HMAC-SHA256 signature verification, and Wave retries failed deliveries if the endpoint returns a non-200 status. Patches to invoices are not supported via the API; invoices are created, approved, sent, or deleted as atomic states. Bills and accounts payable are not exposed. A connected Wave Business must have an active Pro subscription.

How Google Sheets works

Google Sheets is a cloud spreadsheet application with a REST API for reading and writing cell data. It authenticates via OAuth 2.0 authorization code flow (user-delegated) or Service Account credentials (server-to-server). The Sheets API operates on customer-defined schema - sheets are identified by spreadsheet ID and sheet tab name, and data is read or written using A1 notation ranges or Named Ranges. Google Sheets has no native ERP entities; customers define their own column headers and sheet structure. Push notifications are available via Google Drive watch channels, but channels expire hourly with a maximum 24-hour time-to-live and do not auto-renew. Polling is the recommended approach for keeping Sheets data current.

What moves between them

Wave invoices, customers, transactions, and products flow into Google Sheets. ml-connector listens for Wave webhook events when invoices and transactions change, and also polls Wave at a configurable interval to catch any events that were missed or to read accounts and products on a schedule. Each record is inserted or updated as a row in the sheet tab you have specified for that entity, mapped to the columns your team has named. Transaction inserts and invoice updates arrive within seconds of the event in Wave; products and accounts are polled once per day by default, but the interval is configurable.

How ml-connector handles it

ml-connector stores your Wave OAuth credentials and refreshes the access token when it expires every two hours, using the stored refresh token. It accepts the Sheets spreadsheet ID and registers named sheet tabs for each Wave entity (one for invoices, one for transactions, one for customers, etc.). When a Wave webhook arrives, ml-connector validates the HMAC-SHA256 signature against the registered webhook secret, parses the JSON payload, and constructs a row from the Wave record using the column headers your team has already defined in the sheet. It inserts the row if the Wave ID does not exist, or updates the matching row if it does. For entities not exposed via webhook (products, accounts), ml-connector polls Wave on a daily schedule and syncs the full table. Google Sheets API rate limits allow up to 500 requests per 100 seconds per project, so ml-connector batches multiple rows into a single write when possible. If a Sheets write fails, ml-connector retries with exponential backoff. Every record carries audit metadata (source, timestamp, Wave ID) so you can trace its origin.

A real-world example

A small professional services firm uses Wave Accounting to manage invoices, track customer payments, and maintain their chart of accounts. The business team uses Google Sheets for reporting on invoice status, aging, and revenue by customer. Before the integration, the finance team exported Wave invoices weekly, pasted them into a Sheets tab by hand, and manually calculated aging and totals. With Wave and Google Sheets connected, new invoices and payments appear in the reporting sheet within seconds of being recorded in Wave. The team can now build formulas and pivot tables against live data, and month-end reporting requires no manual data entry.

What you can do

  • Sync Wave invoices to Sheets on creation, update, or payment with HMAC signature verification and webhook parsing.
  • Push Wave customers, transactions, and products into customer-defined Sheets tabs and columns on a polling schedule.
  • Refresh Wave OAuth tokens automatically every two hours so the sync never breaks due to token expiry.
  • Map Wave data to your Sheets schema using customer-defined column headers without schema migration.
  • Retry failed Sheets writes with exponential backoff and track every record with a full audit trail.

Questions

How do you define which Wave data goes into which Sheets columns?
You define the mapping once during setup by naming your sheet tabs (e.g. Invoices, Customers, Transactions) and adding column headers to match the Wave fields you want to track (e.g. Wave ID, Customer Name, Amount, Date). ml-connector uses that column layout and inserts or updates rows based on Wave primary keys. If you rename a column header later, ml-connector adapts on the next sync.
Does ml-connector handle Wave's two-hour token expiry?
Yes. ml-connector stores your Wave refresh token and automatically refreshes the access token every two hours before it expires. The sync runs continuously without interruption, and token renewal happens in the background without requiring manual intervention.
What happens if a Sheets write fails or times out?
ml-connector retries the write with exponential backoff (up to 3 attempts) before logging the failure. Every operation is recorded in the audit trail with the timestamp, source record, and error details, so you can investigate and replay the row if needed.

Related integrations

Connect Wave Accounting and Google Sheets

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

Get started