Bexy for Craft CMS

Configuration

All of this lives in Bexy → Settings. Nothing here is required, so a fresh install always saves.

What to create

SettingNotes
Document typeInvoice or Order. Invoices can be issued, emailed and paid. Orders are the pre-invoice stage, and payments cannot be posted against them.
Send orders automaticallyQueues a push when an order completes. The push itself always runs on the queue, so bexio can never hold up a checkout.
Only when the order reachesLeave every status unchecked to push as soon as the order completes. Tick one or more to wait until somebody moves the order there instead.
Issue the invoiceBooks it and gives it a number. Until then it is a draft in bexio and cannot be emailed or paid.
Have bexio email itSends from bexio's own delivery network, not Craft's. Requires Issue the invoice.

Email body

bexio puts the document where [Network Link] appears. Without that placeholder the customer gets an email with no invoice in it, so Bexy refuses to save an email body that omits it. {number}, {name} and {email} are also replaced.

Document title

Tokens: {number}, {reference}, {date}, {total}, {currency}, {name}, {email}.

bexio defaults

Filled in by Refresh lists from bexio.

SettingNotes
bexio userRequired by bexio on every contact and document. Defaults to whoever authorised the connection.
Default revenue accountWhere a position is booked when its tax category has no account of its own.
Default sales taxOnly active sales taxes are offered — bexio rejects any other kind on a document.
Unit, Bank account, Payment type, Document languageDocument defaults.
Letterhead IDbexio's logopaper_id. Empty means the company default.
Payment termDays until the invoice is due. Default 30.

Tax

This is the section to get right. Everything else is cosmetic by comparison.

How prices are sent

mwst_type on the bexio document: 0 prices include tax, 1 tax added on top, 2 exempt.

  • From Commerce (default) reads it off the order. A tax rate flagged included in price makes every price gross.
  • The three explicit options override that for every document.

Tax and account mapping

One row per Commerce tax category, giving the bexio tax and the revenue account its line items are booked to. Anything left out falls back to the defaults above.

A missing tax mapping is not an error — bexio books the position at the document default, which may be the wrong rate, and Bexy records a warning on the document. Check the log before you trust a quarter's numbers.

Shipping has its own label, tax and account, because it is rarely the same category as the goods.

Totals

bexio works the document total out for itself. Bexy works out the same figure before sending and compares it to Commerce's, so a mismatch surfaces here rather than during a VAT return.

SettingDefaultNotes
Close a mismatch with a rounding positiononAdds an untaxed line for the difference. Off, the difference is only reported.
Tolerance0.01How far the two totals may drift before Bexy does anything. Inclusive: a gap of exactly the tolerance is not a mismatch.
Largest difference to close1.00Beyond this Bexy refuses to adjust and explains instead. 0 removes the limit.
Rounding labelRoundingWhat the line is called on the document.

Two things worth knowing about the rounding position:

  • It is untaxed on purpose. A taxed rounding line moves the gross total by the delta plus tax, and misses again.
  • The upper bound is the point. Without it, a whole mis-mapped 7.7% tax charge gets quietly closed by a line called "Rounding" and the document balances while being wrong. A difference that size is a wrong tax mapping, not rounding.

Contacts

SettingDefaultNotes
Create contactsonBexy matches on email first — its own map, then bexio's contact list — and only creates when neither has one.
Update existing contactsoffPushes the order's address onto the bexio contact. Off by default: the contact record belongs to the accountant, and a delivery address typed into the shop should not overwrite it.
Contact group IDsbexio contact group IDs for newly created contacts, comma separated.

Bexy sends street_name and house_number separately. bexio deprecated the combined address field on writes on 9 December 2025.

Items

SettingDefaultNotes
Match line items to bexio items by SKUoffTurns a line into a real bexio item position, which is what makes bexio's per-item reporting work. A SKU with no match falls back to a custom position.
Create items that don't existoffAdds the SKU to bexio's item list the first time it is sold.

Payments

SettingDefaultNotes
Post payments to bexioonEvery successful Commerce charge becomes a payment against the invoice, so bexio does not leave paid orders sitting open. Invoices only.
Payments bank accountFalls back to the bank account above.
Cancel the invoice on a full refundoffOnly when nothing has been paid against it in bexio. Anything else is flagged for a credit voucher.

bexio has no credit-note create endpoint, only a PDF read. Bexy never fakes a negative payment to work around that; a refund it cannot cancel is flagged for a human.

Reconciliation

SettingDefaultNotes
Pull status back from bexioonNeeds craft bexy/reconcile/run on a schedule. Without it, an invoice marked paid in bexio never reaches Commerce.
Status mappingbexio status to Commerce order status.
Only check documents from the last120Days. Paid and cancelled documents drop out anyway. 0 checks everything.

Bexy changes the Commerce order status and nothing else. It never fabricates a Commerce transaction to make an order look paid, because that would put a payment in your Commerce reports that never happened.

Log

SettingDefaultNotes
Log requestson
Keep request and response bodiesonTokens and secrets are redacted either way.
Keep log entries for30Days. 0 keeps everything. Pruned whenever a sync or reconcile command runs.