ml-connector
VismaMicrosoft Teams

Visma and Microsoft Teams integration

Visma.net runs accounting, AP, payroll, and project costing. Microsoft Teams runs team communication and notifications. Connecting the two lets you surface invoice receipts, payment approvals, and payroll events as messages in Teams channels without manual notification. Finance teams stay informed of critical Visma.net events as they happen, and approvers can track outstanding POs and invoices without switching apps.

How Visma works

Visma.net exposes suppliers, purchase orders, supplier invoices, customers, customer invoices, GL accounts, dimensions, employees, timecards, and expense claims through REST APIs on https://api.finance.visma.net, authenticated with OAuth 2.0 client credentials and a tenant_id header on every call. Visma.net supports both webhooks (one-time delivery, no automatic retry) and polling via lastModifiedDateTime query parameters. Webhook events must be explicitly enabled at the company level, and the service does not issue refresh tokens to daemon connectors, so new tokens are obtained on expiry.

How Microsoft Teams works

Microsoft Teams is accessed through the Microsoft Graph API at https://graph.microsoft.com/v1.0/, supporting OAuth 2.0 client credentials flow via Microsoft Entra ID. Teams accepts webhooks via change subscriptions that must be renewed every 3 days (expiry periods vary by resource type). Teams is messaging and notifications only; it has no native invoice, PO, GL, vendor, or payment objects. Webhook payloads can be encrypted with a customer-supplied public key, and subscriptions are validated by matching clientState rather than HMAC signature.

What moves between them

Invoice and PO events from Visma.net flow into Microsoft Teams channels. When a supplier invoice is posted in Visma.net, ml-connector reads the event via webhook or polling and formats a message summarizing the invoice number, supplier, amount, and due date, then posts it to a designated Teams channel. Purchase order approvals and payroll notifications follow the same pattern. Data flows one direction from Visma.net to Teams; Teams is read-only for notifications and message threading.

How ml-connector handles it

ml-connector stores both OAuth credential sets encrypted and refreshes tokens for both systems as needed. For Visma.net it includes the ipp-company-id header on all API calls and respects optimistic locking via ETag headers on PUT operations. Teams subscriptions are registered for invoice, PO, and employee events and renewed before expiry (3-day default). Visma.net webhooks are registered once per entity and polled for missed events using lastModifiedDateTime to catch any notifications that failed on the one-time delivery. ml-connector handles the rate limit of 500 calls per hour on test clients and retries with exponential backoff when Teams hits Graph API throttling. Every message posted carries a trace back to the original Visma.net record for audit and replay.

A real-world example

A Nordic mid-market wholesale distributor runs Visma.net for procurement and finance, and uses Microsoft Teams for internal communication. Before the integration, the accounts payable team received invoice notifications from Visma.net via email and re-posted summaries to Teams manually, causing delays and duplication. The purchasing team had no visibility into PO approvals and discovered bottlenecks only at month-end. With Visma.net and Teams connected, every invoice received and every PO awaiting approval flows directly to dedicated Teams channels, stamped with amount and status, and the team can approve or escalate without leaving Teams or waiting for email digests.

What you can do

  • Post supplier invoice notifications from Visma.net to Teams channels when invoices are received, with invoice number, supplier, amount, and due date.
  • Route purchase order approvals and status changes to Teams so approvers see POs awaiting sign-off without switching apps.
  • Notify Teams of payroll events and employee timecard submissions so the HR channel stays synchronized with Visma.net payroll records.
  • Authenticate Visma.net with OAuth 2.0 client credentials and ipp-company-id header, and Teams via Microsoft Entra ID, with automatic token refresh.
  • Manage Teams webhook subscriptions with automatic renewal before expiry, and poll Visma.net for missed events using delta queries.

Questions

What records flow from Visma.net to Teams?
Invoice receipts, purchase order approvals, payroll notifications, and employee timecard submissions flow from Visma.net to Teams channels. Teams is messaging-only, so no data flows back into Visma.net. Each message includes the record details and a link to the original transaction in Visma.net.
Does Visma.net's one-time webhook delivery affect reliability?
Visma.net webhooks are sent once and do not retry if your endpoint is temporarily unavailable. ml-connector works around this by also polling Visma.net using lastModifiedDateTime on list endpoints to catch any missed events, so no invoice or approval is lost even if the webhook fails.
How are Teams subscriptions managed given the 3-day expiry?
ml-connector registers change subscriptions for invoices, POs, and employee records and monitors their expiry dates. Subscriptions are renewed automatically before they expire so notifications continue uninterrupted. Each subscription type has a different maximum lifetime (presence is 1 hour, shifts are 6 hours, most others are 3 days), and ml-connector respects those limits.

Related integrations

Connect Visma and Microsoft Teams

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

Get started