Qonto Banking
Frappe/ERPNext app that imports Qonto bank transactions for reconciliation. Read-only against the Qonto API — it never books and cannot move money.
- Author: itsupport-onl
- Repository: https://github.com/itsupport-onl/qonto_banking
- GitHub stars: 0
- Forks: 0
- License: AGPL-3.0
- Category: Accounting
- Maintenance: Actively Maintained
Install Qonto Banking
bench get-app https://github.com/itsupport-onl/qonto_banking
Tags
- accounting
- bank-reconciliation
- banking
- erpnext
- fintech
- frappe
- open-banking
- qonto
Add the Frappe Gems badge to your README
Maintain Qonto Banking? Paste this into your README:
[](https://frappegems.com/gems/apps/itsupport-onl/qonto_banking)
About Qonto Banking
Qonto Banking for ERPNext
Your Qonto transactions land in ERPNext by themselves, ready for reconciliation — no CSV exports, no MT940 files, no manual upload every morning.
Built and maintained by itsupport.online — ERPNext, network and IT security specialists from Berlin. Free to use forever; commercial support is there when you want someone else to run it.
> Status: pre-1.0. The app imports real transactions from the production Qonto API > and its behaviour is covered by tests. It has not been through a month-end close, and > no version has been tagged. Please read > Warranty and liability before relying on it.
What changes for you
Today someone downloads a statement from Qonto and imports it into ERPNext, on a rhythm
that depends on whoever remembers. With this app, completed Qonto transactions appear as
Bank Transaction records within the hour, every hour, and your team opens the Bank
Reconciliation Tool to a list that is already current.
Everything after that is unchanged. The app hands you the bank side of the reconciliation and stops there.
What it will never do
This is the important half, because it is what you are being asked to trust.
- It never books anything. No Journal Entries, no Payment Entries, no automatic matching, no guessing at accounts. Every posting decision stays with your team.
- It cannot move money. The Qonto API key is used for reading only. The app has no code that could initiate a transfer, and Qonto issues read-scoped keys for this.
- It sends nothing anywhere. Transactions go from Qonto into your own ERPNext. No third-party service, no analytics, no telemetry.
- It does not delete or change what is already there. It only inserts transactions it has not seen before.
What you decide before it runs
Four decisions, none of which the software can make for you.
| Decision | Why it matters |
|---|---|
| Which ledger account each Qonto account posts to | This is the account your bank balance reconciles against. One ledger account per bank account — ERPNext does not allow sharing |
| Which currency that ledger account is kept in | It must match the Qonto account. ERPNext refuses to book a EUR transaction into an account kept in another currency, and the import will fail loudly rather than convert anything |
| From which date to import | The first import starts here. Choose the beginning of the period you still need to reconcile, not the account opening date |
| Who may see the settings | The settings page is restricted to System Manager and Accounts Manager. It holds the API credentials |
Until the first two are done, the automatic import refuses to switch on and tells you which accounts are still incomplete. That is deliberate: a half-configured import that silently produces nothing is worse than one that says why.
Everyday operation
Once running, there is nothing to do. What to look at when you want to check:
- Qonto Sync Log — one entry per run and account, newest first, with counts of new,
skipped and failed transactions. Entries older than 90 days are removed automatically.
A run is
Success,Partial(some transactions failed) orFailed. - Import transactions automatically — the switch in Qonto Settings. Turning it off pauses everything without touching credentials or configuration, for instance while closing a period. Manual runs remain possible while it is off.
Skipped transactions are normal: every run re-reads the last three days, so late-settling transactions are not missed. Anything already imported is recognised by its Qonto transaction id and ignored, so nothing is ever duplicated.
Where each field comes from
Useful when a description reads oddly or a reference is missing.
| In ERPNext | From Qonto |
|---|---|
| Date | settled_at, converted from UTC to your site's timezone before the day is taken |
| Deposit / Withdrawal | amount, placed on the side given by side (credit or debit) |
| Description | label, with the Qonto note appended on a second line when present |
| Reference Number | reference — often empty; Qonto does not require it |
| Party Name | clean_counterparty_name, falling back to label |
| Party IBAN | Only present for transfers and direct debits, never for card payments |
| Transaction Type | operation_type (card, transfer, direct_debit, qonto_fee, …) |
Only transactions Qonto reports as completed are imported. Pending authorisations are ignored until they settle.
Reconciliation
Imported transactions appear in the Bank Reconciliation Tool like any other bank feed: match them against Payment Entries, Sales or Purchase Invoices, or create the counter-booking from there. This app intentionally stays out of that step.
When something looks wrong
Start at the Qonto Sync Log list.
| What you see | What it means |
|---|---|
| The import cannot be switched on | A linked account has no ledger account yet, or nothing is linked at all. The message names the accounts |
Failed, one message about currencies |
The ledger account is kept in a different currency than the Qonto account. Assign a matching one — Test Connection lists every mismatch |
Partial |
Some transactions could not be imported; the details name them, the full trace is in Error Log. The cursor stays put, so the next run retries them |
Failed, credentials rejected |
Wrong or revoked API key. Qonto answers 401 |
| No log entries at all | The scheduler is not running (your administrator: bench doctor), or no account carries a Qonto id |
| Everything skipped, nothing new | Normal. The three-day overlap re-read transactions that were already there |
Credentials never appear in any log. If you attach one to a support request, still check it for IBANs, counterparty names and amounts first.
Data protection and credentials
- What is fetched: the transactions of the bank accounts you linked, including counterparty names and IBANs. That is personal data under the GDPR, and it stays in your ERPNext — the app has no other destination.
- Where the API key lives: in an encrypted Password field on your site. It is not shown again after saving, does not appear in logs, error reports or exports, and is never written to this repository. See SECURITY.md.
- Revoking access: delete the key in the Qonto app. The next run fails with a clear message; nothing already imported is affected.
Setup
For whoever administers your ERPNext.
Requirements: Frappe Framework and ERPNext v15 (v16 kept in mind), Python 3.10+, and a Qonto Business account with an API key. No third-party Python dependencies beyond what Frappe ships.
bench get-app https://github.com/itsupport-onl/qonto_banking.git
bench --site install-app qonto_banking
bench --site migrate
Then open Qonto Settings — search bar (Ctrl + G) or /app/qonto-settings:
- Enter the API login and secret key from the Qonto app (Settings → Integrations and Partnerships → API key).
- Set Company for new bank accounts. It is read only while linking, when a Qonto account has no bank account in ERPNext yet.
- Set Import transactions from.
- Optional: tick Use Qonto's test environment and add the sandbox token to rehearse the whole setup against Qonto's sandbox.
- Test Connection — reports the organization, how many accounts Qonto knows about, and any account whose ledger currency does not match. The button saves the form for you if needed.
- Link Bank Accounts — matches Qonto accounts to ERPNext
Bank Accountrecords by integration id, then by IBAN, and creates what is missing. The summary lists every account with its currency. - Open each new Bank Account, pick an Account from the chart of accounts in that currency, and tick Is Company Account. ERPNext refuses a company bank account without a ledger account, which is why new ones start incomplete.
- Tick Import transactions automatically.
Before handing over to the scheduler, run it once by hand and compare the result against a real statement:
bench --site execute qonto_banking.sync.sync_all
A manual run works while the automatic import is still off. Start with a narrow Import transactions from window so the result can be checked line by line, then widen it — re-running never duplicates anything.
How the import works
| Step | Behaviour |
|---|---|
| Trigger | Hourly, one background job per bank account. A job still running is not started twice |
| Cursor | Bank Account.last_integration_date minus a 3-day overlap; the first run uses Import transactions from |
| Filter | Qonto status=completed only, sorted settled_at:asc, 100 per page |
| Dedup | Skip if a Bank Transaction with the same transaction_id exists — the overlap costs nothing |
| Errors | Per-transaction isolation: one bad record is logged and skipped, the rest import, the run ends Partial |
| Cursor advance | Only after a clean run, so a failed transaction cannot slide out of the window unnoticed |
| Result | Bank Transaction inserted and submitted, status Unreconciled |
The full algorithm and the DocType definitions are in SPEC.md.
Screenshots
To be added (docs/screenshots/).
Development
bench --site dev.localhost install-app qonto_banking
bench --site dev.localhost set-config developer_mode 1 # required for DocType JSON export
bench --site dev.localhost migrate
bench --site dev.localhost run-tests --app qonto_banking
Install the pre-commit hooks before your first commit:
pip install pre-commit && pre-commit install
See CONTRIBUTING.md for conventions and the test strategy. Tests always mock the Qonto API — they never touch the real service.
Roadmap
| Phase | Scope |
|---|---|
| 1 (MVP) | Scheduled transaction sync into Bank Transaction — done, pre-1.0 |
| 2 | Attachments and receipts from Qonto |
| 3 | Webhooks instead of polling |
| 4 | Auto-matching rules and Qonto labels |
Out of scope for now: multiple Qonto organizations, OAuth.
Commercial support
This app is free software and stays that way — install it, run it, fork it, no strings attached. Bug reports and pull requests are handled here in the repository, free of charge (see CONTRIBUTING.md).
If you would rather not run it yourself, the people who build it can do it for you. itsupport.online is an IT service provider from Berlin working on ERPNext, networks and IT security:
| Service | What that means |
|---|---|
| Installation & onboarding | Bench installation, Qonto API setup, mapping of bank and ledger accounts on your site |
| Hosting & operations | Managed ERPNext, updates, backups, monitoring, scheduler health |
| Custom development | Roadmap features pulled forward, extra fields, other banks, tailored matching logic |
| Support & training | Reconciliation questions, migration away from manual statement imports |
Get in touch: itsupport.online · · +49 (0)30 2359 0378 1
License
AGPL-3.0 — © Coozinha UG (haftungsbeschränkt), Berlin, trading as itsupport.online, and contri
Related Accounting apps for Frappe & ERPNext
- Books — Free Accounting Software
- Lending — Open Source Lending software
- Payments — A payments app for frappe
- Banking — Load your bank transactions into ERPNext and reconcile them with your vouchers.
- Erpnext Quota — App to manage ERPNext Site, User, Company and Space limitations
- Utility Billing — The Utility Billing & Property Management App is a powerful addition to ERPNext, designed to streamline utility billing, property leasing, and tenant management. Ideal for municipal utilities, real estate managers, and property developers.
- Expense Request — ERPNext Expense Requests
- Vendor Payments — A frappe app that has workflows and reports to make payments to vendors by a company and track them