ml-connector
Wave AccountingMicrosoft Power BI

Wave Accounting and Microsoft Power BI integration

Wave Accounting keeps your small business books. Power BI visualizes your financial data for real-time insights. Connecting the two puts your invoices, customers, transactions, and tax registers into reports and dashboards without manual export or re-entry. New invoices appear in Power BI within minutes of creation in Wave, and year-end financial analysis is ready whenever you need it.

How Wave Accounting works

Wave Accounting exposes invoices, customers, products, accounts, transactions, vendors, and sales taxes through a GraphQL API at https://gql.waveapps.com/graphql/public. Authentication uses OAuth 2.0 authorization code flow with 2-hour access token expiry and refresh tokens. Wave requires the connected business to hold an active Wave Pro subscription. The API has no direct support for bills or purchase orders, and employees and payroll are not accessible. Wave supports webhooks for invoice lifecycle events, payments, customer changes, transactions, and product updates, with HMAC-SHA256 signature verification and Wave-managed retries.

How Microsoft Power BI works

Microsoft Power BI consumes data through a REST API at https://api.powerbi.com/v1.0/myorg. Authentication uses OAuth 2.0 with client credentials flow (service principal), where the service principal must be a Member or Admin in each target workspace. ml-connector posts rows into Power BI push datasets after defining the table schema with column names and data types. Power BI does not send webhooks outbound; it is a pure analytics destination. Tokens expire after approximately one hour and are refreshed on-demand. Power BI Admin portal must have developer settings enabled for service principal API access.

What moves between them

Wave invoices, transactions, customers, and sales tax records flow into Power BI push datasets. ml-connector subscribes to Wave's webhooks for invoice and payment events, and polls Wave's GraphQL endpoint on a schedule to fetch updated transactions and customer records. Each record is transformed to Power BI's table schema and posted to the corresponding push dataset. Power BI dataset refreshes are triggered after each batch load so reports and dashboards reflect the latest accounting state.

How ml-connector handles it

ml-connector stores Wave OAuth credentials encrypted and uses the refresh token to obtain a fresh access token every 2 hours as Wave's tokens expire. Power BI service principal credentials are also encrypted and tokens are refreshed on each API call that returns 401. Wave webhook notifications are validated with HMAC-SHA256 using Wave's signature header and a 5-minute replay window; any signature mismatch returns 401 to cause Wave to retry. When invoices are created, updated, or paid in Wave, or when a transaction is recorded, ml-connector transforms the GraphQL response fields into Power BI column names and datatypes, then POSTs the batch to the push dataset. Power BI requires the table schema to be declared before rows can be inserted, so ml-connector creates or updates the dataset schema on first run and when Wave's field list expands. If a dataset refresh is enabled, ml-connector triggers it after the batch loads so downstream reports see the new data immediately. Rate-limit headers from both APIs are tracked and respected with exponential backoff.

A real-world example

A small consulting firm uses Wave Accounting for invoicing clients and tracking expenses. The finance owner wants to see cash flow, invoice aging, and expense trends in real time without exporting CSV files weekly. With Wave and Power BI connected, each invoice automatically appears in a Power BI dashboard within minutes of creation, and a monthly expense breakdown refreshes every night. The owner can now spend time on strategy instead of manual reporting.

What you can do

  • Stream Wave invoices, payments, customers, and transactions into Power BI push datasets via webhooks and scheduled polling.
  • Transform Wave GraphQL fields to Power BI table schemas automatically, with schema updates handled on first run and when fields expand.
  • Validate Wave webhook signatures with HMAC-SHA256 and enforce a 5-minute replay window to prevent duplicate processing.
  • Authenticate Wave with OAuth 2.0 refresh token flow and Power BI with service principal client credentials, managing token expiry for both.
  • Trigger Power BI dataset refreshes after each batch load so reports and dashboards reflect the latest accounting data in real time.

Questions

Does ml-connector push all Wave entities into Power BI or only certain records?
ml-connector streams invoices, payments, customers, transactions, products, accounts, vendors, and sales tax records. Wave does not expose bills, purchase orders, employees, or payroll through its GraphQL API, so those are not available for the integration.
What happens when a Wave invoice is updated or deleted?
Wave webhooks fire on invoice.created, invoice.updated, and invoice.paid events. ml-connector transforms each event and posts the updated row to Power BI. Wave invoices can only be created, approved, sent, or deleted - there is no patch operation - so ml-connector receives full invoice state from each webhook and upserts it into Power BI.
How does ml-connector handle Wave and Power BI token expiry?
Wave access tokens expire every 2 hours, and ml-connector refreshes them automatically using the refresh token. Power BI service principal tokens expire after about 1 hour, and ml-connector detects a 401 response and re-authenticates with client credentials. Both credential sets are stored encrypted.

Related integrations

Connect Wave Accounting and Microsoft Power BI

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

Get started