Wave Accounting and Adyen integration
Wave Accounting handles invoicing and bookkeeping for a small business. Adyen processes card payments, refunds, and payouts. Connecting the two brings settled payment activity into the books without re-keying. After each Adyen settlement, captured amounts, refunds, and processing fees post into Wave Accounting as money transactions against the right chart-of-accounts entries, and an invoice can be marked paid once its payment clears in Adyen. ml-connector handles the very different APIs on each side and reconciles payments to the ledger on the cadence you set.
What moves between them
The flow runs from Adyen into Wave Accounting. ml-connector consumes each Adyen settlement and reconciliation report and writes the resulting money transactions into Wave: captured payments, refunds, and processing fees, each mapped to the matching Wave chart-of-accounts entry. The REPORT_AVAILABLE and capture webhooks trigger the work as soon as activity settles, and a scheduled poll backfills anything a webhook missed. Where an Adyen payment maps to a Wave invoice by reference, that invoice is marked paid. Adyen is treated as a read-only accounting source, so ml-connector never writes payment instructions or financial entries back into Adyen.
How ml-connector handles it
ml-connector stores both credential sets encrypted: the Adyen API key plus merchant account and live URL prefix on one side, and the Wave OAuth2 client and refresh token on the other. Because Wave access tokens expire in about two hours, it refreshes the token ahead of expiry rather than waiting for a failed call, and it resolves the businessId once and reuses it on every GraphQL query and mutation. Adyen has no batch transaction pull, so the integration listens for the REPORT_AVAILABLE webhook, downloads the settlement report from the signed URL, and parses each line; capture and refund webhooks confirm individual outcomes. Each settlement line becomes a Wave money transaction whose externalId is derived from the Adyen pspReference, which Wave uses as a dedup key so a redelivered report or a retry never posts the same journal twice. HMAC-SHA256 signatures are verified before any Adyen or Wave webhook is processed, both stale by more than five minutes are rejected on the Wave side, and rate-limit responses are retried with backoff. Fees, refunds, and chargebacks are mapped to specific accounts first, so every posted transaction references an account that already exists in Wave. Because Wave has no purchase order or AP bill object, payment activity lands as money transactions and invoice status changes rather than as bills.
A real-world example
An online specialty retailer with about fifteen staff runs Wave Accounting for its books and takes card payments through Adyen across its web store and a pop-up terminal. Before the integration, the bookkeeper exported Adyen settlement reports each week and hand-keyed the gross sales, refunds, and processing fees into Wave as journal entries, then spent time matching payouts against the bank deposit and figuring out which invoices had actually been paid. With Wave Accounting and Adyen connected, every settlement posts into Wave automatically with fees and refunds split to the right accounts, and invoices are marked paid as their payments clear. The weekly re-keying disappears and the books reconcile to the Adyen payout without the manual matching.
What you can do
- Post Adyen settlement lines into Wave Accounting as money transactions after every settlement report.
- Split captured payments, refunds, and processing fees to the correct Wave chart-of-accounts entries.
- Mark Wave invoices paid when a matching Adyen payment clears.
- Bridge Adyen API-key auth and the Wave OAuth2 token, refreshing the Wave token before it expires.
- Dedup on the Adyen pspReference so a redelivered report never double-posts a journal in Wave.
Questions
- Which direction does data move between Wave Accounting and Adyen?
- Data moves from Adyen into Wave Accounting. Settlement reports, captures, and refunds from Adyen become money transactions in Wave, and matching invoices are marked paid. Adyen is treated as a read-only accounting source, so ml-connector never writes payment instructions or financial entries back into Adyen.
- How does the integration get Adyen transaction data without a batch pull API?
- Adyen has no batch endpoint for historical transactions, so reconciliation reports are the canonical accounting source. ml-connector subscribes to the REPORT_AVAILABLE webhook, downloads each settlement report from its signed URL, and parses the lines. Capture and refund webhooks confirm individual outcomes, and a scheduled poll backfills anything a webhook missed.
- How does it avoid duplicate journal entries in Wave on a retry?
- Wave's money transaction mutation accepts an externalId that it uses as a dedup key. ml-connector derives that id from the Adyen pspReference, so resending the same settlement line or retrying after a failure does not post the journal twice. Webhook signatures are verified with HMAC-SHA256 before any record is processed.
Related integrations
More Wave Accounting integrations
Other systems that connect to Adyen
Connect Wave Accounting and Adyen
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started