Visma and Shopify integration
Visma.net ERP runs your accounting and financial records. Shopify runs your e-commerce storefront and payments. Connecting the two means every order placed in Shopify flows into Visma as an invoice without manual data entry, refunds post as credit notes, and customer records stay aligned between both systems. Your reconciliation starts with the financial data already posted, and you reclaim the hours spent chasing invoice numbers across two platforms.
What moves between them
Orders and refunds flow from Shopify into Visma. When a Shopify order is created or paid, ml-connector creates or updates a matching customer invoice in Visma. When a refund is issued in Shopify, ml-connector posts a customer credit note in Visma. Customer records sync in both directions: new customers in Shopify create records in Visma, and updates to customer contact details in Visma are pushed back to Shopify. Payment transactions from Shopify are logged into Visma's cash transaction records for bank reconciliation. All syncs are keyed by external ID to prevent duplication.
How ml-connector handles it
ml-connector validates every Shopify webhook using HMAC signature verification and returns 401 on bad signature to signal a failed webhook to Shopify's retry system. It decrypts stored Shopify OAuth tokens, exchanges them for fresh offline tokens at refresh, and routes requests to the correct Shopify store using the base URL pattern. On the Visma side, it handles OAuth client credentials with the ipp-company-id header on every call and automatically refreshes tokens before expiry. When creating Visma invoices from Shopify orders, it maps order line items to revenue accounts and cost dimensions in Visma, looks up or creates the customer record first, and uses optimistic locking (ETag/If-Match) to prevent overwrite conflicts. Refunds are posted as credit notes linked to the original invoice. Customer records are synced via delta pull on lastModifiedDateTime to keep the two systems aligned. All records carry a full audit trail and external-ID mappings to support replay if a downstream call fails.
A real-world example
A mid-sized Nordic e-commerce business runs Shopify as its online storefront and Visma.net ERP for financial management and accounting. Before the integration, the finance team logged into Shopify daily to export orders, then manually keyed sales data into Visma as customer invoices, and spent days at month-end close verifying that the order totals in Shopify matched the revenue posted in Visma. Payment reconciliation required exporting Shopify transaction reports and comparing them line-by-line to the cash account in Visma. With Shopify and Visma connected, each order creates an invoice in Visma automatically, refunds post as credit notes, and customers updated in either system flow to the other. Month-end close starts with revenue already posted and reconciled, the finance team reclaims 10-15 hours of manual work per month, and cash reconciliation is verifiable in minutes.
What you can do
- Create or update customer invoices in Visma when orders are placed or paid in Shopify, mapped to revenue accounts and customer dimensions.
- Post customer credit notes in Visma when refunds are issued in Shopify, linked to the original invoice for reconciliation.
- Sync customer records bidirectionally between Shopify and Visma, with updates flowing to keep contact details and billing addresses in agreement.
- Log Shopify payment transactions into Visma's cash transaction records, keyed by order and Shopify transaction ID for bank reconciliation.
- Validate Shopify webhooks with HMAC signature verification, handle OAuth token refresh on both sides, and deduplicate records via external ID to prevent double-posting.
Questions
- Which direction does data flow between Shopify and Visma?
- Orders, refunds, and customer records flow from Shopify into Visma as invoices, credit notes, and customer profiles. Customer updates also flow back from Visma to Shopify when billing details change. Payment transaction details flow into Visma for cash reconciliation.
- How does ml-connector prevent duplicate invoices in Visma if a Shopify webhook is delivered twice?
- Every Shopify webhook includes a unique X-Shopify-Webhook-Id that ml-connector stores and checks before processing. If the same webhook is delivered twice, the second delivery is recognized and skipped, so only one Visma invoice is ever created.
- What happens if the Visma tenant ID or the Shopify store URL changes?
- The tenant-specific Visma configuration and Shopify store base URL are stored in the ml-connector connection settings per customer. If either changes, the connection is updated without affecting any other customer or any of the synced records.
Related integrations
More Visma integrations
Other systems that connect to Shopify
Connect Visma and Shopify
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started