Skip to main content

Wave

Read and write one Wave business - customers, invoices, products, accounts and ledger transactions - over Wave's GraphQL API.

Connect a Wave business to work its books: list customers, invoices, products, the chart of accounts and ledger transactions with Wave's own totals; read an invoice in full with its lines, taxes and hosted links; create and update customers; create an invoice, approve it into the ledger, and email it to the customer. Wave reports failures inside successful responses at two levels - GraphQL errors and per-mutation didSucceed - and this integration reads both rather than trusting a status code.

Connect

Sign in with Wave Financial. Sign in with Wave to read and write the businesses on your Wave account. An organization admin configures the OAuth app once under Integrations → OAuth apps; after that, connecting is a consent screen.

  • Connecting signs in as YOU - every customer, invoice and product this integration writes is created under your Wave user, and what your account can see is the ceiling.

  • If your Wave account holds more than one business, set Business ID on this connection afterwards. List businesses shows the ids - they are long opaque strings, copied rather than typed.

  • Wave's API is GraphQL only: there is one endpoint and every operation goes through it. Failures arrive with HTTP 200 and an errors array, which this integration reads rather than trusting the status line.

  • For scheduled or triggered automations, connect a dedicated Wave user and bind the automation as a service connection.

SettingRequiredWhat it is
Business ID (BUSINESS_ID)NoThe Wave business id every call acts on (List businesses shows the ids - long opaque strings, copied rather than typed). Leave it empty only when the account holds exactly one business.

Tools

ToolAccessWhat it does
List businesses (yekar.wave.list-businesses)ReadThe Wave businesses this connection's sign-in can reach, with their ids. Every other tool acts on exactly one of them - so when this returns more than one row, the Business ID property on the connection is what decides which. Run this to get the id to put there; Wave ids are opaque strings, so they are copied, never constructed.
List customers (yekar.wave.list-customers)ReadCustomers in this Wave business, with Wave's own count of how many there are. Archived customers come back too and carry isArchived - Wave has no customer delete, so archiving is what removal means here.
Create customer (yekar.wave.create-customer)WriteAdd a customer to this Wave business. NOT idempotent: Wave does not deduplicate on name or email, so calling twice creates two customers that invoices can then be split between. Wave reports a rejected write as didSucceed: false inside an otherwise successful response - this tool raises on that rather than reporting a create that did not happen.
Patch customer (yekar.wave.patch-customer)WriteChange a customer's details, or archive them. Only the fields sent are touched. Archiving (isArchived: true) is Wave's removal - the customer stays on every invoice that already references them, and setting it back to false restores them to the picker.
List invoices (yekar.wave.list-invoices)ReadInvoices in this Wave business, filtered by status, customer or number, with Wave's own count of how many match. This is a summary view - line items are not requested here, so use Get invoice for what an invoice is actually for.
Get invoice (yekar.wave.get-invoice)ReadOne invoice in full - its line items with their products, accounts and taxes, its totals, and Wave's hosted view and PDF links. Amounts come back as decimal STRINGS inside a money object ({value, currency}); they are strings on purpose and parsing them into floats is how cents go missing.
Create invoice (yekar.wave.create-invoice)WriteCreate an invoice for a customer in this Wave business. It is created as a DRAFT: nothing is in the ledger and the customer knows nothing about it. Approve invoice puts it in the books; Send invoice emails it. NOT idempotent - Wave has no idempotency key, so calling twice creates two invoices.
Approve invoice (yekar.wave.approve-invoice)WriteMove a draft invoice into the ledger. This is the accounting event: Wave posts the income and the receivable, the invoice number is committed, and it becomes SAVED. It does NOT email anyone - Send invoice is the separate step. Approving cannot be undone through the API; a mistake is corrected by editing or deleting the invoice in Wave.
Send invoice (yekar.wave.send-invoice)WriteEmail an approved invoice to the addresses given, through Wave. The mail leaves immediately and cannot be recalled, and it tells a real customer they owe money. Put an approval gate in front of it in any automation whose recipients or amount come from a model. Wave requires the invoice to be approved first - Approve invoice is that step.
List products (yekar.wave.list-products)ReadThe products and services this Wave business sells, with their unit price, income account and default sales taxes. Invoice lines are built from these: an invoice line references a productId and inherits its price and tax treatment unless overridden, so this is what to read before creating one.
List accounts (yekar.wave.list-accounts)ReadThe business's chart of accounts, optionally narrowed to one or more account types. Each carries its type, subtype and normal balance direction - which is what tells you whether a positive amount on it is a debit or a credit, and therefore whether a figure read off it means what it appears to.
List transactions (yekar.wave.list-transactions)ReadMoney transactions in this business's ledger, each with its line items and the accounts they hit. Every transaction is double-entry: its line items balance, so reading one line in isolation says nothing about which direction the money moved - read them together with each account's normal balance from List accounts.

Notes

  • Sign in with Wave - every customer and invoice this integration writes is created under your Wave user, and what your account can reach is the ceiling.
  • If your Wave account holds more than one business, run List businesses and put the right id in Business ID on this connection. With several reachable and none configured, every call refuses rather than guessing whose books to write to.
  • Wave ids are long opaque strings. Copy them from a listing; they cannot be constructed or guessed, and a wrong one usually returns an empty field rather than an error.
  • Creating an invoice makes a DRAFT: nothing is in the ledger and the customer knows nothing. Approve invoice books it. Send invoice emails it. They are three separate steps because they have three different consequences.
  • Send invoice needs at least one recipient address - Wave does not fall back to the customer's own - and the mail cannot be recalled.
  • Money is an object whose value is a decimal STRING: {"value": "100.00", "currency": {"code": "USD"}}. Read it as a string; parsing it into a float loses cents.
  • Invoice lines are priced from the PRODUCT unless a unitPrice overrides it, so read List products before building one.
  • For scheduled or triggered automations, connect a dedicated Wave user and bind the automation as a service connection.