ml-connector
Wave AccountingSlack

Wave Accounting and Slack integration

Wave Accounting holds your invoices, customers, and transactions. Slack is where your team collaborates. Connecting the two keeps critical financial events visible in real time. New invoices, payments received, and transaction activity in Wave flow into Slack channels so your team sees cash movement and billing activity without leaving their chat. ml-connector handles the OAuth 2.0 authentication on both sides, Wave's webhook signature verification, and Slack's message formatting.

How Wave Accounting works

Wave Accounting exposes invoices, customers, transactions, products, vendors, and accounts through a GraphQL single-endpoint API at https://gql.waveapps.com/graphql/public, authenticated with OAuth 2.0 (2-hour access token, refresh token with offline_access scope). It publishes webhooks for invoice.created, invoice.updated, invoice.paid, payment.created, customer.created, customer.updated, transaction.created, product.created, and product.updated events. Wave signs all webhook payloads with HMAC-SHA256 and expects an HTTP 200 response to confirm delivery. Invoices cannot be patched, only created, sent, approved, or deleted. The Wave Pro subscription is required for API access.

How Slack works

Slack exposes users, conversations, messages, and files through a REST API at https://slack.com/api/{method}, authenticated with a non-expiring OAuth 2.0 bot token passed in the Authorization header. Slack also delivers workspace events via the Events API, which posts to your HTTPS endpoint with HMAC-SHA256 signatures in the X-Slack-Signature header and requires responses within 3 seconds. Chat.postMessage is rate-limited to one message per second per channel. All webhook requests include a timestamp that must not be older than 5 minutes.

What moves between them

Wave webhook events (invoice.created, invoice.updated, invoice.paid, payment.created, transaction.created) flow into Slack channels as formatted notifications. The main flow is from Wave into Slack; no data moves from Slack back to Wave. Transactions and invoice status changes trigger messages that appear in designated team channels, keyed by customer, invoice status, or transaction type as configured per customer.

How ml-connector handles it

ml-connector subscribes to Wave's webhooks for invoice and payment events, verifies each payload's HMAC-SHA256 signature against Wave's secret, and holds an OAuth 2.0 access token (refreshing when it expires after 2 hours). On receipt of a Wave event, ml-connector fetches additional context from Wave's GraphQL API if needed (customer details, transaction amounts, account names), formats a message block for Slack, and posts it via Slack's chat.postMessage REST endpoint using the bot token. It respects Slack's 1-message-per-second rate limit per channel by queuing messages in high-volume scenarios and respecting Slack's X-RateLimit-Remaining header. Every post carries a timestamp and audit trail, and if a Slack post fails, ml-connector logs the error and can replay the Wave event.

A real-world example

A small-business accounting team uses Wave Accounting to manage invoicing and customer billing, and Slack for team communication. Without the integration, the bookkeeper must log into Wave daily to check which invoices were paid and which customers sent payment, then post status updates to the team's finance channel by hand. With Wave and Slack connected, each paid invoice and new customer transaction automatically appears in the team's Slack channel within seconds, tagged with the customer name and amount. The team sees cash flow in real time and can follow up on late payments immediately, without the bookkeeper's manual posting step.

What you can do

  • Send Wave invoice events (created, updated, paid) to Slack channels with customer and amount details.
  • Post Wave transaction and payment notifications to Slack in real time as they occur.
  • Verify Wave webhook signatures with HMAC-SHA256 and Slack event signatures with constant-time comparison.
  • Refresh Wave OAuth 2.0 tokens automatically when the 2-hour access token expires.
  • Queue and rate-limit Slack message posts to respect the 1-message-per-second channel limit.

Questions

Which direction does data move between Wave and Slack?
Data flows from Wave into Slack only. Invoices, payments, and transactions in Wave are sent as messages to Slack channels. Slack messages do not flow back to Wave. The team communicates in Slack about the financial events, but those messages do not update Wave records.
How does ml-connector handle Wave and Slack authentication?
ml-connector stores Wave's OAuth 2.0 refresh token and uses it to obtain new access tokens every 2 hours before they expire. Slack uses a non-expiring bot token that ml-connector also stores encrypted. Both tokens are sent with each request; ml-connector includes the Wave access token in GraphQL queries and the Slack token in the Authorization header for every API call.
What happens if a Slack message post fails or is slow?
ml-connector logs every post attempt and tracks the Slack API response. If a post fails (network error, rate limit, channel not found), the Wave event is logged and can be replayed to Slack later. If Slack is rate-limited (429 response), ml-connector backs off, checks the X-RateLimit-Remaining header, and requeues the message to respect the 1-per-second-per-channel limit.

Related integrations

Connect Wave Accounting and Slack

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

Get started