Exactly for Craft CMS

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.

Exactly

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.

twig
{% 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.

Exactly's invoice preview for a reverse-charge order to a German business: the VAT treatment with the customer's VAT number, lines excluding VAT of €650.00, no VAT added, an invoice total equal to what the customer paid, and a green zero difference
The Exact Online panel on a Commerce order: invoice 26042 sent, the date it was sent, VAT treatment reverse-charge, payment paid, delivery sent, a link to the record, and Preview payload, Send again, Queue it and Credit note buttons
Exactly's Documents screen listing eight invoices and credit notes with their status, VAT treatment, amount and payment state — paid, outstanding, partial, draft and credited — plus one failed order, with Backfill, Retry failures and Check payments buttons

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.

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.