From Elvanör's Technical Wiki
Jump to navigation Jump to search



  • You can export and duplicate databases directly from the web interface (Top Right Menu -> My Databases).



Vendor Bills

  • You can upload attachments (PDF or picture) to an Odoo vendor bill. There is an attachment icon next to the "Send message" section button.
  • When you create manually a vendor bill, you need to enter invoice lines. Don't forget to remove the VAT if it's not applicable.
  • If the vendor bill is not in the natural currency, you must enter the corresponding rate on the concerned date. This can be done via Accounting -> Configuration -> Currencies. Alternatively, enter directly the bill in the natural (paid) currency.
  • If you click on "Register payment" for a vendor bill, a journal entry is created with credit to account 1023 (Outstanding payments) and debit to account 2000 (Accounts payable from goods and services). When you later reconciliate with the bank transaction, there is debit from 1023 and credit to the bank account. It's recommended to proceed like that, but if you reconciliate before registering payment, the reconciliation will directly take place with debit to account 2000 and credit to the bank account. This is not a real issue, but the 1023 entry will never be created.

Customer invoices

  • When marking the invoice as paid, be careful to choose the correct bank journal (Revolut EUR for an invoice in Euros), else you will have issues.
  • Duplicating an invoice is easy and is probably the easiest way to create a new invoice if possible.


  • The general ledger is is accessible via Reporting -> General Ledger and is a good way to check current balances in your different accounts.
  • Reporting -> Profit and Loss is also very useful.


  • When initially adding / configuring a bank, it's very important to choose an appropriate Short code: this will be used in the journal entry names. If you don't do that, the entries have generic names like BNK1.
  • "Account number" and "Bank" fields (for a bank entity) can only be configured (apart from initial configuration) by looking at the bank journal.

Bank Statements and Reconciliations

  • When adding a bank transaction manually, add the amount (it should usually be negative if it's an outgoing payment) then choose "Match existing entries". Using filters, it's quite easy to reconciliate the bank transaction with existing journal entries. The main thing to understand is that by default, the filters allow you to reconciliate only on entries that are part of the corresponding bank journal. So if you need to choose a different entry (from the Miscellaneous Operations journal for instance), you need to manually filter. For instance, you could filter on the target account (2270 is a good example to make a reconciliation including AVS payments). Once the transaction is matched with the correct journal entries, click on the Validate button.
  • Important note: you can never reconciliate journal entries that used the bank account directly (1025 for instance). I think the logic behind that is that the reconciliation will actually create the entries in the bank journal with this account. As an example, if you created a transfer corresponding to a reduction of the 2850 account, and you want to use bank reconciliation and statements (as usual and as recommended), don't create a journal entry with 1025 and a 2850 counterpart. Use 1023 and 2850, then reconciliate.
  • Most of the transactions will match entries in the 1023 (Outstanding payments) or 1024 (Outstanding receipts) accounts. Actually, you should probably always create an entry that will use these accounts, so for instance for a payment to the AVS institution, you could first add a journal entry that would debit from 2270 and credit to 1023. But to save time, I sometime reconciliate directly from 2270, without using the 1023 account.
  • Creating a statement is very hidden (Odoo version 16): on the bank reconciliation screen, there is an invisible "Statement" button on all lines of the transactions (at the top and middle of the lines at the left). Clicking it allows to create a bank statement. A better way to create a bank statement is to click on the view list (in the reconciliation screen), select a bank transaction entry, then click Action -> Create statement. This is really, really not convenient, probably because Odoo 16 does not want you to manually process / handle the bank statements.
  • A bank statement just has a name, a starting balance and an end balance (it does not even have dates). Bank transactions are linked to a statement and the statement is just a way to ensure the balances match with all the transactions associated with a statement. I believe statements are not 100% needed, but are convenient, so I use them (by manually entering them). Note that you can attach a file (PDF statement from the bank) to the Odoo bank statement object.

Internal bank transfers

  • You can create one by going to the dashboard, then click on the 3 dots next to a bank block, then New -> Internal Transfer. Then the entries should be reconciliated in both banks (the sender and the beneficiary). Be careful to reconciliate with the proper 1023 / 1024 account, not the 10901 account.
  • You can also duplicate a previous similar internal transfer.
  • For a currency conversion bank transfer, you can create a standard internal transfer, from a journal / bank account in one currency to another one in a different currency. When reconciliating, you can just use the 3806 account to write off the exchange rate difference (including bank fees for simplification).
  • This needs only to be done for one end of the transfer (if you created the transfer from Revolut EUR to Revolut CHF in EUR, it will only need to be done on the reconciliation for the Revolut CHF bank statement).
  • The manipulation to do this is not obvious. First choose and add the 1022 entry corresponding to the transfer. Remove other entry lines in the top part and click on the 1022 entry. Then click on "fully reconcile" (Manual Operations -> You might want to fully reconcile the document), then change the account to 3806 on the newly created entry. The difference is automatically computed and entered (should be positive if we actually received less, negative if we received more).

Payments and Loans to main shareholder

  • When creating a payment to main shareholder, the bank statement entry cannot be automatically reconciled. You need to manually remove the Customer/Vendor filter then filter on 1023 Account (outstanding payments).

AVS payments and regularizations

  • If a payment does not correspond to the exact balance due, you can reconcile by manually entering the difference in the 2270 account (but the accounting entry will be created in the corresponding bank journal). When the regularization will be done, choose this entry as a counterpart for reconciliation. See the example of December 2023 for payment, then March 2024 for regularization (using an entry with label Owed to AVS Q4 2023).


  • Choosing automatic rate updating (which is probably very useful) can be done in the general configuration (Configuration -> Settings -> Accounting -> Currencies). You can select the frequency of updates. If you missed some, you can always enter the rates manually.
  • For a Swiss company, use the FTA site to get official rates.
  • Multi-currency is supported in Odoo, although the exact details seem to be complex. It seems important to define the accounts (in the chart of accounts) as having the desired currency, as well as the journals (for instance the bank journals). It's possible to issue invoices in an different currency than the base one. However, the actual journal entries are encoded in the base currency, although the actual currency is also shown (the "Amount in currency" field).
  • If you enter manually a journal entry in a different currency, you should use the "Amount in currency" field, but it's hidden by default. Select it manually in the list of columns shown.
  • Note that in some places (invoices, or manual journal entries) the conversion to base currency seems to happen only when you change the amount value (based on the latest rate available at this time). So if you used a wrong rate, update the rates by entering a new entry, and then reset to draft a journal entry / invoice, it won't update. You need to change the amount to force the update.
  • IMPORTANT NOTE: enter the currency rate for a given month BEFORE doing anything else (adding journal entries, internal bank transfers and so on). If you start making some entries with a given rate, then reconciliating while another rate has been entered it will be a mess. If you just follow the simple rule of entering the rate, then entering the other data, everything will line up since the amounts converted in CHF (base currency) will remain consistent.

Fiscal years

  • Be careful that entries that happened before the fiscal year defined in Odoo are not by default shown in the Profit & Loss (and other reports). This can be dangerous if some journal entries predated the start of the first fiscal year. You can get the correct results by entering a custom period, however (that will include the concerned entries).
  • It does not seem needed to close fiscal years. However, in the balance sheet report you need to choose the standard report option, not the Balance Sheet (CH) option to get something correct.
  • Actually, Odoo does not seem to have the concept of "fiscal" years and closure. Reports are always computed by the date you give. So it's better for a lot of reports to choose a period (or end date) that corresponds to the fiscal year.

End of year operations and dividend distribution

  • A provision should be declared for the profit taxes (debit from account 8900 and credit to account 2330). You estimate what will be the amount of the tax; if for instance it should be 16%, and P&L is 30000, you will put in reserve (30000/1.16)*0.16 (since taxes are deductible for a company in Switzerland). There will be a regularization once the fiscal decision is done.
  • For the dividend distribution, first part of the yearly profits should usually be put in the reserve. The operation consists in debit from 999999 and credit to 2940. Usually 5% of the yearly results is good.
  • Then two journal entries are needed: debit from 999999 and credit to 2850 (this represents the full dividend distribution) and then debit from 2850 and credit to 1189 (for 35% of the total dividend amount, this represents the tax that has to be paid to the Confederation in advance).


  • It seems the Payroll module does not have built-in rules for countries. For instance, you must enter manually the rules that will compute your social contributions.
  • Rules should be either of category "Company contribution" (if the employer pays this contribution) or "Deduction" (if it's paid by the employee, out of the gross salary).
  • You must first create a work contract for an employee.
  • Clicking on the "Compute Sheet" button will create automatically the salary computations (such as social compensations, etc).
  • To create the entries in the accounting journals, you should click on the "Create Draft Entry" button on the Payslip. Then those entries must be posted using the Accounting module (just check journal entries). Be careful: it seems the journal entries are always created with a date of January (of the current year), so it can be a bit hard to find. Remember to change the date to the correct one before posting.
  • It does not seem necessary to register payment (and click on the "Mark as paid" button) in the Payroll application.
  • To modify base salary, just change it in the work contract. Previous pay slips won't be modified, but futures one will have the new amount.

Working Setup

  • I set all the Deduction rules (the social contributions paid by the employee) with 5099 (Net Salary) as the debit account and 2270 (Social insurances owed) as the credit account. It generates correct entries but another manual entry is absolutely mandatory, with 5099 as debit and 2260 (Salaries) as credit. I am not sure how to perform this in a better (and automated) way, but currently it's working fine.

Switzerland Chart of Accounts

  • 1024 is the bank account for Revolut, 1025 is the bank account for PostFinance.
  • 2260 holds the debt of the company to the employees (salaries).
  • 2270 holds the debt of the company to the social insurance institutions.
  • 2800 is for the share capital.
  • 2850 (Private share account) is used to hold debts of the company to the shareholder.
  • 5700, 5710, 5720, 5730, 5740 are used for various social benefits (health insurance, unemployment insurance, maternity insurance etc).
  • 6000 for rental expenses.
  • 6510 for legal fees (registration of company, etc).
  • 6520 for fiduciary fees.
  • 6700 for general operating expenses.
  • 6900 for financial expenses like bank fees.