For Craft Commerce 5
Your Commerce orders, invoiced in Exact Online
Exactly turns each order into a sales invoice in your Exact Online administration — lines, shipping, discounts, the customer's account and the right VAT code for where it was shipped — and checks that Exact's total will match what the customer paid before it sends a thing.
Read-only in your templates
Show the invoice number and VAT treatment on an order confirmation or account page. craft.exactly can only read — a template render is not the place to write to an accounting system, and a page that could would be one crawler away from a duplicate invoice.
{% set invoice = craft.exactly.document(order) %}
{% if invoice %}
<p>Invoice {{ invoice.invoiceNumber }} — {{ invoice.getStatusLabel() }}</p>
{% if invoice.vatTreatment == 'reverse-charge' %}
<p>Intra-community supply — VAT reverse-charged.</p>
{% endif %}
{% endif %}
Features
Built around the three things an accounting push must not get wrong: the VAT, the total, and doing it once.
EU VAT, decided per order
Domestic, intra-community reverse charge, EU consumer (OSS) or export — worked out from the shipping country and the customer's VAT number, and sent with the Exact VAT code you mapped for it.
- VAT numbers read from Craft's Organization Tax ID, normalised and validated per member state
- Optional VIES check before reverse charge
- An unconfirmed number fails closed: VAT is charged
Reconciled before it is sent
Exact computes VAT from the line codes. Exactly predicts that total and compares it with what the customer paid. A cent or two gets a rounding line; a real gap is refused, with both figures and the mapping to look at.
Never invoiced twice
A unique index on order, administration and kind, and one atomic claim that the button, the queue, a retry and a backfill all go through. A second push is reported as skipped, not failed.
Preview the exact payload
Any order can show the JSON Exact will receive, with the reconciliation table and any warnings. It is built by the same code that sends, so a preview is not an approximation — and nothing is created in Exact by looking.
A connection that stays up
Exact's refresh token is single-use, so two workers refreshing at once would kill the connection. Exactly refreshes under a lock and re-reads the token inside it, and respects Exact's 60-calls-a-minute budget without ever holding up a checkout.
Every call on the record
A connection log of what was sent and what came back, with secrets, tokens and Authorization headers redacted before anything is written. Console commands for status, preview, backfill, retry and a single maintenance job for cron.
Exactly in the control panel
Real screens from a Craft 5 install running Commerce: the preview of what Exact will receive, the panel on Commerce's own order screen, and every invoice and credit note in one list.
Screenshots from a live install against a fixture Exact administration, not mockups.
Frequently Asked Questions
The questions worth answering before you connect it to your books.
$99 per Craft installation, and $79 a year to keep receiving updates. There is one edition — no feature you have to buy twice.
No. Exact requires an item on every sales invoice line, so most stores put everything on one generic fallback item and carry the product name in the line description. Exactly can also match items by SKU, and create missing ones, if you want the catalogue mirrored.
A sales invoice created through Exact's API is a draft. A draft is not in the general ledger and not receivable until it is processed — printed or sent. Exactly records Exact's status and tells you so; set a delivery method, or process the drafts in Exact.
Nothing the customer can see. The automatic triggers queue rather than push, and nothing on the checkout or order-save path is allowed to fail because Exact did. Failed pushes are retried, and the maintenance command picks up anything still outstanding.
Yes. The backfill command sends uninvoiced orders from a date you choose, staggered to stay inside Exact's rate limit, and has a dry run. Orders already invoiced are skipped.
English, Dutch, German, French and Spanish, using each market's own bookkeeping vocabulary, plus Flemish and Belgian French overlays.
No. Exactly is an independent plugin built by Justin Holt, and it talks to Exact Online's public REST API the same way any other client would. It is not affiliated with, endorsed by, or sponsored by Exact, and “Exact” and “Exact Online” are trademarks of their respective owner.
Craft CMS 5.3+, Craft Commerce 5.0+, PHP 8.2+.
Books that match the payments
Exactly is $99 for one Craft installation, $79 a year for updates. Connect it, preview the payload for a real order, and see exactly what Exact will receive before a single invoice is sent.