Waver for Craft CMS

Configuration

Connection

SettingNotes
Access tokenSent as Authorization: Bearer …. Env-parseable, and it should be an env var — a full access token reaches every business on your Wave account
BusinessThe Wave business id. Test connection lists them
TimeoutSeconds to wait on Wave. Default 20

Check business reports the business name and currency, and warns about two conditions that would otherwise surface as a failed sync:

  • Classic accounting. Wave's moneyTransactionCreate is documented as requiring isClassicAccounting: false. Transaction mode cannot work on a classic-accounting business at all; invoice mode is unaffected.
  • Email sending off. Wave will not email invoices for that business.

What gets recorded

SettingNotes
Record each order asA money transaction (default) or An invoice (Pro)
Record orders automaticallyOff leaves everything to the order screen and the console
Record whenThe order is completed, The order reaches a status (Pro), or Never — only on request
Statuses that trigger a recordingOnly used with the status trigger
Only record orders paid in fullOn by default
DescriptionAn object template rendered against the order. This is what you read in Wave's transaction list. Default: Order {{ object.reference ?? object.shortNumber }}
Rounding toleranceThe largest residual Waver will absorb. Default 0.05

Only record orders paid in full

A money transaction asserts that cash arrived. With this on, an order that has not been captured in full is recorded as skipped, with the shortfall named, rather than posted as income you have not received.

The check counts successful purchase and capture transactions. It deliberately does not use Commerce's getOutstandingBalance(), which nets refunds off — a fully refunded order would read as never paid, and its sale could then never be recorded at all.

Turn it off if you invoice on terms and want the sale on the books at completion.

Rounding tolerance

Commerce keeps money in floats; Wave takes two decimals. A multi-line order can therefore land a cent away from its own total once every line is rounded. A residual up to this size is posted to the rounding account so the entry balances exactly.

Anything larger is not rounding — it is a modelling mistake — and the entry is refused with the drift reported rather than quietly adjusted.

The chart of accounts

Waver never invents an account, and only asks for the ones a given order actually needs.

SettingWhat lands thereSuggested Wave subtype
Payment accountThe anchor — where the money arrivedCash & Bank, or Credit Card
SalesThe goods, with any included tax taken back outIncome
ShippingShipping charged to the customer. Falls back to SalesIncome
Sales taxTax collected on someone else's behalfSales Tax
DiscountsBooked as an increase on a contra-income accountDiscount
FeesNegative custom adjustments — a fee absorbed out of the same paymentExpense
Other incomePositive custom adjustments — a surcharge. Falls back to SalesOther Income
RoundingSub-cent residuals. Falls back to SalesIncome
RefundsThe income account a refund is taken back out of. Falls back to SalesIncome

Why a discount is an "increase"

Wave's INCREASE is relative to an account's normal balance, and it inverts on contra accounts. Recording more discount on a Discount-subtype account is an increase in discount, which is a debit — less income. Waver books it that way, which is why the preview shows a discount in the debit column.

Per-gateway payment accounts (Pro)

Map a Commerce gateway handle to a Wave account so card money and cheques do not land in the same place. Anything unmapped uses the default payment account.

Businesses by store (Pro)

For a Commerce install with more than one store: map a store id to a Wave business id. Unmapped stores use the default business.

Customers

Wave can only be asked for a customer by email address — there is no lookup by name or by external id. An order with no email is recorded without a customer rather than creating a fresh one on every order.

SettingNotes
Create Wave customersCreate one when no existing customer matches the order's email
Attach the customer to the income lineSo Wave's customer reports see the sale

Matches are cached locally so the same email is not looked up twice. Clear customer and product maps in Maintenance forgets that cache; it never deletes anything from Wave.

Invoice mode (Pro)

Instead of a ledger entry, create a Wave invoice.

SettingNotes
Create invoices asSaved or Draft. A draft stays out of Wave's reports until approved
Approve the invoice
Mark the invoice paidRecords a manual payment for the amount Commerce captured
Payment methodWork it out from the gateway, or a fixed Wave payment method
Email the invoiceWave sends it. Needs email sending enabled on the business
Invoice numberThe order reference, number, short number, id — or let Wave number it
Invoice title / Memo / FooterBlank uses the business defaults. Memo is an object template
Create Wave productsCreate a product for a SKU Wave has never seen
Income account for new productsWave requires Income, Discount or Other Income
Sales tax mapCommerce tax rate name → the Wave sales tax it means

Read Usage → Invoice mode before switching this on. Wave invoices cannot represent everything a Commerce order can.

Refunds (Pro)

Record refunds turns a successful Commerce refund into its own withdrawal in Wave, taken back out of the refunds account. The sale and the refund stay two entries; Waver never edits or deletes the original.

Logging

SettingNotes
Log the connection
Keep payloads (Pro)Store the GraphQL body and Wave's reply on each row
Keep log entries forDays. 0 keeps everything. Lite is capped at 7 days

Permissions

PermissionAllows
View Wave recordsThe Records screens and the order panel
↳ Send orders to WaveSend to Wave and Ask Wave
↳ Force a resend, or mark a record as recorded by handThe two actions that can double or falsify an entry
View the connection logThe log screens (Pro)

The last one is deliberately separate. Forcing a resend can post the same money twice, and marking a record as recorded asserts something about Wave that Craft cannot verify.