ml-connector
Wave AccountingTableau

Wave Accounting and Tableau integration

Wave Accounting holds your small business invoicing, expenses, and chart of accounts. Tableau turns data into dashboards and reports. Connecting the two lets you build real-time financial dashboards of invoices, customer balances, and account activity without re-keying data or building custom ETL. ml-connector watches for invoice and transaction events in Wave, transforms them into Tableau-ready rows, and refreshes your dashboards on a schedule you control.

How Wave Accounting works

Wave Accounting exposes invoices, customers, products, accounts, and transactions through a GraphQL single-endpoint API at https://gql.waveapps.com/graphql/public. Authentication is OAuth 2.0 Authorization Code Flow with 2-hour access tokens and refresh tokens (offline_access scope required). Wave sends webhooks for invoice.created, invoice.updated, invoice.paid, payment.created, customer.created, customer.updated, transaction.created, product.created, and product.updated events. Webhooks require HMAC-SHA256 signature verification with a 5-minute replay window. Wave Pro subscription is required for API access. Note that Wave has no accounts payable or purchase order functionality, and employee and payroll data is not exposed.

How Tableau works

Tableau operates as Tableau Cloud (SaaS) or Tableau Server (self-hosted) and exposes workbooks, views, data sources, users, projects, and schedules through REST API. Authentication uses personal access tokens (PAT) that exchange for session tokens valid 240 minutes by default, or Connected App with JWT. Tableau Cloud PATs expire after 15 days of non-use; Server PATs last 1 year. Webhooks fire for 24 event types including datasource refresh events, but Tableau does not sign webhook payloads. The API is site-scoped, requiring the site ID in request paths. Views are read-only derived objects and cannot be written to.

What moves between them

Wave transaction and invoice data flows into Tableau. ml-connector subscribes to Wave webhooks for invoice and transaction events, reads the full transaction ledger and customer list via GraphQL query, and writes the rows into a Tableau data source extract. On each event, the extract refreshes so Tableau dashboards and reports show current balances, aged receivables, and account totals. Customer and account reference data is pulled from Wave and published as dimensions in Tableau so reports can slice invoices by customer name and account.

How ml-connector handles it

ml-connector stores Wave OAuth credentials and uses the refresh token to obtain a new access token before expiry, since the 2-hour token lifetime is shorter than typical dashboard refresh intervals. It listens for Wave webhooks on a registered HTTPS endpoint, verifies each signature with the stored webhook secret and current timestamp, and queues the transaction for processing. Because Wave's GraphQL API requires pagination (no batch queries), ml-connector batches reads for customers and accounts, caching reference data to avoid rate-limit issues. For Tableau, ml-connector exchanges the stored PAT for a session token, publishes rows to the designated data source via the REST API, and triggers an extract refresh. Tableau's lack of webhook signature verification means ml-connector validates the event source separately before processing. Because views are read-only in Tableau, all data flows through a single writable data source; reports and dashboards are built as views on top of that source.

A real-world example

A small service business uses Wave Accounting to track invoices and expenses, and builds monthly financial dashboards in Tableau to monitor cash flow, aging receivables, and expense trends. Before the integration, the accountant exported transactions from Wave weekly and re-uploaded them to Tableau as CSV files, a process that introduced manual errors and left dashboards stale between uploads. With Wave and Tableau connected, each new invoice or payment in Wave triggers an automatic refresh of the Tableau data source, so dashboards stay current throughout the month. Month-end reporting starts with up-to-date numbers, and the accountant no longer re-uploads data by hand.

What you can do

  • Stream Wave Accounting invoices, payments, and transactions into Tableau data sources on webhook events.
  • Build Tableau dashboards and reports on Wave financial data without manual CSV uploads or custom ETL.
  • Sync Wave customers and accounts as dimensions in Tableau for slicing reports by customer and chart of accounts.
  • Handle Wave OAuth token refresh and Tableau personal access token session exchange automatically.
  • Verify Wave webhook signatures and manage Tableau data source refreshes on a cadence matched to your financial close calendar.

Questions

Can ml-connector write financial transactions back from Tableau into Wave?
No. ml-connector is read-only from Wave into Tableau. Tableau views are read-only derived objects, and writing transactions back to Wave would require Wave to expose an accounts payable or transaction creation API, which it does not. The flow is one direction: Wave events populate Tableau dashboards.
How does ml-connector handle Wave's 2-hour OAuth token expiry?
ml-connector stores Wave's refresh token and uses it to obtain a new access token when the current token is within 15 minutes of expiry, ensuring the token is always fresh before making a GraphQL query or querying for webhook secrets. This prevents 401 errors during scheduled refreshes.
How does the integration manage customer and account data across Wave and Tableau?
ml-connector pulls the full customer list and chart of accounts from Wave via GraphQL query when the data source is first set up, and on each subsequent refresh merges new or updated customers and accounts. These are published as dimension tables in Tableau so dashboards can drill down by customer name, business type, and account code.

Related integrations

Connect Wave Accounting and Tableau

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

Get started