ml-connector
VismaRamp

Visma and Ramp integration

Visma.net ERP handles your accounting, payables, and project costing across the Nordic region. Ramp manages corporate spend with cards, bill pay, and expense tracking. Connecting them keeps your approved bills and purchase orders synchronized so finance teams do not manually re-enter expense data into Visma, and accounting dimensions stay aligned between both systems. ml-connector translates between the two platforms and moves data on a schedule you control, either by webhook events or polling.

How Visma works

Visma.net ERP exposes suppliers, supplier invoices, purchase orders, purchase receipts, accounts, dimensions, and journal transactions through REST APIs. The cloud product authenticates via OAuth 2.0 using the client_credentials flow with a client_id, client_secret, and tenant_id against the Visma Connect token endpoint. All API calls require an ipp-company-id header. Visma supports both webhooks registered via POST to /v1/subscription and delta polling using the lastModifiedDateTime query parameter. Webhooks are one-time delivery with no automatic retry, so ml-connector must detect failed events.

How Ramp works

Ramp exposes bills, vendors, purchase orders, transactions, and GL accounts through a REST Developer API. It authenticates via OAuth 2.0 client credentials flow, with access tokens valid for 10 days. Ramp provides real-time push webhooks for bills, vendors, transactions, and reimbursements with HMAC-SHA256 signature verification. Vendors cannot be created directly; they are implicitly created when a bill is added. Purchase orders are read-only on the API side, and payments are initiated through bill state changes.

What moves between them

The main flow runs from Ramp into Visma. When a bill is created or updated in Ramp, ml-connector reads the bill and creates or updates a corresponding supplier invoice in Visma, mapped to the matching supplier and GL account. Purchase orders from Ramp can be synced into Visma as procurement records. GL account hierarchies and cost dimensions are aligned in both directions so expenses land on the correct accounts in Visma. Because Ramp pushes webhook events for bill changes, ml-connector reacts in near real-time rather than polling.

How ml-connector handles it

ml-connector stores both OAuth credential sets encrypted and uses the client_credentials flow to obtain bearer tokens for each system, refreshing them before expiry. It registers a webhook endpoint with Ramp to receive bill and vendor events in real-time; each webhook carries an HMAC signature that ml-connector validates to prevent spoofing. On the Visma side, it accepts the tenant_id and company_id per customer and includes the required ipp-company-id header on all calls. Because Ramp vendors are implicit, ml-connector first ensures the supplier exists in Visma or creates it from the Ramp vendor data before creating the invoice. GL accounts and cost dimensions are mapped before invoice creation so the entry lands on a valid account in Visma. Ramp webhook notifications are one-time delivery, so ml-connector persists each event and retries failed syncs with exponential backoff. Every record carries a full audit trail and can be replayed if a downstream Visma call fails.

A real-world example

A mid-sized services company uses Ramp for corporate card and bill management across multiple departments, and Visma.net for accounting and project costing. Before the integration, the accounting team reviewed approved bills in Ramp each week and manually entered them into Visma by invoice number and amount, then mapped each one to the correct project code and cost center. This manual re-entry was error-prone and delayed month-end close. With Ramp and Visma connected, each approved bill automatically becomes an invoice in Visma on the correct project and cost center. The accounting team now focuses on exception handling instead of data entry, and the close cycle is shortened by days.

What you can do

  • Read approved bills from Ramp and create supplier invoices in Visma with the correct GL accounts and cost dimensions.
  • Sync purchase orders from Ramp into Visma as procurement records mapped to the correct vendors and projects.
  • Align GL account hierarchies and cost center dimensions in both directions so Ramp expenses land on valid Visma accounts.
  • Handle OAuth 2.0 token refresh for both systems and validate Ramp webhook signatures to ensure bill events are authentic.
  • React to real-time bill and vendor events from Ramp webhooks, with full retry and audit trails on every record.

Questions

How does ml-connector handle the fact that Ramp vendors are created implicitly and Visma requires an explicit supplier record?
ml-connector first checks whether the vendor from a Ramp bill exists as a supplier in Visma. If not, it creates the supplier record using the Ramp vendor name and contact details before creating the invoice. This ensures that every invoice references a valid supplier in Visma and avoids invoice creation errors.
Does the integration work with Ramp webhooks or does it need to poll?
ml-connector subscribes to Ramp webhooks for bill and vendor events, so it reacts to changes in near real-time without polling. Webhooks carry HMAC-SHA256 signatures that ml-connector validates. If a webhook delivery fails, ml-connector tracks the event and retries it with backoff so no bill is left behind.
How are GL accounts and cost dimensions mapped between the two systems?
ml-connector maintains a mapping table between Ramp's GL accounts and cost dimensions and their Visma counterparts (accounts and dimensions entities). When a bill is synced, ml-connector applies the mapping so the invoice in Visma lands on the correct account and cost center, preventing the need for manual re-classification.

Related integrations

Connect Visma and Ramp

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

Get started