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.
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
More Wave Accounting integrations
Other systems that connect to Google Sheets
Connect Wave Accounting and Google Sheets
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started