Visma and SAP Concur integration
Visma.net ERP runs accounting, payroll, and purchasing. SAP Concur manages travel, expenses, and vendor invoices. Connecting them keeps your expense spend visible in your financial records without manual re-entry. Expense reports and invoices from SAP Concur post automatically into Visma's general ledger, allocated to the correct cost centers and GL accounts. Employee expense claims and business travel are captured in both systems, so your expense accounts stay accurate and your audit trail stays clean.
What moves between them
The main flow runs from SAP Concur into Visma. Expense reports and invoices submitted in SAP Concur are read via the Event Subscription Service webhooks and posted into Visma as supplier invoices and journal transactions, mapped to the correct Visma GL accounts, cost centers, and dimensions. Employee data is synchronized so Visma headcount reflects SAP Concur users. The flow is one-directional: Visma does not write back to SAP Concur. Expense-to-GL posting happens on a cadence determined by your SAP Concur approval workflow, typically daily or after each batch close.
How ml-connector handles it
ml-connector handles the fundamental differences between the two systems. SAP Concur requires geolocation routing: the OAuth2 token response specifies which datacenter (us, emea, or cn) to use for all subsequent API calls, and ml-connector caches this per customer and routes all requests to the correct region. Visma requires the ipp-company-id header on every call and does not issue refresh tokens to service applications, so ml-connector obtains a new token on each expiry rather than refreshing. ml-connector subscribes to SAP Concur's Event Subscription Service for expense reports and payment requests, validates the webhook signature against the mutual TLS certificate, and posts matching invoices into Visma's supplier invoice endpoint with the correct GL account and cost center dimension. Expense line items are reconciled against Visma dimensions before posting to prevent orphaned entries. Retries are handled by SAP Concur's built-in webhook retry mechanism, and every invoice record carries an audit trail in Visma.
A real-world example
A Nordic professional services firm uses Visma for accounting and payroll and SAP Concur for employee travel and expense reports. Before the integration, expenses submitted in SAP Concur sat in the system until month-end, when the finance team exported summaries and manually entered each invoice into Visma's AP register. This created a gap in the GL: recorded expenses did not appear in Visma until days after they were incurred, making month-end close difficult and expense reports impossible to audit in real time. With Visma and SAP Concur connected, each expense report approved in SAP Concur posts immediately into Visma as an invoice, the GL account is updated the same day, and the expense report number is tracked in Visma's audit trail so any finance question points back to the source document.
What you can do
- Post approved expense reports from SAP Concur into Visma as supplier invoices, mapped to the correct GL accounts and cost centers.
- Sync employee data from SAP Concur into Visma so headcount and cost allocations stay aligned.
- Route API calls to the correct SAP Concur datacenter based on geolocation in the OAuth2 token.
- Manage Visma tenant isolation and token expiry so each customer's data stays separate and secure.
- Maintain a full audit trail in Visma linking each posted expense to the original SAP Concur report.
Questions
- Does ml-connector handle SAP Concur's geolocation requirement?
- Yes. When ml-connector exchanges the auth_token for an access token, SAP Concur returns a geolocation (us, emea, or cn) in the response. ml-connector caches this per customer and routes all subsequent API calls to the correct regional base URL. Hardcoding the region would cause API calls to fail.
- How does ml-connector manage the different token lifecycles between Visma and SAP Concur?
- SAP Concur issues a 1-hour access token and a 6-month refresh token; ml-connector refreshes the access token when it expires. Visma does not issue refresh tokens to service applications, so ml-connector obtains a new token on expiry using the stored client_id and client_secret. Each system's token is cached separately.
- What happens if an expense report in SAP Concur references a cost center that does not exist in Visma?
- ml-connector validates each cost center and GL account dimension against Visma before posting the invoice. If a match is not found, the invoice is held in a failed-records queue with the original report number in the audit trail, and an alert is sent so the dimensions can be reconciled. The invoice can be replayed once the missing dimension is created in Visma.
Related integrations
More Visma integrations
Other systems that connect to SAP Concur
Connect Visma and SAP Concur
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started