ml-connector
VismaServiceNow

Visma and ServiceNow integration

Visma runs your general ledger and supplier master. ServiceNow handles accounts payable and procurement. Connecting them moves invoices from Visma into ServiceNow's AP processing queue automatically, so the invoice data is always current and cost center allocations are validated before they reach AP. Invoices posted through the integration arrive with full audit trails and can be replayed if a downstream posting fails.

How Visma works

Visma.net ERP exposes suppliers, supplier invoices, purchase orders, purchase receipts, general ledger accounts, dimensions, and employee records through REST APIs documented at https://api.finance.visma.net. Authentication uses OAuth 2.0 via Visma Connect with client credentials grant (client_id, client_secret, tenant_id) to https://connect.visma.com/connect/token. All API calls require the ipp-company-id header to identify the company. Visma supports both webhooks (one-time delivery, no automatic retry) and polling with lastModifiedDateTime query parameters to fetch delta changes. Webhook events must be explicitly enabled on the entity in company settings, and test clients are rate-limited to 500 calls per hour per company.

How ServiceNow works

ServiceNow runs on a customer-supplied instance subdomain (https://{instance}.service-now.com) and exposes Accounts Payable, procurement, general ledger accounts, cost centers, and supplier data through REST Table APIs. Authentication uses OAuth 2.0 client credentials (with system property glide.oauth.inbound.client.credential.grant_type.enabled=true) or Basic Auth. The Source-to-Pay Operations suite includes staging tables (sn_apo_invoice, sn_s2p_supplier_inbound_staging) for invoice import, available as module-licensed add-ons. ServiceNow supports polling only; there is no native webhook registration system for connectors. All Table API calls require an authenticated user or service account with appropriate module roles (sn_apay.apo_user for Accounts Payable). OAuth tokens expire in 30 minutes by default.

What moves between them

Supplier invoices and supplier master records flow from Visma into ServiceNow's Accounts Payable staging tables (sn_apo_invoice, sn_s2p_supplier_inbound_staging). ml-connector polls Visma for new and updated supplier invoices using the lastModifiedDateTime parameter, and posts them into ServiceNow's staging layer where ServiceNow's Accounts Payable module ingests and validates them for posting to the general ledger. Cost centers and general ledger account dimensions from Visma are mapped to ServiceNow's cmn_cost_center and itfm_gl_accounts before staging, ensuring every invoice lands on a valid account. The sync runs on a daily or weekly schedule depending on your invoice volume and AP close calendar.

How ml-connector handles it

ml-connector stores both Visma and ServiceNow credentials encrypted, and uses Visma Connect OAuth to obtain a bearer token on each sync run (refresh tokens are not issued to service applications, so a new token is fetched when the prior one expires). On the Visma side, it queries supplier invoices with a lastModifiedDateTime filter to pull only new and changed records since the last run, and it includes the ipp-company-id header on every call. On the ServiceNow side, it connects to the customer's instance subdomain and uses OAuth 2.0 client credentials (or Basic Auth if configured) to authenticate, then stages the invoice data into the Accounts Payable and Source-to-Pay staging tables with cost center and account mappings already resolved. Because ServiceNow has no native outbound webhook system for connectors, ml-connector polls on a fixed schedule rather than waiting for a push. Every invoice staged carries a full audit trail showing when it arrived, which records were mapped, and any validation failures, so failed invoices can be corrected and replayed without re-sending the entire batch.

A real-world example

A mid-sized professional services firm runs Visma as its general ledger and supplier master across multiple departments, and uses ServiceNow's Accounts Payable module for invoice processing and cost allocation. Before the integration, the finance team exported supplier invoices from Visma daily and manually loaded them into ServiceNow's staging table, with each upload requiring verification that the cost center and GL account mappings matched Visma's chart of accounts. With Visma and ServiceNow connected, invoices flow automatically each night during the off-hours sync window, cost centers are validated against the Visma master before staging, and the finance team spends no time on manual uploads or reconciliation.

What you can do

  • Poll supplier invoices from Visma and stage them into ServiceNow Accounts Payable with cost center and GL account mappings pre-validated.
  • Refresh Visma OAuth tokens automatically and handle per-company authentication with the required ipp-company-id header.
  • Route all ServiceNow API calls to the customer-supplied instance subdomain and manage OAuth 2.0 or Basic Auth per deployment.
  • Maintain a full audit trail of every invoice ingested, mapped, and staged, with the ability to replay failed records.
  • Sync on a schedule tied to your AP close calendar or invoice receipt cadence, with exponential backoff retries on transient errors.

Questions

Does ml-connector support ServiceNow's Source-to-Pay staging tables for Accounts Payable?
Yes. ml-connector stages invoices into ServiceNow's sn_apo_invoice and sn_s2p_supplier_inbound_staging tables, which are part of the Source-to-Pay Operations module license. Your ServiceNow instance must have the APO and Procurement modules enabled, and your OAuth service account must have the sn_apay.apo_user role to write to those tables. The integration handles the mapping and validation before staging.
How does ml-connector handle Visma's company-level OAuth and per-company authentication?
Visma requires the ipp-company-id header on every API call to identify which company's data to return. ml-connector obtains a single OAuth 2.0 bearer token using your Visma client credentials and tenant_id, then includes the ipp-company-id header on all supplier and invoice queries. If you have multiple Visma companies, you can configure separate ml-connector flows for each company, each with its own ipp-company-id.
Does the integration push invoices to ServiceNow in real time or on a schedule?
ServiceNow has no native webhook registration system for connectors, so ml-connector polls Visma on a fixed schedule (typically daily or weekly) and stages the results into ServiceNow's AP tables. The schedule is configurable and can be aligned with your AP close calendar or invoice receipt patterns. Every poll uses a lastModifiedDateTime filter to fetch only new and changed invoices since the previous run, minimizing data transfer and API calls.

Related integrations

Connect Visma and ServiceNow

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

Get started