Wave integration | Zervanor
← All connectors

Wave

Also an agent tool
finance-billing

Wave Accounting GraphQL automation. Every action is a single POST /graphql/public with a named query/mutation + variables in the JSON body. Covers businesses, customers, vendors, products & services, chart of accounts, invoices (CRUD + send/approve/mark-sent), money (accounting) transactions, tax/sales-tax rates, currencies, countries, the current user, and business subscription. Failures come back as HTTP 200 with a top-level 'errors' array (response_error_field). Bearer full-access token auth; no inbound webhooks — new/updated invoices and transactions are surfaced by polling.

34 actions · 2 triggers

The Wave integration lets you connect Wave to your automations with 34 actions and 2 triggers — and every action is also a tool an AI agent can call. Examples: Get Current User, List Businesses, Get Business, List Customers, Get Customer. No blank-canvas wiring — connect it and use it in your workflows.

Every action below is also a tool an AI agent can call — the same pack powers your workflows and your agents.

Triggers 2

Events in Wave that can start a workflow.

polling

New / updated Wave invoices

Polls the invoices query on a schedule, paging through results with variables.page.

polling

New / updated Wave money transactions

Polls the transactions query on a schedule, paging through results with variables.page.

Actions 34

What Zervanor can do in Wave.

POST

Get Current User

Fetch the authenticated Wave user (identity / connectivity probe). POST /graphql/public { user { id defaultEmail firstName lastName } }.

POST

List Businesses

List the businesses the token can access (page paginated). POST /graphql/public query businesses($page:Int,$pageSize:Int){ businesses(page:$page,pageSize:$pageSize){ pageInfo{ currentPage totalPages totalCount } edges{ node{ id name isPersonal } } } }.

POST

Get Business

Fetch a single business by id. POST /graphql/public query business($id:ID!){ business(id:$id){ id name isPersonal currency{ code } } }.

POST

List Customers

List customers within a business (page paginated). POST /graphql/public query customers($businessId:ID!,$page:Int,$pageSize:Int){ business(id:$businessId){ customers(page:$page,pageSize:$pageSize){ pageInfo{ currentPage totalPages totalCount } edges{ node{ id name email } } } } }.

POST

Get Customer

Fetch a single customer by id within a business. POST /graphql/public query customer($businessId:ID!,$customerId:ID!){ business(id:$businessId){ customer(id:$customerId){ id name email phone } } }.

POST

Create Customer

Create a customer. POST /graphql/public mutation CustomerCreate($input:CustomerCreateInput!){ customerCreate(input:$input){ didSucceed inputErrors{ code message path } customer{ id name } } }.

POST

Update Customer

Update (patch) a customer. POST /graphql/public mutation CustomerPatch($input:CustomerPatchInput!){ customerPatch(input:$input){ didSucceed inputErrors{ code message path } customer{ id name } } }.

POST

Delete Customer

Delete a customer. POST /graphql/public mutation CustomerDelete($input:CustomerDeleteInput!){ customerDelete(input:$input){ didSucceed inputErrors{ code message path } } }.

POST

List Vendors

List vendors within a business (page paginated). POST /graphql/public query vendors($businessId:ID!,$page:Int,$pageSize:Int){ business(id:$businessId){ vendors(page:$page,pageSize:$pageSize){ pageInfo{ currentPage totalPages totalCount } edges{ node{ id name email } } } } }.

POST

Get Vendor

Fetch a single vendor by id within a business. POST /graphql/public query vendor($businessId:ID!,$vendorId:ID!){ business(id:$businessId){ vendor(id:$vendorId){ id name email } } }.

POST

Create Vendor

Create a vendor. POST /graphql/public mutation VendorCreate($input:VendorCreateInput!){ vendorCreate(input:$input){ didSucceed inputErrors{ code message path } vendor{ id name } } }.

POST

Update Vendor

Update (patch) a vendor. POST /graphql/public mutation VendorPatch($input:VendorPatchInput!){ vendorPatch(input:$input){ didSucceed inputErrors{ code message path } vendor{ id name } } }.

POST

Delete Vendor

Delete a vendor. POST /graphql/public mutation VendorDelete($input:VendorDeleteInput!){ vendorDelete(input:$input){ didSucceed inputErrors{ code message path } } }.

POST

List Products & Services

List products / services within a business (page paginated). POST /graphql/public query products($businessId:ID!,$page:Int,$pageSize:Int){ business(id:$businessId){ products(page:$page,pageSize:$pageSize){ pageInfo{ currentPage totalPages totalCount } edges{ node{ id name unitPrice } } } } }.

POST

Create Product

Create a product / service. POST /graphql/public mutation ProductCreate($input:ProductCreateInput!){ productCreate(input:$input){ didSucceed inputErrors{ code message path } product{ id name } } }.

POST

Update Product

Update (patch) a product / service. POST /graphql/public mutation ProductPatch($input:ProductPatchInput!){ productPatch(input:$input){ didSucceed inputErrors{ code message path } product{ id name } } }.

POST

List Accounts (Chart of Accounts)

List the chart of accounts within a business (page paginated). POST /graphql/public query accounts($businessId:ID!,$page:Int,$pageSize:Int){ business(id:$businessId){ accounts(page:$page,pageSize:$pageSize){ pageInfo{ currentPage totalPages totalCount } edges{ node{ id name type{ name } subtype{ name } } } } } }.

POST

List Invoices

List / filter invoices within a business (page paginated). POST /graphql/public query invoices($businessId:ID!,$page:Int,$pageSize:Int){ business(id:$businessId){ invoices(page:$page,pageSize:$pageSize){ pageInfo{ currentPage totalPages totalCount } edges{ node{ id invoiceNumber status total{ value } modifiedAt } } } } }.

POST

Get Invoice

Fetch a single invoice by id within a business. POST /graphql/public query invoice($businessId:ID!,$invoiceId:ID!){ business(id:$businessId){ invoice(id:$invoiceId){ id invoiceNumber status total{ value } customer{ id name } items{ product{ id } quantity } } } }.

POST

Create Invoice

Create an invoice. POST /graphql/public mutation InvoiceCreate($input:InvoiceCreateInput!){ invoiceCreate(input:$input){ didSucceed inputErrors{ code message path } invoice{ id invoiceNumber } } }.

POST

Update Invoice

Update (patch) an invoice. POST /graphql/public mutation InvoicePatch($input:InvoicePatchInput!){ invoicePatch(input:$input){ didSucceed inputErrors{ code message path } invoice{ id } } }.

POST

Delete Invoice

Delete an invoice. POST /graphql/public mutation InvoiceDelete($input:InvoiceDeleteInput!){ invoiceDelete(input:$input){ didSucceed inputErrors{ code message path } } }.

POST

Send Invoice

Email an invoice to recipients. POST /graphql/public mutation InvoiceSend($input:InvoiceSendInput!){ invoiceSend(input:$input){ didSucceed inputErrors{ code message path } } }.

POST

Approve Invoice

Approve a draft invoice. POST /graphql/public mutation InvoiceApprove($input:InvoiceApproveInput!){ invoiceApprove(input:$input){ didSucceed inputErrors{ code message path } invoice{ id status } } }.

POST

Mark Invoice Sent

Mark an invoice as sent without emailing it. POST /graphql/public mutation InvoiceMarkSent($input:InvoiceMarkSentInput!){ invoiceMarkSent(input:$input){ didSucceed inputErrors{ code message path } invoice{ id status } } }.

POST

List Money Transactions

List / filter money (accounting) transactions within a business (page paginated). POST /graphql/public query transactions($businessId:ID!,$page:Int,$pageSize:Int){ business(id:$businessId){ transactions(page:$page,pageSize:$pageSize){ pageInfo{ currentPage totalPages totalCount } edges{ node{ id date description modifiedAt } } } } }.

POST

Get Money Transaction

Fetch a single money transaction by id within a business. POST /graphql/public query transaction($businessId:ID!,$transactionId:ID!){ business(id:$businessId){ transaction(id:$transactionId){ id date description lineItems{ account{ id name } amount{ value } } } } }.

POST

Create Money Transaction

Record a money (accounting) transaction. POST /graphql/public mutation MoneyTransactionCreate($input:MoneyTransactionCreateInput!){ moneyTransactionCreate(input:$input){ didSucceed inputErrors{ code message path } transaction{ id } } }.

POST

List Tax Rates

List sales-tax rates within a business (page paginated). POST /graphql/public query salesTaxes($businessId:ID!,$page:Int,$pageSize:Int){ business(id:$businessId){ salesTaxes(page:$page,pageSize:$pageSize){ pageInfo{ currentPage totalPages totalCount } edges{ node{ id name rate abbreviation } } } } }.

POST

Create Sales Tax

Create a sales-tax rate. POST /graphql/public mutation SalesTaxCreate($input:SalesTaxCreateInput!){ salesTaxCreate(input:$input){ didSucceed inputErrors{ code message path } salesTax{ id name } } }.

POST

List Currencies

List the currencies Wave supports. POST /graphql/public { currencies{ code symbol name plural } }.

POST

List Countries

List the countries Wave supports (with provinces). POST /graphql/public { countries{ code name currency{ code } } }.

POST

Get Business Subscription

Fetch a business's Wave subscription / plan details. POST /graphql/public query businessSubscription($businessId:ID!){ business(id:$businessId){ id subscription{ startedAt endedAt } } }.

POST

GraphQL (Raw)

Execute an arbitrary GraphQL query or mutation against POST /graphql/public. Escape hatch for operations not exposed as a named action; HTTP-200-with-errors is still classified as failure via response_error_field.

Automations using Wave

Build your own automation with Wave in the visual builder.

Frequently asked questions

What can I automate with Wave?

34 actions are available — for example: Get Current User, List Businesses, Get Business, List Customers, Get Customer, and more.

Which Wave events can start a workflow?

2 triggers — for example: New / updated Wave invoices, New / updated Wave money transactions.

Can Wave be used as an AI agent tool?

Yes. Every Wave action automatically becomes a tool an AI agent can call — the same pack powers both your workflows and your agents.

How is the Wave integration modelled?

Wave is modelled as a versioned connector pack, and the steps that need reasoning fall to first-party agents hosted in the same runtime as the workflows.