ml-connector
VismaAdobe Commerce

Visma and Adobe Commerce integration

Visma.net ERP manages your accounting, AR, AP, and procurement. Adobe Commerce powers your e-commerce storefront and order management. The two systems need to agree on customer records and invoice status. New orders from the storefront should flow into Visma for accounting recognition, and invoice data from both sides must stay aligned to close the books cleanly. ml-connector bridges the different OAuth schemes and keeps both systems fresh without manual re-entry.

How Visma works

Visma.net ERP is a cloud-based accounting and financial management platform covering suppliers, customers, invoices, purchase orders, GL accounts, and dimensions through REST APIs hosted at api.finance.visma.net. All calls authenticate via OAuth 2.0 client credentials against Visma Connect, requiring client_id, client_secret, tenant_id, and the ipp-company-id header on each request. Visma exposes webhooks for real-time notification but they are one-time delivery only with no automatic retry, so ml-connector polls list endpoints using the lastModifiedDateTime query parameter to detect changes. Update operations require an ETag header for optimistic locking. Visma's test clients are rate-limited to 500 calls per hour per company, and refresh tokens are not issued to service applications.

How Adobe Commerce works

Adobe Commerce is an enterprise PaaS and SaaS e-commerce platform exposing orders, invoices, customers, products, and B2B purchase orders through REST (primary) and GraphQL APIs. PaaS deployments at <your-domain>/rest use OAuth 1.0a integration credentials (consumer_key, consumer_secret, access_token, access_token_secret) or Admin bearer tokens. SaaS uses IMS OAuth 2.0 client credentials with a 24-hour token expiry. Webhooks are available on Commerce 2.4.4 and later for synchronous event notification (signed with HMAC SHA256), but they depend on installed modules and version. GL accounts are not exposed as an API resource, so the ERP must apply its own GL rules. Refunds (creditmemos) can be created but not updated.

What moves between them

Customer records move from Adobe Commerce into Visma to keep the customer master file aligned with order activity. Invoice data flows both ways: Adobe Commerce invoices created from orders are sent to Visma as reference records, and Visma supplier invoices tied to purchase orders are polled and recorded in Adobe Commerce for procurement reconciliation. Both flows run on a daily schedule tied to your business cycle, with missed changes picked up on the next poll. GL posting happens in Visma only; Adobe Commerce has no GL endpoint, so ml-connector maps order amounts to Visma's accounts and dimensions.

How ml-connector handles it

ml-connector stores both credential sets encrypted and manages two separate OAuth flows: Visma's client credentials against Visma Connect (with the required ipp-company-id header on every call), and Adobe Commerce's OAuth 1.0a signature (PaaS) or OAuth 2.0 bearer token (SaaS). On the Visma side, it polls customer, invoice, and purchase order lists using lastModifiedDateTime to detect changes since the last sync, and on every update (PUT) it reads the current ETag, includes it in the request, and retries if a 409 conflict occurs due to a race. Adobe Commerce webhooks are preferred when available (version 2.4.4+) for real-time order and invoice notification, but the integration falls back to polling if webhooks are not enabled. Rate-limit handling respects Visma's 500-call-per-hour test limit and Adobe Commerce's per-minute thresholds, backing off exponentially on 429 responses. Every customer, order, and invoice record carries an audit trail and can be replayed if a downstream validation fails.

A real-world example

A mid-market Nordic retailer runs Visma.net ERP for accounting and AP/AR and hosts its online storefront on Adobe Commerce. Before the integration, the order fulfillment and accounting teams worked in parallel: e-commerce staff exported daily orders from Commerce and emailed them to accounting, who then manually entered each order as a customer invoice in Visma, creating a lag of one to three days and frequent entry errors. At the same time, supplier invoices in Visma were printed and filed without being visible to the procurement team in Commerce. With Visma and Adobe Commerce connected, each new order flows automatically into Visma as a customer invoice on the same day, mapped to the correct customer and GL account. Supplier invoices are posted back to Commerce for visibility, and the accounting team can start their close process with all invoices already recorded and reconciled.

What you can do

  • Sync customer master records from Adobe Commerce into Visma so your accounting customer list stays in step with e-commerce orders.
  • Post Adobe Commerce orders into Visma as customer invoices with GL account and dimension mapping.
  • Read Visma supplier invoices and create reference records in Adobe Commerce for procurement visibility.
  • Authenticate both systems securely: Visma via OAuth 2.0 client credentials with required ipp-company-id headers, and Adobe Commerce via OAuth 1.0a (PaaS) or OAuth 2.0 (SaaS).
  • Handle Visma ETag-based optimistic locking, polling on a daily schedule, and fallback to polling if webhooks are unavailable.

Questions

Which direction does data move between Visma and Adobe Commerce?
Customer records and order data move from Adobe Commerce into Visma so orders are recognized for accounting. Supplier invoices flow from Visma back to Adobe Commerce for procurement visibility. Both directions run on a daily schedule, so the two systems stay aligned for close and reconciliation.
Why does the integration need to poll Visma instead of using webhooks?
Visma webhooks are one-time delivery only with no automatic retry, making them unreliable for critical accounting records. ml-connector polls Visma's customer, invoice, and purchase order endpoints using the lastModifiedDateTime parameter to catch all changes reliably. On the Adobe Commerce side, webhooks are used if available (version 2.4.4+) for real-time order notification.
How does ml-connector handle Visma's ETag requirement and OAuth differences between systems?
On Visma updates, ml-connector reads the current ETag, includes it in the PUT request, and retries if a 409 conflict occurs due to a concurrent change. It manages two separate OAuth flows: Visma's client credentials with the required ipp-company-id header on every call, and Adobe Commerce's OAuth 1.0a (PaaS) or OAuth 2.0 (SaaS) bearer token, with encrypted storage of all credentials.

Related integrations

Connect Visma and Adobe Commerce

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

Get started