ml-connector
VismaTradeshift

Visma and Tradeshift integration

Visma.net ERP is where your accounting and finance close. Tradeshift is where your suppliers and procurement network live. Connecting the two lets supplier invoices and orders from Tradeshift flow automatically into Visma without re-entry, with cost lines allocated to the correct GL accounts and cost centers. Invoice changes on Tradeshift update in Visma, and supplier master data stays aligned across both platforms.

How Visma works

Visma.net ERP exposes suppliers, purchase orders, supplier invoices, customers, customer invoices, GL accounts, dimensions, and journal transactions through REST APIs at https://api.finance.visma.net. Authentication uses OAuth 2.0 via Visma Connect with a client_credentials grant, client_id, client_secret, and tenant_id. Every API call requires an ipp-company-id header to scope the request to the correct company. Visma supports both webhooks (sent once with no automatic retry) and polling via lastModifiedDateTime on list endpoints for delta reads. Older deprecated endpoints exist at https://integration.visma.net/API/controller/api/v1/, but all new integrations use the canonical base URL. ETag/If-Match is required on PUT operations for optimistic locking. Refresh tokens are not issued to service applications, so new tokens must be obtained when the current one expires.

How Tradeshift works

Tradeshift exposes invoices, purchase orders, credit notes, receipts, despatch advice, remittance advice, and quotations through REST APIs at https://api.tradeshift.com/tradeshift/rest/external/ (production) or the sandbox at https://api-sandbox.tradeshift.com/. Documents are exchanged as UBL 2.0/2.2 XML or JSON, identified by documentProfileId. Authentication uses OAuth 1.0a (two-legged server-to-server signing) with consumer_key, consumer_secret, token, and token_secret. Every call requires an X-Tradeshift-TenantId header to route to the correct tenant. Tradeshift supports polling via the changedAfter timestamp filter on the GET documents/v2/ endpoint, and optional event streams via protobuf for registered plugins. Tradeshift has no native GL account or dimension API; cost allocations are embedded in the line items of the UBL document itself.

What moves between them

The main flow runs from Tradeshift into Visma. Supplier invoices and purchase order documents are polled from Tradeshift on a schedule (typically daily or on-demand), parsed from UBL XML into line items with quantities, amounts, and cost allocations, and posted into Visma as supplier invoices and GL journal entries. The GL posting is distributed across the cost centers and GL accounts specified in each UBL line, so a single invoice with multiple cost allocations generates multiple GL lines. Supplier master records from Tradeshift are optionally synced to Visma as supplier master data. Invoice status changes (acknowledged, rejected, paid) on Tradeshift are polled and reflected in Visma so the accounts payable record stays current.

How ml-connector handles it

ml-connector polls Tradeshift using OAuth 1.0a signing for every request, including the required X-Tradeshift-TenantId header, and filters for documents changed since the last poll using the changedAfter timestamp. UBL documents are parsed to extract line item details, including cost allocations embedded in each line. For each invoice, ml-connector maps the supplier name and ID from Tradeshift to the corresponding Visma supplier, looks up the GL account and cost center (dimension) for each line's cost allocation, and posts a multi-line supplier invoice into Visma via OAuth 2.0 with the required ipp-company-id header. Journal transactions are created with ETag handling to ensure optimistic locking on write. Visma's single-use webhook notifications are not relied upon, since webhook retries are not automatic; instead ml-connector polls regularly to catch invoice updates. If a supplier does not exist in Visma, the record is queued and flagged in the audit trail; the user adds the supplier and the record is automatically replayed. Tradeshift and Visma use different OAuth flows (1.0a vs 2.0), so ml-connector stores both credential sets encrypted and manages token state separately for each platform.

A real-world example

A mid-sized Nordic manufacturing company uses Visma.net ERP for accounting and Tradeshift to manage a network of international suppliers and coordinate purchases. Before the integration, the accounts payable team downloaded invoices from Tradeshift, reviewed the supplier details and cost allocations, and manually entered each invoice into Visma, allocating line items to the correct cost center or project code. This process took 3 to 5 hours per day and introduced re-entry errors. With Tradeshift and Visma connected, invoices arrive in Visma automatically from Tradeshift, cost allocations are preserved from the supplier's UBL document, and the AP team can review and approve invoices directly in Visma rather than re-keying them. Month-end close is faster because the supplier invoice history and GL are already reconciled.

What you can do

  • Poll Tradeshift supplier invoices and purchase orders daily or on-demand and post them into Visma as supplier invoices with correct GL allocations.
  • Parse UBL 2.0/2.2 XML line items from Tradeshift documents and distribute invoice amounts across the correct Visma GL accounts and cost centers.
  • Map suppliers from Tradeshift to Visma master data and flag missing suppliers so the integration can replay the invoice once the supplier is added.
  • Authenticate Tradeshift with OAuth 1.0a signing and Visma with OAuth 2.0, managing token refresh and required headers for both platforms.
  • Track invoice status changes from Tradeshift and sync them into Visma so accounts payable records stay current and audit trails are complete.

Questions

Which direction does data move between Visma and Tradeshift?
The primary flow is from Tradeshift into Visma. Supplier invoices and purchase orders are polled from Tradeshift and posted into Visma as supplier invoices with GL allocations. Supplier master data can be synced bidirectionally if both platforms are enabled to write. Invoice status updates (acknowledged, paid, rejected) flow from Tradeshift into Visma to keep the accounts payable record current.
How does ml-connector handle Tradeshift's UBL document format and Visma's GL account structure?
Tradeshift documents are delivered in UBL 2.0/2.2 XML with line items that include quantities, amounts, and cost allocation codes. ml-connector parses each line, maps the allocation code to the corresponding Visma GL account and cost center (dimension), and creates a multi-line supplier invoice with one journal entry per cost allocation. If a GL account or cost center does not exist in Visma, the record is queued and flagged in the audit trail for manual review.
Why does ml-connector poll Tradeshift instead of relying on webhooks?
Tradeshift's polling API with the changedAfter timestamp filter is the most reliable method for continuous synchronization. While Tradeshift event streams are available for registered plugins, polling ensures no invoices are missed and simplifies state management across both platforms. ml-connector polls on a schedule you define, typically daily or on-demand when your AP process begins.

Related integrations

Connect Visma and Tradeshift

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

Get started