Odoo accounting integration
Connect Odoo, map categories/journals/taxes, choose owner separation, and see what syncs (and what does not).
On this page
Connect your workspace to Odoo so the money you record here (rent payments, expenses, deposits, and the people behind them) turns into accounting records in Odoo automatically. This article explains what syncs, how to set it up step by step, and how to keep an eye on it.
Odoo is a paid-plan feature and is configured on the web app (not mobile). Setup lives under Settings → Integrations, and you need the Manage accounting integration permission (the Accountant role has it by default).
How it works (in one minute)
The sync is one-way: this app → Odoo (push only). When something is recorded and approved here, we queue a job and a background worker creates or updates the matching record in your Odoo database. Each record we create is remembered, so editing the same thing again updates the existing Odoo record instead of duplicating it.
Two things to keep in mind:
- Changes you make inside Odoo do not flow back to this app. Odoo is the accounting book of record; this app is where operations happen.
- Records are created as drafts by default, so your accountant reviews and posts them in Odoo. You can switch on auto-posting later (see Draft vs. posted below).
What syncs, and as what
| When you… | …we create in Odoo | State |
|---|---|---|
| Get a rent payment approved | a customer invoice (scaled to the amount actually paid, with rent/services/VAT lines) | Draft, or posted + matched payment if auto-post is on |
| Get an expense verified | a vendor bill | Draft, or posted if auto-post is on |
| Record a deposit payment or refund | a payment entry (money in / money out) | Posted |
| Add or edit a contact / vendor / owner | a partner (res.partner) | Saved |
A payment only syncs after it's approved in the payment workflow; an expense only after it's verified. That's intentional: only money your team has confirmed reaches the books.
Before you start
You need:
- An Odoo instance (Odoo Online or self-hosted) with the Accounting app installed.
- An API key for an Odoo user that can create invoices, bills, payments, and partners. (In Odoo: Preferences → Account Security → New API Key.)
- Your Odoo database name and URL.
Guided setup (recommended)
If you're connecting Odoo for the first time, especially a brand-new Odoo account with no records, use the Guided setup. On Settings → Integrations, before you've connected, you'll see a Guided setup button. It walks you through everything step by step and sets Odoo up the right way for real-estate automatically:
- Connect: enter your Odoo URL, database, integration user email, and API key, and test the connection.
- Accounting model: pick your Odoo company and language, and answer one question: how do you manage ownership? (single owner, multiple owners on shared books, or multiple owners as separate companies). We apply ZATCA-safe defaults (records land as drafts).
- Payment methods & bank journals: add your banks/cash/cards and create their Odoo journals right here. No need to log in to Odoo and come back.
- Recommended setup: one click provisions owner separation (creating the owner analytic accounts or companies for you), maps your payment methods + VAT taxes, creates the GL accounts for your expense categories, and creates the Rent product.
- Finish: choose how much history to backfill (keep Start fresh for a new Odoo) and turn sync on.
When it finishes you land back on the Integrations tab, fully configured, where you can customize anything afterwards. Prefer to do it by hand? The same screen has Set up manually, and every step below is available there too.
Setup, step by step (manual)
Go to Settings → Integrations and work top to bottom:
1. Test the connection. Enter your Odoo URL, database name, login email, and API key, then Test connection. On success you'll see the Odoo version, and we'll pre-fill your company and a sale journal.
2. Set the defaults. Pick the Odoo company, the default sale journal, and the Rent product used on rent-invoice lines (there's a one-click “Create Rent product in Odoo” if you don't have one). Choose the sync language for the text we write into Odoo (match the Odoo company, or force English/Arabic).
3. Choose owner separation (only if you manage properties for more than one owner):
- Off: everything posts to the one company. Use this if it's all your own portfolio.
- By company: each owner maps to a separate Odoo company; their transactions post there.
- By analytic account: everything posts to the one company, but each owner's lines are tagged with their analytic account (for per-owner P&L without separate companies).
In By company / By analytic mode, map each owner to their Odoo company / analytic account in the Owner mappings card. (For By analytic, create the owner's analytic account in Odoo first, Accounting → Configuration → Analytic Accounts, then pick it here. Per-property/unit analytic accounts are created for you automatically; owner ones aren't yet.)
4. Map your codes. So each record lands in the right place:
- Expense category → account (which Odoo account each expense category books to)
- Payment method → journal (cash, bank transfer, etc. → the matching Odoo journal)
- VAT rate → tax (e.g. 15% → your Odoo sale/purchase tax)
Use the Setup Assistant to speed this up: Suggest mappings matches your items to Odoo objects automatically (you review before applying), and it can create accounts in Odoo for any unmatched expense categories.
5. Enable + backfill. Flip the Enable switch. On first enable you'll be offered a Backfill: it pushes the contacts involved in those records (the vendors and tenants on the expenses, deposits, and payments it syncs, not your whole address book), then the expenses, deposits, and payments to Odoo in the right order. Expenses you already marked paid are settled in Odoo too, not just left as drafts. Choose how far back to go.
Draft vs. posted
By default we leave invoices and vendor bills as drafts so your accountant checks them before posting, the safe choice for ZATCA (Saudi e-invoicing), where a posted invoice is legally binding. Two switches in the Defaults section change this:
- Auto-post customer invoices: posts rent invoices immediately and records the matching payment.
- Auto-post vendor bills: posts expense bills immediately.
Leave them off while you're getting comfortable; turn them on once your mappings are trusted and you want full automation.
Paying expenses, journals, and per-property reporting
A few things happen automatically once you're connected:
- Mark an expense paid → a payment in Odoo. When you mark an expense paid here, we post a matching vendor payment in Odoo from the journal your chosen payment method maps to, and reconcile it so the bill becomes Paid (no double entry). This is the "Post a payment in Odoo when an expense is marked paid" switch in Defaults (on by default). Turn it off if you'd rather register payments by hand in Odoo; the expense is then flagged "payment pending in Odoo".
- Payment method → journal. Map each of your workspace payment methods to an Odoo bank/cash journal under Journal mapping. If a journal doesn't exist yet, use "Create journal in Odoo" right there. If you separate owners into different Odoo companies, you'll map one journal per method per company.
- Expense categories create their account on the spot. When Odoo is connected, adding an expense category creates its matching GL account in Odoo automatically (no separate step). This is the "Auto-create Odoo accounts for new expense categories" switch in Defaults (on by default); turn it off to map categories by hand. Either way, the add-category form has a per-category "Create a matching account in Odoo" tick so you can override it for one category.
- Contacts (vendors and tenants) sync to Odoo. Every contact becomes a partner in Odoo. With "Sync contacts to Odoo automatically" on (default), each contact you add or edit is pushed right away; turn it off and a contact only reaches Odoo when it's on a payment, expense, or deposit. To push your existing address book in one go, use "Sync all contacts" in the guided setup (or re-run it any time). Each contact's detail page shows a small sync chip so you can see its state.
- Per-property & per-unit reporting is automatic. Every synced rent invoice and expense is tagged to a "Properties" analytic plan (an account per property, and per unit when it's linked to units) so you get property/unit P&L in Odoo with zero setup, under Accounting → Analytic Accounts in Odoo. This is separate from (and works alongside) per-owner separation.
Keeping an eye on it (and troubleshooting)
- Every payment and expense shows a sync status chip on its detail page (Synced / Pending / Failed / Not synced).
- Settings → Integrations → Sync queue lists every job. Failed jobs show the reason: usually a missing mapping (an unmapped expense category, payment method, or VAT rate). Fix the mapping, then Retry (one job, or Retry all failed).
- A quick way to confirm it's all working end-to-end: record a rent payment and approve it → a draft customer invoice appears in Odoo; verify an expense → a draft vendor bill; record a deposit → a payment; add a contact → a partner. Watch the sync queue drain to Done.
Disconnecting
Settings → Integrations → Disconnect wipes the connection and all mappings from this app. It does not delete anything already created in Odoo. Those records stay in your books.