# Real Estate & Property Management

> Real estate and property management: mandates that expire, protected introductions, offers that reject each other, and lettings deposits held right.

- **What it is:** Real estate and property management: mandates that expire, protected introductions, offers that reject each other, and lettings deposits held right.
- **For:** Industries
- **Odoo versions:** 16.0, 17.0, 18.0, 19.0, 20.0 - Community and Enterprise
- **Runs on:** Odoo.sh or Odoo you host yourself - not Odoo Online, which accepts no third-party apps
- **Price:** 179 EUR, one-time, on the Odoo Apps Store
- **Technical name:** bambooforge_real_estate
- **Not for:** Said before you buy, because it is the half that decides whether the app fits:; Carry two live mandates on a property when either is exclusive.; Expire a mandate that is under offer when its term runs out.; Let a property's state be typed - it is computed from the mandate.
- **Manual:** https://docs.bambooforge.dev/bambooforge_real_estate/
- **Live demo:** https://demo20.bambooforge.dev/odoo/action-bambooforge_real_estate.action_bf_property
- **Store page:** https://apps.odoo.com/apps/modules/20.0/bambooforge_real_estate
- **Manual last updated:** 2026-10-15

---
# Real Estate & Property Management

The thing that decides whether an agency gets paid is not the building.
It is the **instruction**: the piece of paper that says this agency may
market it, until when, and who pays the fee. Everything here is built
around that.

## The mandate

- Exclusive or open, from when to when, asking price, **floor price**,
  fee percentage, minimum fee, and who pays it.
- A property cannot carry **two live mandates** when either of them is
  exclusive. Two exclusive instructions on one flat is a lawsuit.
- A scheduled job expires mandates that have run out, says so in the
  chatter, and puts a to-do on the agent - and it warns fourteen days
  before, which is the whole point. The warning is raised **once**: a
  to-do somebody dismissed does not come back tomorrow morning.
- **An accepted offer freezes the clock.** A mandate that is under
  offer is not expired by the job when its term runs out, because
  conveyancing does not stop and a flat that is sold does not go back
  on the market because a date passed. The agent is told to get the
  extension on paper, and the sale still completes.
- **Extending renews from today**, not from a date that went past in
  March, and a mandate that was under offer comes back under offer.
- The property's own state is **computed from the mandate**, never
  typed - available, under offer, sold, let, mandate expired. An
  agency that types it ends up marketing a flat that was let last
  week.

## Viewings, and the introduction

- **A viewing without a live instruction is refused**, not warned
  about. It is the most expensive mistake in the trade: work nobody
  owes you a penny for. The same rule guards taking an offer.
- The introduction is stamped when the viewing is marked **done** -
  when it actually happened. A booking that was cancelled or that
  nobody turned up to introduced nobody, and neither protects anybody.
  Show them again next month and the original date stands.
- If they buy after the mandate lapses but inside the protection
  period, the offer still says **protected** - which is how an agency
  stops an owner waiting it out and dealing direct. That offer can be
  taken, and accepted, **on the lapsed mandate**: it is the whole
  reason the protection period exists.
- A viewing that introduced somebody **cannot be deleted**, by anybody:
  it is the proof the fee is owed. Cancel it or mark it a no-show.
- One negotiator cannot be in two flats at once; overlapping viewings
  are refused.
- Yesterday's viewings are **chased, not closed**: the job puts a to-do
  on the negotiator asking whether they turned up, once. Software does
  not know, and a viewing closed by a job is an introduction date
  nobody can stand behind.

## Offers

- **Accepting one offer rejects the others**, puts the property under
  offer, and the chatter says how many were rejected.
- **One accepted offer at a time, said by the database.** A unique
  index on the mandate refuses a second one even when somebody goes
  round the application, and the acceptance itself takes the mandate's
  row first, so two clerks clicking at once cannot both win.
- **Only an agent undoes an acceptance.** Withdrawing or falling
  through an accepted offer is the agent's call - the owner has been
  told the flat is sold and the other applicants have been turned
  away. And an offer moves with the buttons: a negotiator cannot type
  a state into it.
- Once an offer is accepted the **fee terms are frozen** - the offer
  amount, and the mandate's asking price, fee percentage, minimum and
  who pays it. Editing them afterwards edits what somebody gets
  invoiced.
- An offer below the owner's **floor price** is refused outright, until
  somebody uses the explicit *accept with the owner's approval* - which
  is a different button, with a confirmation, and it leaves a trace.
- **Accepting is an agent's decision, not a negotiator's.** A
  negotiator takes offers all day and cannot commit the owner.
- An accepted offer cannot simply be "rejected": it **fell through**,
  which is a different thing to the owner and to the fee.
- When a sale falls through the property goes back on the market and
  the other offers **stay rejected** until somebody deliberately puts
  them back on the table. Nothing un-rejects itself behind your back.
- Offers nobody answered lapse on their own deadline.

## The fee

Computed on the **price agreed**, never on the price that was asked,
with a minimum, and invoiced to the owner, the buyer or split -
whichever the mandate says. On a letting it is a share of a **year's**
rent, not of a month's. It cannot be invoiced before completion, and
never twice.

The fee is **frozen at completion** and invoiced from that figure, so
what goes on the invoice is what both sides agreed on the day,
whatever anybody edits afterwards. A split fee is rounded to the cent
and the second share is the remainder, so the two invoices add up.

## Lettings

- Rent per week or month, arrears visible, and a rent run that bills
  every period that has fallen due and **never bills the same period
  twice**. It ships switched off, because letting software bill people
  should be a decision.
- **Periods are anchored on the rent day.** The first one is pro-rated
  from the day they moved in and the last one is pro-rated to the day
  they leave, so a fortnight is not billed as a month and the
  anniversary does not walk down the calendar from the 31st.
- **Rent is written against a rent product**, set per company, and
  against no product and no tax if there is none - never against the
  agency fee product, which books the owner's rent as the agency's
  income with the fee's tax on it.
- **A credit note frees the month it credited.** The period goes back
  on the rent run, comes off what was billed, and stops counting as
  rent collected on the statement.
- A **break clause is a date**, inside the term, not a note somebody
  typed. Once the tenancy is running the **dates and the rent are
  frozen**: they are what the tenant signed. A tenancy that ended
  early frees the property **from the day they left**, so the flat can
  be re-let without back-dating anything.
- Starting a tenancy **completes the mandate** behind it and shows the
  property as let, so nobody markets a flat somebody lives in.
- Per-tenancy charges are marked as the **owner's or the tenant's**.
  Guessing that is how an agency loses a landlord. The tenant's are
  **invoiced to the tenant**, once; the owner's come off the
  statement.
- **The landlord statement** is a window on screen for a period you
  choose. It nets the management fee **and the repairs the agency
  advanced for the owner** off the rent actually collected, and
  reports it **net of tax** - the tax was never the owner's.

## The deposit

The part software usually gets wrong. It is the tenant's money held by
somebody else.

- It is **never invoiced**. It is recorded as held on the tenancy and
  shown on the landlord statement as held - never as rent, and never
  in anybody's turnover.
- A tenancy **cannot start** while a deposit that was agreed has not
  been taken.
- It is settled **once**, and not before the tenancy has ended -
  until then the money is still the tenant's. Settling it asks how
  much comes off and **why**, and the reason goes into the chatter,
  which is what the agency reads out when the tenant rings up about it
  three weeks later. A deduction bigger than the deposit is refused.

## Roles

A **negotiator** books viewings, takes offers and keeps applicants -
and cannot sign or withdraw an instruction, accept an offer or undo
somebody else's acceptance, delete a viewing, run a letting or invoice
anything. An **agent** signs, accepts, lets and bills. The **branch
manager** configures.

## Community only

Depends on `product`, `account` and `base_setup` - all Community.
Tested on 16.0, 17.0, 18.0, 19.0 and 20.0.

## How we make sure it works

Before every release, **99 automated checks** run against this app on Odoo 16, 17, 18, 19 and 20.
Among them:

- One agent cannot show two flats at once.
- A tenancy cannot start without the deposit.
- A negotiator cannot flip an offer state by hand.
- Protection is read live not frozen on the offer.
- The deposit cannot be settled while the tenancy runs.

The complete list is in the source you receive.

## What it does not do

Said before you buy, because it is the half that decides whether the app fits:

- Carry two live mandates on a property when either is exclusive.
- Expire a mandate that is under offer when its term runs out.
- Let a property's state be typed - it is computed from the mandate.

## Install

1. Copy `bambooforge_real_estate` into your addons path and update the app list, or install the ZIP from the Odoo Apps Store.
2. Install **Real Estate & Property Management**.
3. Open **Estate** - its menus are Properties, Mandates, Viewings, Offers.

## Questions people ask

****Which Odoo versions does it run on?****

Odoo 16.0, 17.0, 18.0, 19.0, 20.0, on the series you buy it for; each series is its own listing.

****Community or Enterprise?****

Both. It needs no Enterprise app.

****What does it need?****

The standard Discuss, Invoicing, Products, Settings apps. No extra Python package.

****Where does it show up?****

Under the **Estate** menu (Properties, Mandates, Viewings, Offers).

****Does anything leave my server?****

No. It makes no call outside your Odoo server: no telemetry, no licence check, no third-party service.

****What happens if I uninstall it?****

Odoo drops the app's own tables and fields; the standard records it worked on (contacts, orders, products) stay as they are.
