Free for Craft Commerce 5
Your orders, already in your books
Wave is free accounting software with a real API, and a great many small Commerce stores keep their books in it by hand. Moving an order across is easy. Accounting for one — taking tax back out of a price that included it, booking a discount so it reduces income, balancing the entry to the cent — is the part nobody does. Waver does that part.
One order, one balanced entry
A completed order becomes a money transaction in Wave: a deposit into the account the money actually landed in, split across the accounts it belongs to. The lines balance the deposit exactly — Wave rejects an entry where they don't, and accepts one that balances for the wrong reason.
Order #A1B2C3 DEPOSIT $178.45 → Business Checking
Items Sales credit 150.00
Shipping Shipping Income credit 9.95
Sales tax Sales Tax credit 30.50
Discounts Discounts debit 12.00
─────────────────
drift 0.00
Features
A real accounting entry on the accounts you mapped — not a number pushed into a memo field.
Tax that was inside the price
Commerce keeps included tax inside the item subtotal, where it does not move the order total. Book that subtotal straight to sales and you have recorded somebody else's tax as revenue.
- Waver subtracts it and books the liability
- The order total is identical either way — which is why it goes unnoticed
Discounts on the right side
Wave's INCREASE inverts on contra accounts, so recording more discount on a Discount-subtype account is a debit — less income. Waver books it that way, which is why a discount shows in the debit column.
It balances, or it doesn't go
Every entry is checked against the order total before it is sent. Sub-cent rounding goes to a rounding account; anything larger is not rounding, and the entry is refused with the drift reported.
- Preview any order and see the exact rows first
- The preview is built by the same code the real sync uses
Never posts the same money twice
The id on every record is derived from the order rather than randomly generated, with a unique index behind it. Two queue workers racing the same order: one wins, one stands down.
Honest when it cannot know
Wave's API cannot read a money transaction back — there is no transactions query at all. So when a send goes unanswered, Waver stops and tells you, rather than retrying and doubling your revenue in the one case nobody can detect afterwards.
- Ask Wave resolves invoices, which can be found by number
- Mark as recorded or Force resend, behind their own permission
Invoices, when you want the document
Pro creates a Wave invoice instead — approved, marked paid and emailed by Wave, with your Commerce products and tax rates mapped across. It also tells you plainly what an invoice cannot represent.
- Every Wave invoice line needs a product; Waver creates and maps them
- Wave has no order-level charge, so shipping is refused rather than dropped
Frequently Asked Questions
The questions worth answering before you install it.
Lite is, and it is not a trial. It records every completed order as a balanced money transaction, automatically, with full account mapping, included-tax handling, customer matching and a records screen. Pro is a one-off $99 with a $49/year renewal, and adds invoice mode, refunds, order-status triggers, per-gateway accounts, per-store businesses, the sales tax map and the full connection log.
Zapier can move an order across. What it cannot do is account for one — take tax back out of an income figure when it was included in the price, book a discount to a contra account so it reduces income rather than adding an expense, balance the entry to the cent, and make sure a retry does not post the same money twice.
No. Waver uses a full access token, which any Wave account can generate from the developer portal. Wave's OAuth flow — the one that requires a Pro subscription — is for applications published for other people's accounts, which is not what a single merchant connecting their own store is doing.
No. Waver reads orders and writes to Wave. It adds its own tables and a panel on the order screen, and it never modifies an order, its status or its totals.
The order completes normally. Waver records off the request in a queue job, so a customer is never waiting on Wave and nothing in checkout can be blocked by an outage. The record is marked failed with Wave's reason, and waver/sync/retry picks it up later.
Not on its own. Every record carries an external id derived from the order rather than a random one, with a unique index on it, so a retried queue job or two workers racing the same order cannot both insert. Sending twice takes a deliberate Force resend by someone with the permission for it.
It stops, and tells you. Wave's API cannot read a money transaction back — there is no transactions query, and the Transaction type exposes only an id — so nothing can determine whether that send landed. Waver leaves the record pending and never re-sends it automatically, because auto-retrying is what would double your revenue in exactly the case nobody can detect afterwards. You resolve it after looking in Wave.
Transaction mode, unless you specifically want a document to send. It is one API call, needs no Wave catalogue, and books the money exactly. Invoice mode needs a Wave product per SKU, cannot represent shipping at all, and lets Wave compute its own tax — all of which Waver tells you about before it sends anything.
Pro records a successful Commerce refund as its own withdrawal, taken back out of the refunds account. The sale and the refund stay two entries — Waver never edits or deletes the original, because a ledger records what happened rather than the current state.
Craft CMS 5.3+, Craft Commerce 5.0+, PHP 8.2+, and a Wave business that is not on Wave's classic accounting.
Start free, upgrade when you need to
Lite records every order as a balanced money transaction, automatically, for nothing. Pro is $99 with a $49/year renewal, and adds invoices, refunds, status triggers, per-gateway accounts and the full connection log.