Bird for Craft CMS

Craft Commerce 5 · Netherlands & Belgium

The half of the integration nobody builds

Every Moneybird bridge on the market creates a contact and an invoice and stops there. The parts that actually cost a bookkeeper an afternoon are the ones that get skipped: reverse charge that is a different 0% from an export, One Stop Shop rates per destination country, refunds that give the VAT back at the rate it went on at, and totals that reconcile to the cent against a bank feed. Bird is those parts.

Bird

See it before you send it

There is exactly one place in the code where a Commerce order becomes Moneybird JSON, and the Preview button runs it. What you are shown before booking is byte-identical to what gets booked — tax rate ids included, which is where the mistakes actually live.

twig
{% set document = craft.bird.documentForOrder(order) %}

{% if document and document.getIsBooked() %}
    <p>Invoice {{ document.getLabel() }} — {{ document.getStateLabel() }}</p>
{% endif %}

{% set vat = craft.bird.vatTreatment(order) %}
{% if vat.reverseCharge %}
    <p>VAT reverse-charged — {{ vat.vatNumber }}</p>
{% endif %}

What it actually does

Six things a Zapier-shaped bridge does not.

0% is three different rates

Reverse-charged, exported and genuinely zero-rated land in three different boxes on a VAT return. Bird books which one it was, rather than booking a number and leaving the reason behind.

  • Your btw verlegd rate and your export rate are separate settings
  • An unmapped rate refuses the order and names the percentage

Commerce decides, Bird books

Commerce's tax engine already knows your zones, your rates and your VAT-number validators. Re-deriving that here would give your shop two answers that drift apart, and the one on the customer's card is Commerce's.

  • A VAT number on an order that still paid 21% is not reverse charge
  • Bird books what happened, not what could have happened

Rates matched on the money

Commerce rounds tax per line, so €10.10 at 21% records €2.12 — which divides back out as 20.99%. A percentage look-up would refuse ordinary orders every day. Bird matches the rate whose arithmetic lands within a cent.

Totals that match the bank feed

The invoice total equals what the customer paid, because that is the number the bank will show. A cent of per-line VAT rounding goes onto a line at 0% — it is not revenue and should not be taxed as if it were.

  • Or turn reconciliation off and Bird refuses those orders instead

It cannot book the same revenue twice

The document table is unique on order, kind and source, and that index is the guarantee. A retried job, a double-clicked button and a webhook racing the queue all collide on it.

  • A push that dies mid-flight finds its invoice by reference and adopts it
  • Nothing Bird does can stop a customer paying

Paid means actually paid

Bird pushes invoices; Moneybird is where a bank transfer gets matched against one. The webhook tells your site when that happens, verified with HMAC-SHA256 over the raw body and rejected beyond five minutes.

  • No secret, no signature, no stale timestamp, no request
  • Can move the Commerce order's status when the invoice is paid

Frequently Asked Questions

The questions worth answering before you install it.

Start free, upgrade when you cross a border

Lite books invoices with correct domestic, reverse-charge and export VAT, for nothing. Pro is $99 with a $49/year renewal, and adds One Stop Shop, credit notes, sending, the webhook and the connection log.