Lexies for Craft CMS

Free for Craft Commerce 5

Orders into Lexware Office, as real German invoices

Lexware Office (formerly lexoffice) is where a German shop's books live. Getting Commerce orders into it usually means a Zapier hop that knows nothing about §13b, or somebody keying invoices in by hand. Lexies does it properly — and refuses when doing it properly is not possible.

Lexies

Rehearse it on a real order

Before you trust the mapping, print it. A dry run resolves the tax treatment, states its reasoning, computes both totals and shows you the exact JSON — and sends nothing.

shell
$ php craft lexies/sync/order 1042 --dry-run

Order 1042
  · The store charges tax-inclusive prices, so unit prices are sent gross.
  · AT is in the EU and the customer supplied VAT ID ATU12345678,
    so the supply is an intra-community one.
  tax type: intraCommunitySupply
  order total: 238   invoice total: 238

{ "voucherDate": "2026-08-23T00:00:00.000+02:00", … }

Features

An accounting integration is only worth having if you can trust what it filed. Most of Lexies is about earning that.

The tax type, worked out

Kleinunternehmer, domestic VAT, reverse charge for an EU business with a VAT ID, OSS distance sales for an EU consumer, zero-rated export outside the EU — decided per order, with the reasoning recorded on the document.

  • The EU country list is read from Lexware, never hardcoded
  • intraCommunitySupply is a claim to the Finanzamt — you can see what produced it

Proved, not hoped

Every payload is recomputed the way Lexware will compute it — unit price times quantity rounded per line, tax re-derived per rate — and compared to what the order charged, in integer cents.

  • Its own rounding is absorbed into a line, then re-checked
  • Anything larger is blocked, with both figures on the document

Never the same voucher twice

A duplicate numbered invoice in German bookkeeping is a correction filing, not an inconvenience. Lexware has no idempotency key and says a timeout may still have created your voucher — so a create whose outcome is unknown stops rather than retrying.

  • One order, one voucher, held by a unique index
  • Reconcile searches Lexware's voucher list before anything tries again

Customers as real contacts

One customer means one Lexware contact and one customer number, reused across every order. An existing contact is adopted by exact email rather than duplicated, and an edit made in Lexware wins over a stale copy instead of being overwritten.

Paid in Lexware, known in Craft

Lexware is where the bank feed lands, so Lexware is the authority on whether an invoice was settled. Signed webhooks carry that back — verified against their published key, deduplicated, and handled in a queue.

  • Writing a Commerce transaction is opt-in, so you never bank a sale twice
  • No public endpoint? Poll instead, with no inbound connectivity at all

Refunds become credit notes

A full refund mirrors the invoice line for line. A partial one cannot be attributed to particular products without inventing facts, so it goes out split across the order's own tax rates — the only split that keeps the VAT return right.

Frequently Asked Questions

The questions worth answering before you install it.

Start free, upgrade when the EU shows up

Lite invoices a German shop selling to German customers, for nothing. Pro is $99 with a $49/year renewal, and adds contacts — which is what Lexware requires before it will accept an intra-community or third-country invoice at all.