ml-connector
VismaMarketo

Visma and Marketo integration

Visma.net ERP holds your customer and supplier master data and general ledger accounts. Marketo runs your B2B marketing campaigns and lead scoring. Connecting the two keeps your Marketo company profiles in sync with your Visma customer and supplier records, and ensures new accounts, name changes, and payment status from Visma flow into your marketing operations without re-keying. ml-connector bridges the very different authentication models and API shapes on each side.

How Visma works

Visma.net ERP is a cloud-based accounting and financial management system that exposes customers, suppliers, purchase orders, invoices, journal transactions, and chart of accounts through REST APIs. Authentication uses OAuth 2.0 via Visma Connect with client_credentials grant flow, and requires an ipp-company-id header on every API call. Visma publishes events via webhooks for one-time notification, but webhooks have no automatic retry if the receiver is unavailable, so reliable integration requires polling the list endpoints using the lastModifiedDateTime query parameter to fetch changes since the last sync.

How Marketo works

Marketo is a B2B marketing automation platform that manages leads, companies, opportunities, programs, and campaigns. It exposes data through REST APIs secured with OAuth 2.0 client credentials, with tokens that expire after one hour. Marketo does not support inbound webhooks, so all integrations must poll the REST API using GET endpoints such as /rest/v1/leads.json or the Bulk Activity Extract API. Batch requests are limited to 300 records per call, and the Bulk API has a 31-day query window. Marketo instances are identified by a unique Munchkin ID that forms part of the API endpoint hostname.

What moves between them

Customer and supplier records flow from Visma into Marketo. On each sync cycle, ml-connector reads Visma customers and suppliers using the lastModifiedDateTime parameter to fetch only records changed since the last poll, maps them to Marketo company records or custom objects, and creates or updates them in batches of 300. Visma payments status, account names, and contact dimensions are synced to keep Marketo company profiles current. Reference data such as customer categories and supplier payment terms flow one-way from Visma to Marketo.

How ml-connector handles it

ml-connector stores both OAuth 2.0 credential sets encrypted and refreshes the Visma and Marketo bearer tokens on a schedule, retrying if either endpoint returns 401. On the Visma side it reads the company ID from the credential set and includes the required ipp-company-id header on every list query. Because Visma supports webhooks only for one-time notification without retry, ml-connector polls Visma customers and suppliers on a configurable schedule tied to your account maintenance cadence, using the lastModifiedDateTime query parameter to fetch deltas since the last sync. Marketo batch inserts and updates are split into 300-record chunks to respect Marketo's batch limit, and each request is wrapped with a job ID for idempotent replay if a downstream Marketo write fails. The integration tracks Marketo's unique Munchkin ID per instance and routes all Marketo calls to the correct subdomain.

A real-world example

A mid-market B2B software vendor runs Visma.net ERP for accounting and customer billing in the Nordic region, and uses Marketo for lead generation and account-based marketing campaigns. Before integration, the marketing team manually imported customer account lists from Visma into Marketo every quarter, leading to stale company profiles and missed signals when a customer changed payment status or location. With Visma and Marketo connected, each new customer or supplier added to Visma automatically flows into Marketo as a company record within an hour, payment terms and account status sync continuously, and the sales team's target account lists stay current without manual pulls. The marketing operations team no longer spends a day per month on data reconciliation.

What you can do

  • Sync Visma customers and suppliers to Marketo companies and custom objects on a polling schedule.
  • Map Visma customer categories, payment status, and contact dimensions to Marketo company fields and custom object attributes.
  • Handle OAuth 2.0 token refresh for both Visma and Marketo, retrying on 401 errors.
  • Batch Marketo inserts and updates in 300-record chunks and track job IDs for idempotent replay.
  • Poll Visma on a schedule and use the lastModifiedDateTime query parameter to fetch only changed records since the last sync.

Questions

Why does ml-connector poll Visma instead of using webhooks?
Visma webhooks are one-time notifications with no automatic retry, so a failed delivery means the change is lost. ml-connector polls Visma customers and suppliers using the lastModifiedDateTime query parameter on a schedule tied to your account maintenance cycle. This ensures no changes are missed and allows replaying a sync if a Marketo write fails.
How does ml-connector handle the different batch limits between Visma and Marketo?
Visma list endpoints return up to 100 records per call by default. ml-connector fetches all changed Visma records across multiple paginated calls, then batches them into 300-record chunks for Marketo's batch API. Each Marketo batch is tagged with a job ID, so if a write fails it can be replayed without creating duplicates.
What happens when a Visma or Marketo OAuth token expires?
ml-connector refreshes both tokens on a schedule before expiry. If a call returns 401, ml-connector immediately refreshes the token and retries the request. Visma requires the ipp-company-id header on every call, and ml-connector includes it automatically from the stored credential set.

Related integrations

Connect Visma and Marketo

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

Get started