Bank synchronization

Odoo can fetch your bank transactions automatically instead of having you upload a statement file every day. The Online Bank Sync modules connect a bank or payment account to an Odoo journal, poll the provider at a fixed interval, and create the matching bank statement lines, ready for reconciliation.

The feature is split in two layers:

  • Online Bank Sync (account_bank_sync) provides the connections, the remote accounts, the journal mapping, the scheduled import, and the secure storage of the provider credentials.

  • A provider module implements one specific institution or aggregator. Three are available:

    • Enable Banking (PSD2) (account_bank_sync_enablebanking) — a PSD2 account information provider for Spanish and other European banks, with a consent given at the bank. See Enable Banking (PSD2).

    • Nyíltbankolás Partner (account_bank_sync_bankszamlakivonat) — a multi-bank aggregator covering the Hungarian banks through the bankszamlakivonat.hu service.

    • Wise (account_bank_sync_wise) — the Wise (formerly TransferWise) multi-currency balances, including outbound payouts.

Note

Online synchronization requires at least one provider module. If your bank is not covered by a provider, import the statement files instead.

File import or online synchronization?

Both methods end in the same place: bank statement lines in a bank journal, ready for reconciliation. Choose according to what your bank offers and how fresh the data must be.

File import

Online synchronization

Freshness

As fresh as the last file you downloaded.

Automatic; scheduled runs and a manual Sync now button.

Set-up

Nothing to configure besides the bank account and the journal.

A provider account, credentials and, for PSD2 banks, a consent given at the bank.

Upkeep

Someone downloads and uploads a file regularly.

The consent must be renewed at the bank (PSD2: at most every 180 days), and the number of automatic calls per day is limited by the bank.

History

Whatever period the file covers.

Starts when the connection is made; older history is not pulled.

The two methods work well together. Connect the journal for the day-to-day flow, then back-fill the older history from a statement file. When the Online Bank Sync and the file import are both installed, the lines of the file that the synchronization has already booked are skipped automatically.

Access rights

Synchronization introduces its own access groups, which you assign under Settings ‣ Users & Companies ‣ Users in the Online Bank Sync category:

Group

Rights

Bank Sync / User

Read the synchronization status and results. No access to credentials.

Bank Sync / Manager

Configure connections, accounts, and the journal mapping. Required to see the Bank Sync menu. No access to credentials.

Bank Sync / Payment Approver

Approve and send outbound payouts.

Bank Sync / Admin

Read and write the provider credentials and secrets, such as private keys.

The groups build on each other: Manager includes User, and Payment Approver and Admin both include Manager.

Warning

The Bank Sync / Admin group also grants the Settings administrator rights. Assign it only to the people who may manage the whole database.

Create a connection

Go to Accounting ‣ Bank Sync ‣ Connections and click New. Fill out:

  • Name: a label of your choice, e.g. the name of the bank.

  • Provider: the provider module handling this institution.

  • Environment: Sandbox for testing, Production for live data.

  • The Credentials section, whose fields depend on the selected provider. Secrets such as private keys are only visible to the Bank Sync / Admin group.

The Capabilities section is filled in by the provider module and tells you what the connection supports: Supports statement pull, Supports FX rates, Supports webhooks, Supports payouts and Supports consent redirect.

Click Test connection to verify the credentials: a notification confirms that the provider answered, and if it refuses the credentials the reason is displayed in an error message.

The status bar shows where the connection stands. How a connection becomes Connected depends on the provider: with Wise, a successful Test connection; with Nyíltbankolás, the end of the pairing (Refresh / discover); with Enable Banking, the consent given at the bank. A failed bank authorization sets the status to Error and stores the reason in Last error. A connection whose consent has run out is set to Expired and must be renewed, see Bank consent and expiry.

screenshot: accounting-bank-sync-connection
menu
Accounting ‣ Bank Sync ‣ Connections ‣ (open a connection)
shows
A connection form in state "Connected", with the Name, Provider, Environment, Last refresh fields, a filled Credentials section and the five Capabilities checkboxes.
highlight
The status bar and the "Test connection" / "Discover accounts" buttons.
data
Connection "OTP – Nyíltbankolás", provider "Nyíltbankolás Partner", environment "Production".
module
account_bank_sync, account_bank_sync_bankszamlakivonat
notes
English UI, light theme, 1440px width; use a throw-away API key.

Nyíltbankolás Partner

The aggregator connects to the Hungarian banks on your behalf. Enter the Nyíltbankolás entity id and the Nyíltbankolás API key you received from the service, then click Get connection code. Odoo requests a connection code, which is displayed in the Connection code field: use it on the provider’s site to authorize your bank accounts. Once the authorization is done, click Refresh / discover: the connection becomes Connected and the list of authorized accounts is pulled into Odoo. Requesting a new connection code sets the connection back to Draft until the pairing is finished again.

Wise

Enter the Wise profile id and the Wise API token. For payouts, Wise also requires a Wise SCA RSA private key (PEM) used to sign strong-customer-authentication challenges, and for webhook delivery the Wise webhook public key (PEM) published by Wise for the chosen environment. Use Subscribe webhooks to register Odoo with Wise so that new transactions trigger an immediate refresh, and Unsubscribe webhooks to stop them.

Important

Webhook events are delivered to /bank_sync/webhook/<provider> on your database. Signature verification fails closed: an event that cannot be verified is rejected. Ask your system administrator to make sure this address is reachable from the internet.

Map the remote accounts to journals

On a connected connection, click Discover accounts. Odoo queries the provider and creates one Bank Sync Account record per remote account or balance. Open Accounting ‣ Bank Sync ‣ Accounts and set, for each of them:

  • Journal: the bank journal in which the transactions are booked. Nothing is imported until a journal is set.

  • Sync enabled: activates the scheduled import for this account. It is off by default, also for the accounts discovered by a provider.

  • Sync every: the polling interval (for example, 1 hour). For a provider with a daily call limit, Odoo never polls more often than the limit allows (every 6 hours for 4 calls a day).

The list view shows Last successful run and a colored Last state badge (OK, Running, Error), so you can spot an account that has stopped importing at a glance. The optional Balance difference column belongs to the balance check.

Once a journal is mapped, its Bank Feeds setting (Journal Entries tab of the journal) is set to Online Bank Sync, and the journal card of the Accounting Dashboard gets a Sync now button. Statement files can still be imported into the journal, see Load history into a journal that is synchronized online.

screenshot: accounting-bank-sync-accounts
menu
Accounting ‣ Bank Sync ‣ Accounts
shows
The Accounts list with three rows: connection, account name, currency, mapped journal, the "Sync enabled" toggle, the last successful run and the colored state badges (one "Ok", one "Error").
highlight
The "Last state" column (red frame).
data
Two HUF accounts mapped to "Bank" and "Bank (OTP)", one EUR Wise balance.
module
account_bank_sync
notes
English UI, light theme, 1440px width.

Run a synchronization

There are three ways a synchronization runs:

  • Scheduled: the Online Bank Sync: pull statements scheduled action checks every 15 minutes which accounts are due and imports them. This scheduled action is disabled by default; ask your system administrator to enable it once the mapping is in place.

  • Manual: click Sync now on the account form, or on the journal card of the Accounting Dashboard. Manual runs are made while you are present, so they do not use up the daily limit of the scheduled runs described below.

  • Webhook-triggered: for providers supporting webhooks, an incoming event flags the account and the next scheduled run imports it immediately, even when periodic polling is off.

Each run fetches the transactions since the last successful run, with a 48-hour overlap so that transactions the bank posts late are not missed. Importing is idempotent: a transaction already present in the journal is skipped, so running a synchronization twice never creates duplicates.

Note

A synchronization only looks back a short time before its first run. It does not load the history that precedes the connection: import it from a statement file, see Load history into a journal that is synchronized online.

Daily limit of PSD2 banks. PSD2 allows a bank to refuse more than 4 account requests a day when the customer is not present. When the connection has a value in Max. unattended syncs per day, the scheduled runs stop for the rest of the day (UTC) once that number is reached for an account, and resume the next day. Manual runs are not counted.

If a run fails, the account is set to Error and the message is stored in Last error; the other accounts are not affected. Credentials and tokens are removed from the stored messages.

Warning

Sync now displays Bank sync finished. even when the run failed, because the error is recorded on the account instead of being raised. After a manual synchronization, check Last state and Last error on the account.

Balance check

When the provider reports the balance of the account (Enable Banking does), every successful run compares the booked balance of the bank with the balance of the journal’s bank account in your books, up to the date of the bank balance. Only posted entries count. The account form shows the result in the Balance check section (Balance, Bank balance date, Accounting balance and Balance difference, in red when it is not zero).

When the two differ, the journal card of the Accounting Dashboard shows a Balance differs warning next to Sync now. The usual reasons are:

  • the balance of the account before the first imported transaction was never booked in Odoo. Post an opening balance entry in the journal’s bank account;

  • transactions are still missing, for example because the history was not back-filled;

  • a transaction is still pending at the bank: Enable Banking only imports booked transactions.

The check is a control, not a correction: nothing is booked automatically.

Outbound payouts

Providers that support payouts (currently Wise) can also send money out of Odoo. Because this moves real funds, payouts are protected by a maker–checker workflow.

Configuration

On the connection form, in the Payout controls section:

  • Payout enabled: the feature flag, editable by the Bank Sync / Admin group only. Payouts remain impossible while it is off, even if the provider supports them.

  • Payout dual control threshold: above this amount, a second person must approve. Set it to 0 to always require a separate approver.

  • Payout per tx limit: the largest single payout allowed. 0 means no limit.

  • Payout daily limit: the largest total that may be approved per day (UTC). 0 means no limit.

Create and send a payout

Go to Accounting ‣ Bank Sync ‣ Payouts and click New. Set the Payee, the Recipient bank account, the Amount and currency, and a Payment reference (35 characters maximum, as required by SEPA). Then use the buttons in the header:

  1. Quote asks the provider for the exchange rate and the fee, shown in the Quote section together with an expiry time.

  2. Request submits the payout for approval. Whether dual control applies is frozen at this moment, so raising the threshold afterwards cannot weaken it.

  3. Approve is done by a user with the Bank Sync / Payment Approver group. When dual control applies, the approver must be a different person from the one who requested it.

  4. Send via Wise transmits the payout to the provider.

The status bar follows the payout through Draft, Pending checker, Approved, Submitted, Executed and Reconciled, with Failed and Cancelled as the alternative outcomes. Cancel is available until the payout has been executed. Once the provider confirms the transfer, the payout receipt can be fetched and stored on the record.

Note

Each payout carries an idempotency key, so a network problem during sending can never result in the money being transferred twice.

Payout batches

To pay several recipients at once, use Accounting ‣ Bank Sync ‣ Payout Batches. A batch holds its payouts in the Members tab and offers the same steps at batch level: Quote all, Request, Approve, Send, Refund and Cancel. The limits and the dual-control rule of the connection apply to the batch total.

screenshot: accounting-bank-sync-payout
menu
Accounting ‣ Bank Sync ‣ Payouts ‣ (open a payout)
shows
A payout form in state "Pending checker" with the header buttons Quote / Request / Approve / Send via Wise / Cancel, the Payee, amount and payment reference, and the Quote section showing the rate, the fee and the expiry.
highlight
The status bar and the Approval section (requester and approver).
data
Payee "Deco Addict", amount 1,250.00 EUR, reference "INV/2026/0042".
module
account_bank_sync, account_bank_sync_wise
notes
English UI, light theme, 1440px width.