Knox for Craft CMS

FAQ

Is Knox free?

No. Lite is a one-off $79 with a $29/year renewal, and Pro is $149 with a $49/year renewal.

Lite is a complete plugin for a shop selling within Sweden — the full reconciliation and öresavrundning apparatus, invoices, the control panel and the console. Pro adds Fortnox customers and everything that depends on them: reverse charge, OSS, export, bookkeeping, payments and credit invoices.

Why does Lite refuse my EU orders?

Because Fortnox stores the VAT type on the customer record, not on the invoice.

An invoice booked against a collective customer whose VATType is SEVAT is reported as a domestic Swedish sale, whatever its rows say. A reverse-charged sale sent that way shows 0% VAT and files as domestic — which looks right and is wrong.

Knox would rather block the order than mis-file it. Turn on Sync customers on Pro and it goes through. See VAT.

My invoice totals are off by 50 öre. Is that a bug?

Almost certainly not — it is your Fortnox company's öresutjämning setting, and it is the single most common thing wrong with a Fortnox webshop integration.

Press Detect from Fortnox on the settings screen and read what it says. Öresavrundning explains it in full.

Does Knox validate VAT numbers against VIES?

No. It checks the shape — two letters, the right country prefix, a plausible length — and says so in the reasoning it stores on the invoice.

Confirming a number is actually registered is a VIES lookup and your responsibility. Zero-rating a sale on the strength of an unverified number leaves you owing the tax, and a plugin that implied otherwise would be implying something it cannot know.

Will it slow down or break my checkout?

No. Invoicing is a queue job, pushed inside a try/catch from the order-complete handler. If Fortnox is down, slow, or your token has expired, the order completes exactly as it would have and the invoice arrives later.

Can it create two invoices for one order?

No, and that is the design's central concern. A unique database index on (order, type, reference) means two queue workers racing collide locally rather than in Fortnox's invoice numbering.

More importantly, a create whose outcome is unknown is never repeated. When Fortnox does not answer, Knox parks the invoice as Unknown and stops. knox/sync/reconcile then looks it up by the order reference Knox stamps on every invoice, and either claims it or clears the way.

What about orders from before I installed it?

Nothing happens until you ask.

php craft knox/sync/backfill --dry --limit=20
php craft knox/sync/backfill --since=2026-01-01 --queue

The dry run prints what each order would be invoiced at and which ones would be refused, without sending anything.

Does Knox use Fortnox webhooks?

Deliberately not. Fortnox's webhook coverage is a small and shifting set of resources, and a webhook that never arrives is indistinguishable from a quiet week. Silence is the one failure mode a bookkeeping integration must not have.

Payments are polled over lastmodified instead, which cannot miss anything and costs a handful of requests per run.

Can it credit part of an invoice?

By default it refuses and says so. Fortnox documents crediting a whole invoice and publishes no way to credit part of one, so Knox will not invent one behind your back.

There is an opt-in mode that raises a separate linked credit invoice — the shape Fortnox's own data model describes, through a path they do not document. Confirm it works on your account before relying on it.

Do I need a Fortnox API licence?

Yes, and it is not the same as a Fortnox subscription. Without it every call comes back 2001103, which Knox reports in plain words. That is a conversation with Fortnox, not with Knox.

My connection died and I did not change anything

Fortnox invalidates a refresh token 45 days after it is issued, and the clock only restarts when it is used. A shop that takes no orders for seven weeks comes back to a dead connection.

Knox warns in the control panel once the deadline is inside a fortnight. To prevent it entirely, put php craft knox/connect/refresh on a weekly cron.

I added a scope but it still says permission denied

Fortnox freezes the scope set at the moment you approve the integration. Adding a scope in Knox's settings does nothing for an account that is already connected — you have to reconnect.

Knox reads back what was actually granted and warns you when the two disagree.

Does it work with multiple stores?

Yes. Restrict Knox to particular Commerce stores in the settings, or leave it unrestricted to invoice all of them. One Fortnox company per Craft install, though — the connection is install-wide.

Can I use it with a currency other than SEK?

Yes. Knox sends the order's currency and lets Fortnox apply its own rate, because guessing a rate would put a number in your ledger that nothing in Craft can justify. The reconciliation happens in the invoice currency.

Which versions are supported?

Craft CMS 5.3+, Craft Commerce 5.0+, PHP 8.2+, and a Fortnox account with an API licence.

What about Visma, e-conomic, or another ledger?

Same family, same design. Vismaz covers Visma eAccounting, also Swedish; there are siblings for e-conomic, sevDesk, Lexware Office, Exact Online, Sage, MYOB, Moneybird, Zoho Books, FreshBooks, Wave, Holded, bexio, Twinfield and DATEV.