Case study · Commercial real estate

Chesapeake Daisy: a multi-tenant building, billed with two approvals a month.

Chesapeake Daisy, LLC owns a 16,250 sq ft multi-tenant commercial building in San Diego. Rent, pass-through operating expenses, loans, depreciation and the bank all used to live in a spreadsheet and an inbox. Now they live in Odoo, and the monthly close runs itself.

Client
Chesapeake Daisy, LLC
Industry
Commercial property management
Platform
Odoo 17 Community, self-hosted
Scope
Custom leasing module + full books

The problem.

Commercial leases are not simple invoices. Rent escalates on anniversaries, first months prorate, and on a net lease every tenant also owes its share of the building’s operating costs: property tax and insurance smoothed across the year, plus the utilities, janitorial, pest and landscaping that actually cleared the bank that month.

The owner was building that statement by hand in a spreadsheet, working out each tenant’s percentage, and emailing screenshots every quarter. Odoo does not ship commercial-lease billing. So we built one.

What we built.

A custom Odoo module for units and leases, on top of Odoo accounting, fed by the bank.

Units & leases

Suites, tenants and leases modeled in Odoo, with scheduled rent escalations and a reminder a month before each one takes effect.

Automatic rent billing

Rent invoices raised and emailed on the last day of the prior month, escalations and prorations resolved against the period being billed, never against today.

Itemized NNN statements

The spreadsheet, rebuilt in Odoo: annual items smoothed monthly, service lines filled from the bank feed by simple vendor rules, and a branded PDF statement sent with each tenant’s invoice.

Owner approval by email

The draft statement arrives in the owner’s inbox. Finalize bills each tenant’s share; Approve emails every tenant their statement. Each link opens a confirm page, so corporate link scanners cannot trigger either one.

Bank feed & reconciliation

Plaid pulls the bank daily, auto-reconciles tenant payments to their invoices, and flags any tenant whose payment falls short of rent plus operating costs.

Loans, depreciation & net worth

Mortgage amortization, monthly building depreciation with the land split out, and a nightly net-worth snapshot of the entity.

Odoo 17 CommunityCustom moduleAccountingPlaidQWeb PDF reportsScheduled actionsAutomated tests

How it runs now.

  • The owner’s month is two approvals: finalize the statement, which bills it, then approve the tenant emails. Rent bills and emails itself on the last day of the month.
  • The spreadsheet is retired. The first quarter’s statements were rebuilt in Odoo and tied to the original sheets to the cent.
  • The bank is reconciled daily, not quarterly. Payments match themselves to invoices; what does not match lands in a short review queue.
  • Books kept apart. The property’s ledger lives in its own database, fully separate from the owner’s other businesses.

The part nobody sees.

Automating billing is the easy half. The hard half is being right. Before a date-anchored billing run went live, review caught that a rent escalation landing on the first of a month would have been missed by an invoice raised the day before, so rent is now always computed for the period billed, with a test that proves it. A later audit of the receivable found tenant payments posted straight to income and credits that had never been applied. Both were corrected without restating a single month of profit and loss.

We read the ledger, not the invoice list. That habit is what we bring to your books too.

More work from the shop.

Your building, your leases, one ledger.

Landlord, property manager, or anyone else whose billing lives in a spreadsheet: tell us how you bill today, and we will tell you what Odoo can take off your plate.

or email [email protected]