Short answer
WooCommerce bank transfer reconciliation means proving which bank credit paid which "On hold" order before you release it. WooCommerce does not do this for you: Direct Bank Transfer (BACS) orders wait for manual confirmation. DIGITAL EUR has no WooCommerce connector (it is planned, waitlist only), but you can export orders and bank lines as CSV and test the matching in our free browser demo today.
What does WooCommerce do with a bank transfer order?
WooCommerce ships with an offline payment method called Direct Bank Transfer, known internally as BACS. You enable it under WooCommerce › Settings › Payments, add one or more bank accounts (account name and number, bank name, IBAN and/or SWIFT/BIC) and write instructions that appear on the order-received page and in the order email. The customer then pays from their own banking app, outside your shop.
Because the money moves outside WooCommerce, the shop cannot know when it arrives. The official documentation says BACS orders are set to On hold and that the merchant should confirm that the funds have cleared before moving the order to Processing or Completed. That single sentence is the whole reconciliation process WooCommerce gives you.
The order statuses that matter for bank transfer orders, as WooCommerce defines them:
| Status | WooCommerce meaning | What it means for a bank transfer order |
|---|---|---|
| Pending payment | Order received, no payment made | Not the normal BACS state; used by gateways that redirect to pay |
| On hold | Awaiting payment confirmation; stock is already reduced | Your queue of orders waiting for a matching bank credit |
| Processing | Payment received, stock reduced | Set by you after you have found the credit |
| Completed | Order fulfilled | Set after shipping or delivery |
| Cancelled | Cancelled by an admin or the customer | Use for transfers that never arrive (manual decision) |
Two practical consequences follow. First, stock is reduced as soon as a BACS order goes on hold, so unpaid transfer orders tie up inventory. Second, WooCommerce's automatic cancellation of unpaid orders (the Hold Stock setting) is documented for Pending payment orders; the documentation does not say that On hold orders are cancelled automatically. Someone has to decide when an unpaid bank transfer order is abandoned.
Why are bank transfer orders hard to match?
Card and wallet gateways tell WooCommerce that an order was paid. A bank transfer only gives you a line on a bank statement, and the only evidence connecting it to an order is:
- the remittance text the customer typed (in SEPA credit transfers, up to 140 characters);
- the amount;
- the payer's name and, in a detailed export, the payer's IBAN.
Each of these breaks in ordinary shop life:
- A bare number as the reference. The default BACS checkout description in WooCommerce's source code asks customers to "use your Order ID as the payment reference". That is a plain number such as
1042, nothing checks that the customer typed it, and a short ID can appear by coincidence inside other text. Several third-party plugins exist precisely to generate a more distinctive reference. Customers who skip the instruction write "payment", their own name, or nothing. - Repeat customers and identical amounts. Two orders of €84.90 from the same customer look identical on a statement unless the reference is present.
- Someone else pays. A partner, an employer or a company account pays for a personal order, so the bank name does not match the billing name.
- Short or combined payments. A customer pays part now and part later, or pays two orders with one transfer. A transfer that deducts bank charges on the way arrives short.
- Formatting. "WC-1042", "wc 1042" and "1042" are the same intent written three ways.
Matching by eye works at ten orders a week. It becomes error-prone when several dozen transfers arrive with half-filled references, and it leaves no record of who decided that a payment belonged to an order.
What works today, and what is planned?
The honest status of every capability mentioned on this page:
| Capability | Status | What exists today |
|---|---|---|
| WooCommerce connector (read orders, update status) | PLANNED — waitlist only, no date | Nothing. You export orders yourself and change statuses in WooCommerce yourself |
| Matching orders to bank credits from CSV files | DEMO | The free Reconciliation Lab runs in your browser on CSV files you prepare |
| Explainable reason codes and scores | DEMO | Reference, amount, IBAN and name evidence shown for every suggestion |
| Human approval with an audit log | DEMO | Approvals require a reviewer name; the log lives only in the browser tab |
| CSV export of approved allocations | DEMO | Formula-safe CSV for your records; nothing is posted anywhere |
| camt.053 bank statement import | PLANNED | CSV only |
| Saved history, accounts, multiple users | PLANNED | No accounts exist; reloading the page discards the session |
| Holding, moving or collecting money | Never | DIGITAL EUR does not touch funds or initiate payments |
The connector would be a convenience layer: it would read On hold BACS orders and, after a person approves a match, suggest the status change. It would not take payments, and it would not change an order without approval. Until it exists, everything below works with files.
Who is this for, and who should look elsewhere?
It fits:
- WooCommerce shops in the euro area that offer bank transfer next to cards, often for B2B customers, larger baskets or customers who avoid cards;
- shops that receive dozens rather than thousands of transfers a month and currently search the banking app order by order;
- bookkeepers who reconcile a client's shop and need evidence of which credit paid which order.
Look elsewhere if:
- most of your revenue comes through card or wallet gateways (Stripe, PayPal, WooPayments). Their problem is matching payouts (many orders, minus fees, in one deposit) to the bank; payout reconciliation tools and accounting integrations address that, and our demo does not;
- you need automatic status updates today. No DIGITAL EUR feature can do that now;
- you need multi-currency matching. The demo only pairs an order and a credit in the same currency.
How do you reconcile WooCommerce BACS orders today, step by step?
This is a file-based routine for manual bank transfer tracking that you can run weekly or daily. It needs no plugin from us, and it turns order payment matching from a search in the banking app into a reviewable list.
- Ask for a usable reference. Edit the BACS Description and Instructions fields so that customers use the order number as the payment reference in one consistent format, for example
WC-1042, rather than the bare number. Keep the reference at least four letters or digits long in total; the demo ignores shorter references, so#87alone is too short whileWC-87works. If you want a reference generated and displayed automatically, that requires a third-party plugin; evaluate any such plugin's maintenance status yourself. - Build the list of open orders. In WooCommerce › Orders, filter by On hold. For a file, use WooCommerce Analytics › Orders: filter by status and use the Download link on the table. Small reports download immediately; larger ones are prepared in the background and the link is emailed to the requesting WordPress user (valid for one week). Check Analytics › Settings for excluded statuses, because an excluded status will be missing from the export. Developers can instead read orders with
status=on-holdfrom the WooCommerce REST API, which exposes the payment method, currency and billing details. - Keep only bank transfer orders. If your export includes other payment methods, remove them, or filter by payment method in an export plugin or the REST API (the built-in gateway's ID in WooCommerce's source code is
bacs). - Shape the orders file. The Reconciliation Lab expects one row per open item with these columns:
invoice_id,customer_name,currency,amount_due,reference, and optionallycustomer_iban. For a shop, use the order number asinvoice_id, the billing name or company ascustomer_name, the order total asamount_due, and the reference you asked for (for exampleWC-1042) asreference. - Export the bank lines. From online banking, export incoming credits for the period. Shape them as
transaction_id,currency,amount,remittance,direction(CRDTfor credits), pluscounterparty_nameandcounterparty_ibanwhen your bank provides them. The files must be comma-separated with a dot as decimal separator, at most 2 MB and 20,000 rows each; many European bank exports use semicolons and decimal commas and need converting first. - Run the matching. Load both files into the Reconciliation Lab. Every suggestion shows its score and the reasons behind it.
- Review and approve. Approve only the pairs you are satisfied with. Each approval records your name and a timestamp in the session's audit log, and an allocation can never exceed the order's open amount or the credit's remaining amount.
- Export, then update WooCommerce. Export the approved allocations as CSV and keep it with your records. Then change each paid order from On hold to Processing in WooCommerce yourself. Orders that remain unmatched stay on hold for a follow-up.
Use synthetic or anonymised data in the demo. It runs entirely in the browser and is not intended for confidential customer files; our security page explains what is and is not in place.
A worked example: five orders, five bank credits
The following synthetic data shows how the rules behave on typical shop cases. The scoring is fixed: an invoice or order reference found in the remittance text adds 65, an exact amount adds 20, a matching payer IBAN adds 10 and a matching payer name adds 5. A payment smaller than the open amount subtracts 15; a payment larger subtracts 25. A pair is only suggested when there is reference, IBAN or name evidence, so a coincidental amount alone never produces a suggestion.
Open BACS orders (On hold):
| Order | Customer | Amount | Reference asked for |
|---|---|---|---|
| WC-1041 | Anna Weber | €84.90 | WC-1041 |
| WC-1042 | Jan de Vries | €129.00 | WC-1042 |
| WC-1043 | Marta Rossi | €45.50 | WC-1043 |
| WC-1044 | Lukas Novak | €210.00 | WC-1044 |
| WC-1045 | Anna Weber | €84.90 | WC-1045 |
Incoming credits:
| Credit | Payer name | Amount | Remittance text |
|---|---|---|---|
| T1 | Anna Weber | €84.90 | Order WC-1041 |
| T2 | J. de Vries | €129.00 | WC1042 thank you |
| T3 | Marta Rossi | €45.50 | payment |
| T4 | Novak Lukas | €100.00 | WC-1044 part 1 |
| T5 | Anna Weber | €84.90 | Bestellung |
What the rules suggest:
| Credit | Suggested order(s) | Reasons | Score | What a reviewer should do |
|---|---|---|---|---|
| T1 | WC-1041 | Reference + exact amount + name | 90 | Approve. (WC-1045 also appears, at 25, on name and amount only) |
| T2 | WC-1042 | Reference + exact amount | 85 | Approve. The reference matches although the hyphen is missing; the name does not, because "J. de Vries" is not "Jan de Vries" |
| T3 | WC-1043 | Exact amount + name | 25 | Check before approving: no reference, but the only order from this payer for exactly this amount |
| T4 | WC-1044 | Reference + possible partial payment | 50 | Approve €100.00; the order keeps €110.00 open and stays on hold |
| T5 | WC-1041 and WC-1045 | Exact amount + name (tie) | 25 each | Flagged ambiguous. WC-1041 is already fully allocated by T1, so the demo will refuse to over-allocate it; approve WC-1045 after a sanity check |
Three lessons from this small set. A reference turns a guess into evidence: T1 and T2 are clear even though T2's name and format differ. Without a reference, the same customer ordering the same amount twice produces a genuine tie (T5) that only a person can resolve. And partial payments are normal: T4 is matched but the order is not paid, which is exactly the case where marking it "paid" by hand would be a mistake.
How does this compare with other ways to handle bank transfer orders?
| Approach | Strengths | Weaknesses |
|---|---|---|
| Check the banking app for each order | No setup, no extra tools | Slow, no record of the decision, easy to miss partial or combined payments |
| Spreadsheet with orders and bank lines | Flexible, cheap, auditable if kept carefully | Matching formulas break on reference formats; no consistent rules |
| Reference plugin with a "mark as paid" button | Better references; confirmation recorded in order notes | Matching itself is still manual (the plugin listings we reviewed say so) |
| EPC QR code plugin at checkout | Customer's banking app fills in IBAN, amount and reference, reducing typos | Depends on the customer's app; does not reconcile anything |
| Accounting software bank feed (for example Xero or QuickBooks) | Full bookkeeping; bank rules | Order-level matching usually requires an order sync; strongest for gateway payouts |
| DIGITAL EUR demo with CSV exports | Explainable scores, ties flagged, partials capped, approval log, formula-safe export | Demo only: no connector, no saved history, CSV only, exact name matching |
These options combine well. A better reference at checkout improves every downstream method, including ours.
What are the limits and edge cases?
- No connector. Orders do not flow in automatically and statuses are not changed for you.
- Exact name matching. "J. de Vries" does not match "Jan de Vries", and company names with or without a legal suffix differ. A reference avoids the problem.
- Same currency only. An order in EUR and a credit in another currency are never paired.
- Short references are ignored. Fewer than four letters or digits in total gives no reference evidence.
- Overpayments and refunds. A credit larger than the order is scored down and can only be allocated up to the open amount; the surplus and any refund decision stay with you.
- Combined payments. One credit for two orders is suggested only for orders with their own evidence; the Lab lets you allocate the remaining amount of a credit across approved suggestions, but nothing guesses the split for you.
- Bank charges. A transfer that arrives €1.50 short leaves €1.50 open. Writing it off is an accounting decision.
- Session only. Closing or reloading the demo discards decisions, so export before leaving.
Checklist for a cleaner bank transfer process
- Put the order number in the BACS instructions and on the order email, in one fixed format.
- Show your IBAN and account holder name exactly as the bank holds them; payer banks in the euro area now check the payee name against the IBAN before sending (verification of payee).
- Decide a deadline for unpaid On hold orders and who cancels them.
- Reconcile on a fixed rhythm, for example every weekday morning, before shipping.
- Keep the export of approved matches with the bank statement for the same period.
- Ask your accountant how short payments and bank charges should be booked.
What will it cost?
Nothing can be bought yet and there is no checkout. The pricing page shows illustrative pre-launch plans (Solo €19, Growth €49 and Agency €129 a month) that may change. A WooCommerce connector is not part of any plan today.
Frequently asked questions
Does WooCommerce reconcile bank transfers automatically?
No. WooCommerce's documentation describes BACS as an offline method: orders go on hold and the store owner confirms payment manually before processing.
Is there a DIGITAL EUR WooCommerce plugin?
Not yet. The connector is planned and has no release date. What exists is the browser demo, which works with CSV files you export.
Is there a WooCommerce reconciliation plugin with bank statement integration?
Among the WordPress.org listings we reviewed on 5 November 2026, the bank transfer plugins focus on generating references and adding a confirmation button, and state that matching remains manual. Commercial build-to-order modules advertise statement imports mainly for gateway payouts. Check any plugin's current listing, maintenance and data handling before installing it.
What should customers write as the payment reference?
The order number in one consistent format, such as WC-1042. Ask for it in the BACS instructions and repeat it in the order email.
Can I accept SEPA payments in WooCommerce without a payment gateway?
Yes, with the built-in BACS method customers send a SEPA credit transfer to the IBAN you display. You then confirm each payment manually.
What does a euro bank transfer cost compared with cards?
It depends on your bank's tariff and the customer's bank. Our fee calculator lets you compare scenarios with your own inputs.
Will DIGITAL EUR ever change my order statuses?
Only as a planned feature, and only after a person approves a match. The demo changes nothing in WooCommerce.
Can my accountant use the same files?
Yes. The exported CSV lists each approved order–credit allocation with the approver and time. See the page for accountants and the general reconciliation product.
Sources
- WooCommerce, Direct Bank Transfer (BACS) (accessed 5 November 2026)
- WooCommerce, Order statuses (accessed 5 November 2026)
- WooCommerce, WooCommerce Analytics — CSV download behaviour (accessed 5 November 2026)
- WooCommerce, Analytics: Orders report (accessed 5 November 2026)
- WooCommerce source code, class-wc-gateway-bacs.php — gateway ID
bacs, default description text, order set to on-hold (accessed 5 November 2026) - WooCommerce, REST API documentation: Orders (accessed 5 November 2026)
- European Payments Council, SEPA Credit Transfer Rulebook 2025 v1.0 — 140-character remittance information (accessed 5 November 2026)
- European Central Bank, Instant Payments Regulation — verification of payee timeline (accessed 5 November 2026)
- WordPress.org plugin directory, Kairos Labs Bank Transfer Reconciliation for WooCommerce — example of a reference plugin stating that reconciliation is manual (accessed 5 November 2026)