ml-connector
VismaAdyen

Visma and Adyen integration

Visma.net ERP runs your accounting and AR. Adyen processes your payments. Connecting the two reconciles every payment capture and refund into your general ledger without manual re-keying. Customer invoices in Visma.net are linked to payment captures in Adyen, and settlement reports automatically post cash and processing fees into your GL accounts. Payment refunds and disputes flow back into AR, keeping your cash account and customer ledger in perfect agreement.

How Visma works

Visma.net ERP is a cloud accounting platform offering suppliers, purchase orders, supplier invoices, customer invoices, GL accounts, cost centers, and journals through REST APIs. It authenticates via OAuth 2.0 using client_credentials grant against Visma Connect, with all API calls requiring an ipp-company-id header. Visma.net supports webhooks registered via POST /v1/subscription for real-time entity change notification, but webhook delivery is one-time without automatic retry. Delta polling is available via lastModifiedDateTime on list endpoints, and GET /v1/event returns available event types.

How Adyen works

Adyen is a global payment technology platform exposing payment data through REST APIs in multiple areas: Checkout API for payment authorization and capture, Management API for merchant and account management, and Transfers API for balance platform operations. Adyen authenticates with API Key via X-API-Key header or Basic Auth, and sends payment and dispute events via webhooks using HMAC-SHA256 signature verification. Key events include AUTHORISATION, CAPTURE, REFUND, CANCELLATION, and REPORT_AVAILABLE. Adyen has no native vendor, invoice, GL account, or cost-center entities; it is payments-only.

What moves between them

Payment and dispute events flow from Adyen into Visma.net. ml-connector receives Adyen webhook notifications for payment captures, refunds, and chargebacks, links them to customer invoices in Visma.net via order reference or customer ID, and posts reconciliation journals into Visma.net's GL. Settlement reports from Adyen (triggered via REPORT_AVAILABLE webhook) are polled daily and their net cash proceeds are journaled to the designated cash GL account, with processing fees posted to an expense account. Refunds and chargebacks automatically reverse or reduce the associated customer invoice in AR.

How ml-connector handles it

ml-connector stores both credential sets encrypted and validates Adyen webhook signatures using HMAC-SHA256 on every incoming event. On the Visma.net side, it uses OAuth 2.0 client_credentials to obtain bearer tokens and refresh them before expiry; all API calls include the required ipp-company-id header. Because Visma.net does not expose a payment entity, ml-connector maps Adyen payments to Visma.net customer invoices by order reference, merchant reference, or customer ID. Settlement reports are polled once daily and parsed to extract net proceeds and fees. Each payment capture, refund, and settlement is recorded in Visma.net as a GL transaction with a full audit trail, making it possible to replay the posting if a downstream journal entry fails. Adyen's one-time webhook delivery means ml-connector maintains a dedup cache keyed by Adyen transaction ID to prevent double-posting.

A real-world example

A mid-sized Nordic e-commerce retailer uses Visma.net ERP for accounting and customer AR, and Adyen to process online card payments across multiple channels. Before the integration, the finance team downloaded Adyen settlement reports each morning, manually matched payments to customer invoices in Visma.net, and posted the cash and fees to the GL by hand. Month-end reconciliation required hours of chasing discrepancies between Adyen's settlement total and the cash GL account. After connecting Visma.net and Adyen, every payment capture, refund, and chargeback posts to the GL automatically on the day of settlement. Customer AR is kept in sync with payment status, and the cash account reconciles to Adyen's net settlement with no manual intervention.

What you can do

  • Reconcile Adyen payment captures, refunds, and chargebacks into Visma.net customer invoices and the general ledger.
  • Post Adyen settlement reports to Visma.net's cash GL account daily, with processing fees allocated to an expense account.
  • Verify Adyen webhook signatures using HMAC-SHA256 and prevent duplicate postings with a dedup cache.
  • Authenticate Adyen with API Key and Visma.net with OAuth 2.0, refreshing tokens before expiry and including required headers on all calls.
  • Track payment disputes and refunds with a full audit trail in Visma.net, making each transaction replayable if a GL post fails.

Questions

How does the integration handle the fact that Adyen has no native invoice or GL account entities?
ml-connector treats Adyen as a pure payment processor and maps its transactions to Visma.net's existing customer invoices and GL accounts. Payment captures are linked to customer invoices via order or merchant reference, settlement reports are posted to a designated cash GL account, and fees go to an expense account. This keeps the two systems in sync without requiring Adyen to expose financial entities it does not have.
What happens if an Adyen webhook is not received or fails during delivery?
Adyen sends webhooks one time only without automatic retry. ml-connector runs a daily settlement report poll to catch any missed events and fill gaps. All transactions are stored with an Adyen transaction ID and a dedup cache prevents the same payment from posting twice if a webhook arrives late or is re-sent.
How are Visma.net's OAuth 2.0 token refresh and API call headers managed?
ml-connector caches the Visma.net OAuth 2.0 bearer token and refreshes it before expiry using the stored client credentials. Every API call includes the required ipp-company-id header in the request. If a call returns an auth error, the token is refreshed and the call is retried automatically.

Related integrations

Connect Visma and Adyen

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

Get started