Craft Commerce 5 · Sverige
Your orders, in Visma, correctly
Getting an order into an accounting API is the easy part. The parts that are actually hard are all Swedish — öresavrundning, omvänd betalningsskyldighet, OSS, and the fact that Klarna, Swish and card do not settle to the same account. Vismaz does those, and it shows you exactly what it will post before it posts it.
Rehearse it before you mean it
A dry run needs no Visma connection at all and creates nothing. It prints the journal it would post, as debits and credits, and tells you whether it balances — because a voucher that does not balance is refused rather than sent.
$ php craft vismaz/sync/voucher --from=2026-08-01 --to=2026-08-31 --dryRun
Webshop sales 2026-08-01 – 2026-08-31 (412 orders)
Account Debit Credit
1580 Kortfordringar 504 655,80
6570 Bankkostnader 7 685,10
3001 Försäljning, 25 % moms 409 872,00
2610 Utgående moms, 25 % 102 468,00
3740 Öresavrundning 0,90
Balances.
Features
Built around one idea: a bookkeeping integration is only worth having if you can check it before you trust it.
Invoices or summary vouchers
One customer invoice per order when you need Visma's statements and reminders. Or a periodic summary journal — daily, weekly, monthly — when you don't.
- 412 orders a day becomes one verifikat, not 412 invoices
- Both go through the same builder, so they cannot disagree
Swedish VAT, decided once
Domestic rates, reverse charge for EU business customers, OSS destination rates for consumers, zero-rating outside the EU — resolved in one place and used by the invoice, the journal, the SIE file and the OSS report alike.
Öresavrundning as a real posting
A Swedish invoice settles to whole kronor. Vismaz books the difference to 3740 as its own line instead of hiding it in the last item's price, where it quietly corrupts a different account.
Reverse charge you can defend
EU VAT numbers are validated against VIES before a sale is zero-rated, and the invoice carries the required wording. A number VIES cannot confirm leaves the sale taxed — charging the VAT is the recoverable mistake.
- Every decision records its reason, on the order screen
- VIES results are cached; a timeout is never cached
Payment methods that reconcile
Klarna, Swish, Stripe and card each settle to their own account, and the processor's cut is booked as a cost rather than a discount on revenue. This is the setting that decides whether the books tie out against the payment statements.
It cannot post twice
Every document has an idempotency key with a unique index behind it. The queue can retry, you can press the button twice and the console can run at the same moment — one document exists at the end of it.
- The total Visma booked is checked against the total sent
- Retries rebuild from the order, never replay a stale payload
Frequently Asked Questions
The questions worth answering before you install it.
Visma eAccounting — sold in Sweden as Bokföring & Fakturering, and before the 2025 rebrand as Visma eEkonomi. The rebrand changed the name, not the API. It is not for Visma.net ERP or Visma Business.
No. Vismaz is an independent plugin built by Justin Holt, and it talks to Visma's public eAccounting API the same way any other client would. It is not affiliated with, endorsed by, or sponsored by Visma, and “Visma” and “Spiris” are trademarks of their respective owners.
Yes, through the SIE export. Visma Administration has no public API, so nothing can push to it — but it imports SIE like every other Swedish accounting package. Vismaz writes the same journal it would otherwise have posted, to a .se file your accountant imports.
$79, with a $59/year renewal for continued updates and support. One price, everything switched on — there is no feature-gated tier. The renewal is optional: the plugin keeps working when it lapses, you just stop getting updates.
If you sell B2B, at low volume, or your customers need statements and reminders from Visma: invoices. If you run a consumer shop with real volume: vouchers. Nine hundred orders a day should be one verification, not nine hundred invoices in a ledger nobody reads.
No. Every document carries an idempotency key with a unique database index behind it. The queue can retry, you can press the button twice and the console can run — all at once — and one document exists at the end of it. An order also cannot be swept into two different summary vouchers.
Yes, literally. The preview, the console dry run, the real send and the SIE writer all run the same builder and consume the same document. A preview produced by different code from the send would be worse than none.
No. Order completion queues a job; nothing calls Visma during the request. An outage, an expired token or a slow VIES lookup cannot reach the customer paying.
The sale stays taxed. Vismaz will not zero-rate on the strength of a timeout — if the number cannot be confirmed, charging the VAT is the recoverable mistake and not charging it is not. The order panel says exactly that, so you can correct it by hand.
Customers and articles are matched before anything is created, by customer number and SKU, so a shop that already keeps its register in Visma will not end up with a duplicate. Both syncs can be switched off entirely.
Yes, and you should. Visma's sandbox is free and self-service. Connect that, run a preview or a console dry run against your real orders, and read the payload. A dry run needs no connection at all and creates nothing.
Craft CMS 5.3+, Craft Commerce 5.0+, PHP 8.2+.
Check it before you trust it
$79 with a $59/year renewal. Connect Visma's free sandbox, preview a real order, and read the exact payload before anything touches your books.