Bookkeeping

Automating WooCommerce Accounting: Which Connection Fits You?

WooCommerce runs on your own WordPress hosting and gives you a lot of freedom. You see that freedom back in the administration: every shop is set up slightly differently, with its own tax classes, its own payment methods and its own order statuses. That is why no “standard” connection to your bookkeeping works for everyone. This article walks through what WooCommerce hands you, what your bookkeeping needs and where it usually goes wrong, so you can choose a connection that fits your shop.

What WooCommerce records per order

These are the details that matter for your bookkeeping:

  • Order lines with quantity, price and the tax class per line. WooCommerce has three classes by default: standard rate, reduced rate and zero rate. You can add your own.
  • Shipping costs as a separate line with their own tax.
  • Coupon discounts, which you can apply per line or across the whole order.
  • Customer details for billing and shipping address, and an optional VAT number if you add that field with a plug-in.
  • Order status: processing, pending payment, on hold, completed, cancelled, refunded or failed.
  • Refunds as separate records attached to the order. A partial refund is therefore its own entry, not a change to the original order.

That last point is the most important one for bookkeeping: a refund does not change the original sale but comes on top of it. In your books it needs a credit note, linked to the original invoice.

What your bookkeeping needs

Whether you use Moneybird, Exact Online, Twinfield, e-Boekhouden or SnelStart, the question is always the same: for every order a sales invoice with the right customer, VAT per line and ledger account, and for a refund a matching credit note. The differences are in the details. Moneybird works with sales invoices and a ledger account per invoice line, Exact Online with journals, cost centres and VAT codes. A connection has to know how your package applies the rules, not only how WooCommerce supplies them.

Four ways to connect WooCommerce

1. A plug-in inside WordPress. The plug-in runs in your own shop and forwards orders. Upside: a quick start. Downside: it runs on your hosting, so a busy moment, a PHP update or a conflict with another plug-in can affect the connection. Also check that the plug-in is compatible with your WooCommerce version and with the order storage you use: since WooCommerce 8.2 the newer order storage (HPOS) is the default for new shops, and not every older plug-in supports it.

2. An external connection through the WooCommerce REST API. WooCommerce has a REST API and a built-in authorisation route that gives a connection access without sharing your admin password. Nothing needs to be installed in your shop. That is how Schakel works: it reads your orders outside your shop and books them in your package.

3. A generic automation tool. Fine for simple situations. Once VAT per line, shipping, discounts and partial refunds join in, you build and maintain that logic yourself.

4. Manual or export-based. A CSV from WooCommerce, imported into your bookkeeping. Workable with few orders, but you often book summarised and lose the link between a return and the original sale.

The pitfalls with WooCommerce

Prices including or excluding VAT. In the WooCommerce settings you decide whether you enter product prices including or excluding tax. A connection must go by what is actually on the order. In practice, amounts on the order line are excluding tax, with the tax stated separately. A connection that reads that wrong books revenue too high or too low.

The VAT rate per line. If your shop has products at several rates, every line needs its own VAT code in your bookkeeping. Test with an order that contains one product at 21% and one at 9%, plus shipping.

Order status as the trigger. Do you book at “processing” or only at “completed”? An order cancelled after booking requires a correction. Many shops book only when paid or completed, so draft orders and failed payments stay out of the books. Choose this deliberately and write it down.

Payments from Mollie, Stripe or PayPal. The payment that reaches your bank is often a payout of several orders minus fees. Make sure the payment attaches to the right invoice and that the transaction fees land on their own cost account, otherwise your bank reconciliation will not add up.

Sales to other EU countries. Above the threshold of 10,000 euros a year in cross-border B2C sales, the VAT rate of the customer’s country applies and you report through the OSS. Make sure WooCommerce knows the right tax rates per country and that your connection carries the country along. See our article on OSS VAT for webshops.

Business customers with a VAT number. For B2B customers in another EU country, VAT can be reverse-charged. That needs a VAT number on the order and a separate VAT code in your bookkeeping.

Refunds. A partial refund must become a credit note for exactly that amount, not for the whole order.

Checklist for your choice

  1. Which bookkeeping package do you use, and does the connection support your way of booking (journals, ledger accounts, VAT codes)?
  2. Does every order become its own invoice?
  3. How are shipping costs and discounts booked?
  4. What happens with a partial refund?
  5. On which order status is it booked, and can you set that yourself?
  6. How do you see a failed booking, and how does the connection prevent duplicates?
  7. Does the connection run inside or outside your shop?
  8. What does it cost per month, and what does a second channel cost?

Examples

If you use Moneybird, see the WooCommerce Moneybird integration. If you work with Exact Online, the details are on the WooCommerce Exact Online integration page. If you also sell on Bol.com, read WooCommerce and Bol.com integration.

Test first, then go live

Whatever you choose: start with a few test orders and have your accountant check the first bookings. With Schakel you can do that within the 30-day free trial; the pricing is on the site.

Want this handled automatically? Pick your connector.

Back to the blog