Odoo 19 Enterprise for a multi-service facility management company
One database carries a contract from enquiry to a costed, invoiced, reconciled job, with a custom workforce-visibility layer for field staff who are never in the office.
Property & event management
Catering, pest control, disinfection
India
Project snapshot
Odoo modules in scope
Custom-built and beyond standard
- Custom Attendance Manager dashboard: headcount and attendance percentage, who is checked in, late check-ins past a grace period, missing check-outs, and worked versus expected hours by department
- Mobile self check-in and check-out portal for distributed field staff, with live status and dated history
- Subscription-driven annual maintenance and housekeeping contracts, with one-click quotation templates and held renewal dates
- Quotation confirmed to sales order automatically generates the project task, so the commercial document and the operational job are the same record
- Timesheets linked back to the sales order line, turning booked hours into real margin per site
- Kiosk attendance at each client site by badge, RFID token or manual identification
- Customer-to-multi-site hierarchy so profitability is visible per site, not just per customer
The business
This company does not sell one service to one kind of buyer. Its lines run across facility management, property management, event management, catering, pest control, general disinfection and specialised services delivered to a client’s specification. That mix is the whole problem statement.
Each line has a different commercial shape. Property management is an annual contract billed on a cycle. Event management is a one-off job with a fixed date and a spike in labour. Pest control and disinfection are scheduled visit programmes. Catering carries consumables and stock. All of them share the same pool of field staff, the same supervisors and the same bank account.
What was breaking
A business like this usually runs on four or five disconnected systems: a package or an accountant for the books, spreadsheets for contract renewals, chat groups for job allocation, a register or biometric machine at each site for attendance, and the owner’s memory for margin per contract. Nothing reconciles.
Contract revenue was an assumption
Facility management revenue is contract revenue, yet renewal dates and recurring value lived in spreadsheets. Nobody could see the recurring book as a number rather than a guess.
Margin per site was unknowable
Answering “did we make money on that contract last quarter” took a week of work, because labour cost was never attached to the contract that funded it.
The workforce was invisible
Staff are never in the office. Attendance sat in a register or a machine at each client site, disconnected from payroll and from the job it belonged to.
Nothing joined up
Enquiry, quote, job, roster, attendance, timesheet and invoice each lived in a different place, so a single job never had one thread running through it.
What the system had to do
One requirement shaped the whole build: a single Odoo 19 Enterprise database had to carry a contract from enquiry through to a costed, invoiced, reconciled job without leaving the system at any point. The solution was built along that chain in order, rather than app by app.
Inside the solution
CRM · Sales
The enquiry that arrives through the website or a referral sits in a stage-based pipeline with an owner and a next action, not in an inbox. A quotation is raised directly from the opportunity record.
Sales · Project
Confirming the sales order generates the project task automatically. The commercial document and the operational job are the same object, so nobody re-enters the scope into a separate job sheet. For a facility management company this is the mechanism that matters most.
Subscriptions
Annual maintenance and housekeeping contracts run as subscriptions with a recurring plan, payment terms and a pricelist, raised in one click from a template. Subscriptions produce the invoice on schedule, hold the renewal date, and turn recurring revenue into a visible number. This is the single highest-value app in the stack for this business.
Project · Timesheets
A project with a New, work-in-progress and Done flow holds the tasks, each linked back to the originating sales order line. Hours booked against a task become real cost against the contract that funded it, so margin per site becomes a report rather than an argument.
Attendances · Employees
A tablet in kiosk mode at each client site takes attendance by badge scan, RFID token or manual identification, turning it into an auditable record tied to payroll and to the job. This is the answer to the hardest operational problem in facility management: the workforce is never where the office is.
Purchase · Inventory
Cleaning chemicals, consumables, pest control material and catering supplies enter as cost through purchase and stock, issued to a site and accounted for, rather than surfacing later as cash reimbursements.
Accounting
Customer invoices, bank reconciliation and the aged receivable report run from one place. The aged receivable view is the collection tool: which client owes what, for how long, against which contract.
Dashboards
Pre-built dashboards carry quotation and order counts, revenue and average order value over a rolling window, giving the owner a live read without exporting anything.
The custom workforce layer
Standard Odoo handles the contract-to-cash chain. The workforce-visibility layer that a distributed-labour business actually runs on is custom work by Ochre, running on real data here and across other Ochre production deployments.
Attendance Manager dashboard
Built by Ochre, not standard Odoo. Attendance percentage against headcount, employees currently checked in, late check-ins beyond a grace period, missing check-outs and worked hours in period, filterable by period, department and manager, with a daily trend and a worked-versus-expected comparison by department.
Mobile self check-in portal
Field staff check in and out from a phone, with live status, hours worked today and a dated check-in history. It is the piece that makes site attendance real without a machine on every wall.
The Odoo 19 Enterprise footprint
| Enquiry pipeline, site surveys, follow-up | CRM |
| Quotations, rate cards, service catalogue | Sales |
| Annual maintenance and housekeeping contracts, renewals | Subscriptions |
| Job execution, site-wise stages, checklists | Project |
| Labour cost against contract | Timesheets |
| Site-level attendance, kiosk, payroll input | Attendances, Employees |
| Shift rosters and on-site scheduling | Planning |
| Consumables, chemicals, catering material | Inventory, Purchase |
| Invoicing, GST, collections, reconciliation | Accounting |
| Contract-wise margin, receivables, workforce | Dashboards |
| Field staff on phones, on site | Odoo mobile app |
A version note that changes the plan
Odoo retired the standalone Field Service app in release 19.2 and merged its capability into Planning. Anyone scoping a facility management rollout against older Odoo 19 material will budget for a module that no longer exists as a separate line. For this business that is good news: Planning handles shifts and roles, which is closer to how a housekeeping or security roster works than a task-per-visit model, and recurring shifts map cleanly onto a monthly deep-clean cycle or a scheduled pest control programme.
The result
The company now runs enquiry to invoice on one Odoo 19 Enterprise database. A confirmed quotation opens the job automatically, recurring contracts invoice on schedule and hold their own renewal dates, and hours booked at each site land as real cost against the contract that funded them, so margin per site is a report rather than an argument. Field staff check in from a phone or a site kiosk, and supervisors see attendance, late arrivals and worked-versus-expected hours on one dashboard instead of chasing registers across sites.
Running a distributed workforce off registers and spreadsheets?
We put the whole contract-to-cash chain on one Odoo database and add the workforce-visibility layer a field-service business actually runs on. See it working on your own service lines.

