Wave Accounting and Plaid integration
Wave Accounting tracks your small business invoicing and expenses. Plaid connects you to your bank accounts and financial institutions. Linking them keeps your Wave ledger in sync with your actual bank activity. Invoices in Wave flow to Plaid for payment initiation, and bank transactions flow back to Wave to auto-match against your recorded expenses and sales. ml-connector handles the OAuth2 credentials, webhook signatures, and the fact that Wave uses GraphQL while Plaid uses REST.
What moves between them
Invoices and transactions flow from Wave Accounting to Plaid for matching and transfer initiation. Bank account balances and cleared transactions flow from Plaid back to Wave's transaction records. The sync is bidirectional with Wave webhooks triggering on invoice changes, payments, and transactions, and Plaid webhooks notifying on transaction updates and transfer events. New transfers initiated in Plaid are recorded in Wave as transactions; payments received in Plaid update the paid status of matching Wave invoices.
How ml-connector handles it
ml-connector stores Wave OAuth2 refresh tokens and Plaid client credentials encrypted and manages token refresh automatically when calls return 401. Wave invoices are queried through GraphQL and mapped to Plaid transaction descriptions and transfer events; because Plaid transaction history is limited to 24 months, ml-connector tracks a high-water mark to avoid re-processing. Plaid transfers require idempotency keys (max 50 characters) and description length constraints (max 10 characters for ACH). Wave webhook signatures are verified using HMAC-SHA256 against the x-wave-signature header with a 5-minute replay window; Plaid webhook signatures use JWT (ES256) verification with the JWK public key and require the iat claim to be within 5 minutes. Both systems are polled periodically and also receive push notifications when enabled. API versioning is controlled via Plaid-Version header (current stable is 2020-09-14), and TLS 1.2 is required. Every transaction and transfer carries a full audit trail for debugging and replay.
A real-world example
A small business accountant manages invoicing and client AR in Wave Accounting and reconciles bank deposits in Plaid daily. Before the integration, the accountant manually exported Wave invoices and matched them against Plaid transaction reports at month-end, spending hours tracking which payments had cleared and which invoices were overdue. With Wave and Plaid connected, every paid invoice automatically reflects in Wave's status, and every bank transaction is pulled into Wave as a transaction record with the invoice it matches. Month-end reconciliation takes minutes instead of hours, and the accountant spots anomalies (duplicate deposits, missing payments) immediately.
What you can do
- Sync Wave invoices to Plaid and receive bank transaction updates back to Wave automatically via webhooks.
- Initiate ACH and wire transfers from Plaid that are recorded as transactions in Wave with full accounting detail.
- Match Plaid bank transactions against Wave invoices and mark them paid when deposits clear.
- Manage Wave OAuth2 refresh tokens and Plaid API credentials securely, with automatic token refresh on 401.
- Track transaction history with a high-water mark and idempotency keys to prevent duplicate processing and re-entry.
Questions
- Which direction does data flow between Wave Accounting and Plaid?
- Data flows in both directions. Wave invoices and transaction records flow to Plaid for matching and transfer initiation. Bank account balances, cleared transactions, and transfer events flow from Plaid back to Wave to update invoice status and record bank activity. The flow is triggered by webhook notifications on both sides and periodic polling.
- How does ml-connector handle the difference between Wave's GraphQL and Plaid's REST API?
- ml-connector maintains separate clients for each platform. Wave GraphQL queries retrieve invoices and transactions; Plaid REST calls fetch balances, transactions, and initiate transfers. The two are linked through mapped fields: Wave invoices map to Plaid transaction descriptions, and Plaid transfers map back to Wave transaction records with accounting detail.
- What happens if a Plaid transfer description or Wave invoice exceeds the allowed length?
- Plaid transfer descriptions are limited to 10 characters for ACH and 15 for RTP. ml-connector truncates or summarizes Wave invoice details to fit Plaid's constraints. Wave invoices have no length limit. ml-connector tracks idempotency keys (max 50 characters) for 48 hours to prevent duplicate transfers if a Plaid call is retried.
Related integrations
More Wave Accounting integrations
Other systems that connect to Plaid
Connect Wave Accounting and Plaid
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started