ml-connector
VismaTableau

Visma and Tableau integration

Visma.net ERP holds the source of truth for your accounting and purchasing data. Tableau creates the dashboards that give you visibility into cash flow, aging, expense trends, and invoice status. Connecting the two keeps Tableau dashboards current with your Visma financial records so stakeholders see up-to-date P&L, customer aging, and vendor performance without manual data export and refresh. ml-connector syncs the records on a cadence you control and handles the different authentication and sync patterns on each side.

How Visma works

Visma.net ERP exposes suppliers, supplier invoices, purchase orders, purchase receipts, customers, customer invoices, general ledger accounts, dimensions, journal transactions, employees, and timecards through REST APIs at https://api.finance.visma.net. All calls require OAuth 2.0 via Visma Connect with client_credentials grant and an ipp-company-id header specifying the tenant. Visma publishes webhook notifications (one-time delivery with no automatic retry if the receiver is temporarily unavailable) and also supports delta polling via lastModifiedDateTime on list endpoints. Webhook events must be explicitly enabled in company settings. Refresh tokens are not issued to service applications, so tokens must be obtained fresh on each expiry. PUT operations require ETag headers for optimistic locking.

How Tableau works

Tableau is available as SaaS (Tableau Cloud) or self-hosted (Tableau Server) and exposes workbooks, data sources, projects, users, and permissions through REST APIs at https://{pod}.online.tableau.com/api/3.29/ or your server instance. Authentication uses personal access tokens (PAT) that return a 240-minute session token on signin, or Connected App JWT. Views are read-only derived objects and cannot be written to. Tableau webhooks send 24 event types including datasource-created, datasource-refresh-succeeded, and workbook-updated, but webhook payload has no HMAC signature verification so you must validate via a secret token in the URL. PAT tokens expire after 15 days of non-use on Cloud and 1 year on Server.

What moves between them

The main flow is Visma into Tableau. Supplier invoices, customer invoices, accounts, and dimensions from Visma flow into Tableau data sources on a schedule you set, typically daily or after significant accounting events such as month-end close. Account balances, aging data, and dimension hierarchies update in sync so Tableau dashboards showing AP aging, AR aging, and GL detail reports stay current. Tableau views are read-only, so ml-connector never writes back to Tableau. Master data such as customers and suppliers syncs bidirectionally so Tableau permissions and user access rules reference valid entities.

How ml-connector handles it

ml-connector stores the Visma client_id and client_secret encrypted and obtains a fresh OAuth 2.0 token from https://connect.visma.com/connect/token on each session, passing the ipp-company-id header to specify the tenant. It listens for Visma's one-time webhook notifications but also polls Visma's list endpoints using the lastModifiedDateTime parameter to catch any changes that fall through webhook gaps, since Visma webhook delivery is not guaranteed. For Tableau, ml-connector uses personal access token authentication, exchanges it for a session token valid for 240 minutes, and routes all operations to the correct site. When syncing data, ml-connector maps Visma GL accounts and dimensions to Tableau data source columns and builds extract refresh payloads so Tableau dashboards update automatically. It tracks which records have been sent, retries on transient failures with exponential backoff, and maintains a full audit trail of every record delivered so you can see exactly which invoices and accounts moved when.

A real-world example

A Nordic software reseller runs Visma.net ERP for accounting, purchasing, and supplier management, and uses Tableau dashboards to track cash flow, vendor spend by category, and invoice aging. Before the integration, the finance team exports supplier and customer invoices from Visma twice a week, transforms them in Excel, and uploads them to Tableau data sources by hand. With Visma and Tableau connected, the dashboard refreshes every night with the latest supplier invoices, customer AR aging, and GL account balances. The finance team now spends 5 hours a month instead of 10 on manual data prep, and dashboard users see data no older than 24 hours.

What you can do

  • Sync supplier invoices, purchase orders, and supplier payments from Visma into Tableau data sources for vendor analytics and spend tracking.
  • Sync customer invoices and credit notes to Tableau so your AR dashboards show aging, payment status, and revenue trends.
  • Publish Visma GL accounts and dimensions to Tableau so expense reports and financial dashboards roll up to valid cost centers and departments.
  • Authenticate Visma with OAuth 2.0 and tenant routing, and Tableau with personal access tokens or session tokens, with automatic token refresh and expiry handling.
  • Monitor Visma webhooks and poll for changes with delta queries, retries, and full audit trail so no invoice or account balance is missed.

Questions

How does ml-connector handle Visma's one-time webhook delivery with no automatic retry?
ml-connector listens for Visma webhook notifications but does not rely on them alone. It also polls Visma list endpoints using the lastModifiedDateTime parameter to catch any invoices, accounts, or dimension changes that the webhook may have missed due to temporary receiver unavailability. This hybrid approach ensures no record is lost.
Can ml-connector write financial data back into Visma from Tableau?
No. Tableau views are read-only, and ml-connector is designed to flow data one direction: from Visma into Tableau. This prevents accidental modification of your source accounting records and keeps Visma as the system of record.
What happens when a Visma OAuth 2.0 token expires or a Tableau PAT token approaches expiry?
ml-connector obtains fresh Visma tokens on each session and tracks Tableau PAT expiry (15 days of non-use on Cloud, 1 year on Server). When a token is about to expire, ml-connector refreshes it before the next sync so your data flow is uninterrupted. If a token does expire mid-flow, ml-connector backs off and retries with the new token.

Related integrations

Connect Visma and Tableau

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

Get started