You have Odoo, you invoice in Switzerland, and you want the money entering your account to end up in the right place in the accounting, without Excel hacks or 'we’ll see at year-end'. Excellent. The trio QR-invoice + CAMT + bank reconciliation can be extremely effective… or become a nest of errors if the setup is shaky.
Here’s a field guide, Geneva version, with what SMEs really see: unmatched references, grouped payments, bank fees, clients who pay 'however they want', and monthly controls that avoid cold sweats.
Odoo invoice-payment workflow: from creation to collection
The 'clean' workflow looks like this:
- Create the customer invoice (Odoo Accounting / Invoicing)
- Issue (PDF with QR, email sending, client portal)
- Customer payment (e-banking, QR scan, standing order, etc.)
- Bank statement reception (CAMT)
- Reconciliation (automatic matching + exceptions)
- Final matching (invoice settled, bank account updated)
Sounds simple. In practice, the devil is in three details:
- Payment reference (if it changes, is missing, or is 'invented' by the client)
- Quality of imported bank data (full or truncated CAMT)
- Internal discipline (who validates what, when, and how discrepancies are managed)
What you must decide before even configuring
Ask yourself these questions, honestly:
- Do you want reconciliation to be automatic 80–95% of the time? Or are you okay with 'manual matching'?
- Do your clients pay mostly with QR reference (ideal) or just a free-form reason?
- Do you have grouped payments (one transfer for 10 invoices)?
- Do you collect via cards / PSPs (Stripe, Payrexx, etc.) with fees and delays?
Depending on your answers, Odoo is configured differently.
The accounting entries behind the scenes
In Odoo, a customer invoice typically generates:
- Debit Customers (1100/1101 depending on your chart)
- Credit Sales
- Credit VAT owed if applicable
When payment arrives:
- Debit Bank
- Credit Customers
Bank reconciliation is when Odoo links the imported bank line to the invoice (or several invoices). If it doesn’t match, you end up with:
- 'open' invoices even though the money is there
- makeshift suspense entries
- discrepancies that explode at year-end
Field anecdote (Geneva, classic)
A Geneva SME invoices cleanly with QR. Everything runs smoothly… until a major client pays from a foreign subsidiary. Result: the payer’s name in the CAMT no longer matches the Odoo client, and the reference is sometimes missing (or replaced by text). Automatic reconciliation drops to 30%.
The solution wasn’t 'work harder'. It was to enforce the use of the reference and configure smart reconciliation rules (and, yes, educate the client).
QR-invoice and payment references: standards, constraints 2025-2026 (structured addresses, IBAN, QR-IBAN)
The QR-invoice is the Swiss standard for integrating payment data into a QR code: beneficiary, IBAN, amount, reference, and sometimes structured address. (source: QR-facture : définition et cadre légal)
What matters to you: reference = reconciliation.
IBAN vs QR-IBAN: you don’t choose randomly
- 'Classic' IBAN: you can receive payments without a structured reference. The client puts whatever they want in the reason field.
- QR-IBAN: designed for payments with QR reference (structured reference). This combo gives the best reconciliation results.
Classic trap: some companies use a classic IBAN but expect 'QR-IBAN' behavior. Result? Inconsistent references, and Odoo finds nothing.
QR reference vs creditor reference (SCOR): what you need to remember
Without going into an ISO 20022 course:
- The QR reference is the typical structured reference of Swiss QR-invoices.
- The creditor reference (SCOR) is another structured reference used in some cases.
Your goal: a stable, unique reference, carried exactly in the CAMT.
Structured addresses: not glamorous, but they break workflows
Banks and standards push for structured addresses (street, number, ZIP, city, country) rather than text blocks.
Practically, if your client database is messy (copy-pasted addresses, swapped fields, 'Geneva 1201' in the street…), you’ll get:
- QR codes that work 'sometimes'
- rejections or warnings depending on the issuing tool
- less clean bank data in returns
Checklist #1 — QR-invoice ready for automatic reconciliation
- Bank account configured with the correct IBAN or QR-IBAN
- Payment reference enabled and unique per invoice
- Your company address structured (street, number, ZIP, city, country)
- Client address structured (at least correct ZIP/city/country)
- Invoice PDF tested with a real scan (mobile e-banking)
- Internal process: 'do not modify the reference manually'
VAT on invoice: don’t mix everything
Odoo can handle Swiss VAT without issue, but keep the correct rates in mind:
- Standard rate: 8.1%
- Reduced rate: 2.6%
- Special accommodation rate: 3.8%
If your taxes are misconfigured, you’ll have invoices that look 'right' visually but are wrong accounting-wise. And at VAT audit, it stings.
CAMT bank import: ISO 20022, automation, accepted formats in Switzerland
In Switzerland, modern bank import uses ISO 20022. For accounting, what matters most:
- CAMT.053: account statement (end-of-day)
- CAMT.054: debit/credit advice (details, receipts)
- CAMT.052: intraday (depending on banks)
Odoo can import statements and generate bank lines to reconcile. The quality of automation depends on the file and what the bank puts in it.
What Swiss banks really provide
On paper, everything is standard. In practice:
- Some banks put the reference in a well-usable field.
- Others put it, but truncated.
- Others give you a 'clean' label but not the structured reference.
Result? Two SMEs with identical Odoo setups can have very different matching rates just because of e-banking configuration.
Table #1 — CAMT: which file for which use
| File | Typical content | Useful for | Point of attention |
|---|---|---|---|
| CAMT.053 | Daily statement, balances, movements | Daily/monthly reconciliation | Sometimes less detailed on references |
| CAMT.054 | Detailed advices (receipts, payments) | Fine matching of QR payments | Depending on bank, availability and setup |
| CAMT.052 | Intraday movements | Cash management | Not always offered to SMEs |
Automation: manual import vs synchronization
You have two approaches:
- Manual import: you download the CAMT from e-banking and import it into Odoo.
- Synchronization: depending on your bank and setup, you can automate further.
In our opinion, for a typical Geneva SME, well-managed manual import is often enough. What matters is regularity and file quality.
Field observation: the 'changing CAMT'
Banks sometimes modify labels or fields during an e-banking update. You don’t notice it the same day. You discover it when automatic reconciliation collapses.
Moral: monitor your matching rate (even visually) and react quickly.
Bank reconciliation in Odoo: automatic matching, exception management, common errors
Reconciliation is where Odoo can save you a lot of time… or make you lose control if you let everything pass.
Useful reference in Odoo: (source: Rapprochement bancaire — Documentation Odoo)
How Odoo 'guesses' the right match
Odoo relies on:
- amount
- date
- partner (if identifiable)
- reference (the key factor)
- reconciliation rules (depending on configuration)
If you have a clean QR reference in the CAMT, the match is often almost automatic.
Ark Fiduciaire
Need help with this topic?
Our experts are available for personalised guidance. First consultation free, no commitment.
Step-by-step — a clean bank reconciliation (no magic)
- Import the statement (CAMT) into the Bank journal
- Open the Reconciliation view
- For each line:
- check the label and reference
- let Odoo propose a match
- If Odoo proposes the correct invoice: validate
- If payment covers several invoices:
- select multiple customer entries
- check the total
- If you have a discrepancy (fees, exchange difference, rounding):
- record the discrepancy on a dedicated account (bank fees, discount, difference)
- Validate and move to the next line
- At session end: check that the journal balance matches the statement
Simple. But one rule: no blind validation.
Exception management: the 6 recurring cases
1) Payment without reference
The client made a transfer 'the old way'. Odoo doesn’t know.
Solution:
- match by amount + partner + date
- then fix the process: on your invoices, add a clear instruction ('QR payment recommended') and follow up with reluctant clients.
2) Grouped payment (1 transfer = 5 invoices)
Odoo can handle it, but it must be done properly.
Solution:
- select multiple open invoices
- validate grouped matching
- document any remaining discrepancy (fees, discount)
3) Partial payment
Classic in B2B: 'I pay 50% now.'
Solution:
- record a partial payment
- keep the balance open
- avoid 'forcing' closure with a suspense account without justification
4) Deducted bank fees
You receive 1,000 CHF, the bank credits 995 CHF.
Solution:
- reconcile 995 CHF to the invoice
- record 5 CHF as bank fees
- ideally: set a commercial policy (who bears the fees?)
5) Payment to wrong IBAN
Yes, it happens. Especially if you changed banks.
Solution:
- keep the old account open during the transition
- redirect clients, and monitor 'orphan' receipts
6) CAMT import duplicate
You import the same file twice.
Solution:
- delete duplicate lines before reconciliation
- set an internal rule: file naming + 'already imported' folder
Table #2 — Exceptions and typical accounting accounts (Geneva SME)
| Situation | Symptom in Odoo | Recommended treatment | Typical account |
|---|---|---|---|
| Bank fees | Amount received < invoice | Discrepancy as bank fees | Financial charges / bank fees |
| Granted discount | Client pays less | Discrepancy as discount | Granted discounts |
| Exchange difference | Variable CHF amount | Discrepancy as exchange gain/loss | Exchange differences |
| Unidentified payment | Bank line without match | Suspense account + investigation | Suspense account for receipts |
| Grouped payment | 1 line = several invoices | Multi-invoice matching | Customers |
3 costly mistakes for Geneva LLCs (and how to fix them)
- Put everything in 'suspense account' and resolve later
- Result? At year-end, you have 30 pending lines and nobody knows.
- Fix: suspense account allowed, but with a rule: zero lines > 30 days.
- Validate automatic reconciliations without checking
- Result? An invoice settled by the wrong payment, and you chase the error.
- Fix: visual check of reference + partner, especially for large amounts.
- Let users modify partners and labels at will
- Result? Unreadable history, painful internal audit.
- Fix: access rights + short procedure + logging.
Monthly controls: checks, internal audits, payment security
Reconciliation isn’t just 'for show'. It’s internal control. And in Switzerland, your accounting obligations are not optional. (source: Code des obligations : obligations comptables PME — admin.ch)
The monthly ritual that avoids 80% of problems
You block 60 to 90 minutes per month. No more. But you actually do it.
- Bank: all lines for the month reconciled
- Customers: list of overdue invoices, consistent reminders
- Suspense accounts: justification for each line
- VAT: consistency of VAT accounts vs sales
- Access: who can validate a payment? who can modify a bank account?
Checklist #2 — Monthly control 'bank & receipts'
- CAMT statements for the month imported (no gaps)
- 100% of bank lines reconciled or justified
- Suspense account for receipts: list of lines + responsible + target date
- Top 10 receipts: manual check (amount, client, invoice)
- Bank fees: recorded and consistent with statement
- Grouped payments: multi-invoice matching documented
- Cancelled invoices/credit notes: no 'weird' matching
Security: separation of duties (even in a small team)
'We’re 4, we trust each other.' Yes. And that’s exactly why you set simple safeguards.
- The person who creates/modifies supplier bank details is not the one who validates payments.
- Payment exports (if you pay via files) are validated by a second person.
If you use salary flows, also check Swissdec standards for processes. (source: Swissdec — Standard suisse pour la gestion des salaires et paiements)
Practical case (CHF) — what happens when everything is set up well… and when not
Geneva SME, B2B services, 120 customer invoices per month.
- 90 invoices with QR reference
- 30 invoices paid 'the old way' (transfer without reference or grouped payment)
March:
- Total receipts: 185,400 CHF
- Bank fees related to receipts: 47 CHF
- 6 grouped payments (2 to 8 invoices each)
Scenario A — QR + CAMT well used
- Automatic matching: 92% (110 invoices settled almost automatically)
- Processing time:
- CAMT import: 5 minutes
- exceptions (grouped payments, no reference, fees): 45 minutes
- control: 15 minutes
Total: ~1h05
Clean entries:
- 47 CHF in bank fees on the correct account
- 0 suspense account line > 30 days
Scenario B — Inconsistent references + missing rules
- Automatic matching: 35%
- Accountant creates a suspense account 'to go fast':
- 28 pending lines at month-end
- 3 invoices settled by mistake (wrong client)
Processing time:
- 3h30 for the month
-
- 2h at year-end to untangle
And the real cost isn’t the hours. It’s trust in your figures.
FAQ: Odoo QR invoice in Switzerland (configuration, errors, CAMT, reconciliation)
1) Does Odoo generate compliant QR-invoices in Switzerland?
Yes, Odoo can generate invoices with QR. Compliance mainly depends on your configuration (IBAN/QR-IBAN, structured addresses, reference) and the quality of client data.
2) Why aren’t my QR payments reconciled automatically?
In 90% of cases: the reference isn’t correctly retrieved in the CAMT, or it’s not identical to the invoice. Also check for import duplicates and grouped payments.
3) CAMT.053 or CAMT.054: which to choose?
If your bank offers CAMT.054 with well-structured receipt details, it’s often more comfortable for matching. CAMT.053 is sufficient for many SMEs, as long as the reference is usable.
4) How to handle a grouped payment in Odoo?
You reconcile the bank line with several open invoices from the same client (or several clients if needed, but then you must be precise). You validate multi-invoice matching and document any discrepancy.
5) What to do with bank fees and small differences?
You reconcile the received amount and record the discrepancy on a bank fees, discount, or exchange difference account. Avoid 'forcing' closure by hiding the discrepancy.
6) What minimum monthly controls to avoid surprises?
Complete monthly reconciliation, review of suspense accounts, control of large receipts, VAT consistency, and a simple rule: no unjustified line lingering more than 30 days.