Running an HVAC business with Odoo

How do I request and approve time off in Odoo?

Workflow overview: How do I request and approve time off in Odoo?
Workflow overview. Instructional screenshots show the actual demo interface.

Set up a fictional leave type, approve an allocation and employee request, then check the balance, calendar and internal time in Odoo.

Alex needs a clear way for a technician to request time off and for the office to review it. We create one fictional leave type, allocate two training days and have the existing technician request October 20. The owner reviews and validates that request. We then check the saved balance and the calendar and internal time created by the installed official features, while reviewing the service job separately.

Alex Rivera and Demo Air HVAC are fictional training examples. Prices, dates, quantities and business situations in this guide are illustrative.

Before you begin

Tested in stock Odoo 20.0-20260926 Community as the demo owner administrator, with official modules and standard configuration. Complete How do I create an employee record in Odoo?, How do I set user access rights in Odoo?, How do I assign a technician and deadline to an Odoo task? and How do I record technician time on an Odoo job?. Reuse Demo Technician H42 and the linked technician login. The owner performs configuration and approval; the technician submits in a separate session. Employees and Timesheets are installed already. We activate the official Time Off (hr_holidays) app; the official project_timesheet_holidays integration also becomes installed with its shipped dependencies. These tested modules are Odoo-authored LGPL-3 modules. The employee uses the existing 40 hours/week working calendar, with eight hours per day. The two-day allowance is invented training data, not an employment entitlement, payroll decision or legal leave policy.

Step-by-step workflow

Step 1. Activate the official Time Off app

As the owner, open Apps, search for Time Off and select the actual module search suggestion. Check the Odoo-authored app, then click Activate once. Wait for installation to finish before opening Time Off. Keep the existing business and official modules intact; this lesson uses standard configuration. In this runtime, installation also supplies the owner's stock Time Off administration access.

Action 1: Find the official Time Off app. The actual target is highlighted in gold.
Find the official Time Off app.
Action 2: Activate official Time Off once. The actual target is highlighted in gold.
Activate official Time Off once.

Step 2. Give the existing technician employee access

Open Settings → Users & Companies → Users, then the existing Demo Technician H42 user. On Access Rights, set Time Off to Employee and click Save manually. Keep the User role and earlier Project/Own Timesheets permissions. The technician initially received an access error after app installation; reopening Time Off after this one grant worked. The technician's menu has My Time and Overview, without the owner's Management and Configuration controls.

Action 3: Open Settings Users and Companies. The actual target is highlighted in gold.
Open Settings Users and Companies.
Action 4: Open the existing technician user. The actual target is highlighted in gold.
Open the existing technician user.
Action 5: Open the technician Time Off permission. The actual target is highlighted in gold.
Open the technician Time Off permission.
Action 6: Choose Employee; preserve the earlier permissions. The actual target is highlighted in gold.
Choose Employee; preserve the earlier permissions.
Action 7: Save the technician Time Off permission once. The actual target is highlighted in gold.
Save the technician Time Off permission once.
Action 8: Reload retains Time Off Employee access. The actual target is highlighted in gold.
Reload retains Time Off Employee access.

Step 3. Assign the employee's time-off approver

Open Employees → Management, select Demo Technician H42 and choose Settings. Under the approval fields, set Time Off to Demo Air Owner, then save the employee. Keep the existing Expense reviewer and working calendar. This employee's Time Off Approver was initially empty; it is a separate setting from the expense reviewer and the employee's manager.

Action 9: Open the same technician employee record. The actual target is highlighted in gold.
Open the same technician employee record.
Action 10: Open the employee Settings tab. The actual target is highlighted in gold.
Open the employee Settings tab.
Action 11: Choose the Time Off approver separately. The actual target is highlighted in gold.
Choose the Time Off approver separately.
Action 12: Select Demo Air Owner as Time Off approver. The actual target is highlighted in gold.
Select Demo Air Owner as Time Off approver.
Action 13: Save this separate employee approver once. The actual target is highlighted in gold.
Save this separate employee approver once.
Action 14: Reload keeps the Time Off and Expense reviewers. The actual target is highlighted in gold.
Reload keeps the Time Off and Expense reviewers.

Step 4. Create and save the fictional time type

Open Time Off → Configuration → Time Types → New. Enter Demo Training Leave H63, code DEMOH63, and United States as Country. Keep Considered as Absence, choose Days as the unit and Full Day as Duration Type, and make it available for Time Off. On the Time Off tab, choose By Time Off Approver, retain Requires Allocation, keep employee allocation requests and negative balances off, and use Working Days. Keep allocation approval By HR Responsible. Click Save manually, then reopen to check the saved choices. These invented settings do not define a lawful leave policy.

Action 15: Open Time Off Configuration. The actual target is highlighted in gold.
Open Time Off Configuration.
Action 16: Open the native Time Types library. The actual target is highlighted in gold.
Open the native Time Types library.
Action 17: Create one fictional training time type. The actual target is highlighted in gold.
Create one fictional training time type.
Action 18: Name the fictional leave type. The actual target is highlighted in gold.
Name the fictional leave type.
Action 19: Give this sample type its own code. The actual target is highlighted in gold.
Give this sample type its own code.
Action 20: Retain the sample country United States. The actual target is highlighted in gold.
Retain the sample country United States.
Action 21: Keep this type as Absence. The actual target is highlighted in gold.
Keep this type as Absence.
Action 22: Use Days as the allocation unit. The actual target is highlighted in gold.
Use Days as the allocation unit.
Action 23: Keep Full Day as the duration type. The actual target is highlighted in gold.
Keep Full Day as the duration type.
Action 24: Make this type available for Time Off. The actual target is highlighted in gold.
Make this type available for Time Off.
Action 25: Review the Time Off policy tab. The actual target is highlighted in gold.
Review the Time Off policy tab.
Action 26: Require the employee Time Off approver. The actual target is highlighted in gold.
Require the employee Time Off approver.
Action 27: Require an allocation before requesting leave. The actual target is highlighted in gold.
Require an allocation before requesting leave.
Action 28: Keep employee allocation requests off. The actual target is highlighted in gold.
Keep employee allocation requests off.
Action 29: Keep negative balances off. The actual target is highlighted in gold.
Keep negative balances off.
Action 30: Count working days in this sample. The actual target is highlighted in gold.
Count working days in this sample.
Action 31: Save the fictional policy once. The actual target is highlighted in gold.
Save the fictional policy once.
Action 32: Reload retains the required-allocation policy. The actual target is highlighted in gold.
Reload retains the required-allocation policy.

Step 5. Create a two-day allocation and validate it

Open Management → Allocations → New. Select Demo Training Leave H63 and employee Demo Technician H42. Set Allocation 2 Days, use description DEMO-H63-ALLOC-001 — Fictional two-day training allowance, and add a reason identifying it as fictional training only. In this capture, the validity start is October 16, 2026. Keep the No Limit end. Save once. The allocation is To Approve, with an Allocation Approval activity for the owner; it is not usable approval merely because the owner created it. Review it and click Validate once. Reopen and confirm Approved / 2 days.

Action 33: Open Time Off Management. The actual target is highlighted in gold.
Open Time Off Management.
Action 34: Open the native Allocations view. The actual target is highlighted in gold.
Open the native Allocations view.
Action 35: Create one two-day training allocation. The actual target is highlighted in gold.
Create one two-day training allocation.
Action 36: Find the fictional training time type. The actual target is highlighted in gold.
Find the fictional training time type.
Action 37: Select Demo Training Leave H63. The actual target is highlighted in gold.
Select Demo Training Leave H63.
Action 38: Find the existing technician employee. The actual target is highlighted in gold.
Find the existing technician employee.
Action 39: Select the existing technician for this allowance. The actual target is highlighted in gold.
Select the existing technician for this allowance.
Action 40: Enter two fictional training days. The actual target is highlighted in gold.
Enter two fictional training days.
Action 41: Label the allowance as fictional training. The actual target is highlighted in gold.
Label the allowance as fictional training.
Action 42: Keep the invented allowance scope explicit. The actual target is highlighted in gold.
Keep the invented allowance scope explicit.
Action 43: Keep the displayed allocation validity start. The actual target is highlighted in gold.
Keep the displayed allocation validity start.
Action 44: Save one allocation for approval. The actual target is highlighted in gold.
Save one allocation for approval.
Action 45: Review and validate this two-day allocation once. The actual target is highlighted in gold.
Review and validate this two-day allocation once.
Action 46: Reload retains the approved two-day allocation. The actual target is highlighted in gold.
Reload retains the approved two-day allocation.

Step 6. Open a time-off request in the technician session

Reopen Time Off as the existing technician. The balance card shows 2 Demo Training Leave H63 Available. Use the top New dropdown and choose New Time Off. The balance panel's New Request opened a New Allocation dialog in this test; if that happens, discard the unsaved allocation dialog and use New → New Time Off. Do not submit another allocation. In New Time Off, explicitly select Demo Training Leave H63 (2 remaining out of 2 days) instead of accepting the initially selected type.

Action 47: The approved allowance provides two available days. The actual target is highlighted in gold.
The approved allowance provides two available days.
Action 48: Open the top New dropdown for a time-off request. The actual target is highlighted in gold.
Open the top New dropdown for a time-off request.
Action 49: Choose New Time Off, not an allocation request. The actual target is highlighted in gold.
Choose New Time Off, not an allocation request.
Action 50: Find the fictional training leave type. The actual target is highlighted in gold.
Find the fictional training leave type.
Action 51: Select the type with two approved days. The actual target is highlighted in gold.
Select the type with two approved days.

Step 7. Set both dates and inspect the calculated day

Click the start date, enter 10/20/2026 and press Enter to commit and close the picker. Set the end date to 10/20/2026 separately and press Enter again. Changing only the start left the old end date and temporarily calculated zero days in this test. Before submission, verify both endpoints show Oct 20 and the duration is 1.00 day(s). Enter description DEMO-H63-LEAVE-001 — Fictional personal leave; no real absence or entitlement. The saved request uses the employee's calendar and calculates one day/eight hours; partial days, custom hours and other calendars are outside this example.

Action 52: Set the request start date explicitly. The actual target is highlighted in gold.
Set the request start date explicitly.
Action 53: Enter October 20 and press Enter. The actual target is highlighted in gold.
Enter October 20 and press Enter.
Action 54: Set the request end date separately. The actual target is highlighted in gold.
Set the request end date separately.
Action 55: Commit October 20 as the end date too. The actual target is highlighted in gold.
Commit October 20 as the end date too.
Action 56: Check both October 20 dates and the one-day duration. The actual target is highlighted in gold.
Check both October 20 dates and the one-day duration.
Action 57: Label the request as fictional personal leave. The actual target is highlighted in gold.
Label the request as fictional personal leave.

Step 8. Submit once and check the pending review

Click Submit Request once and wait for the saved result. The request is To Approve, created by the technician for the correct employee and type. The available balance already becomes 1 while the day is pending. Odoo creates one Time Off Approval activity assigned to Demo Air Owner. A successful click alone is not proof of final approval; keep the same request and have the approver review it rather than submitting it again.

Action 58: Submit this one-day request once for review. The actual target is highlighted in gold.
Submit this one-day request once for review.
Action 59: The pending day leaves one day available. The actual target is highlighted in gold.
The pending day leaves one day available.
Action 62: Open the one pending technician request. The actual target is highlighted in gold.
Open the one pending technician request.

Step 9. Review and validate as the owner

In the owner session, open Time Off → Management → Time Off. The Waiting For Me list shows one pending request for Demo Technician H42, the training type and October 20, 8:00 AM–4:00 PM, with duration one day. Open that row and review the description, employee, type, dates and allowance. Click Validate once and wait for Approved. The native approval activity is completed. The request's status history records the owner's change; this is a manual approval decision.

Action 60: Open the owner Time Off review menu. The actual target is highlighted in gold.
Open the owner Time Off review menu.
Action 61: Open the owner waiting-for-review list. The actual target is highlighted in gold.
Open the owner waiting-for-review list.
Action 62: Open the one pending technician request. The actual target is highlighted in gold.
Open the one pending technician request.
Action 63: Review the fictional request before approving. The actual target is highlighted in gold.
Review the fictional request before approving.
Action 64: Validate this one-day request once as owner. The actual target is highlighted in gold.
Validate this one-day request once as owner.
Action 65: Reload retains the same approved request. The actual target is highlighted in gold.
Reload retains the same approved request.

Step 10. Reopen the same request in both sessions

Reload the owner's saved request. In the technician session, reload My Time Off, select List View and open the existing training-type row. Both views show Approved, October 20 and 1.00 day(s); the summary shows 1 / 2 days and 1 day remaining. The technician view offers Cancel, while the owner offers Back to Approval and Refuse. Leave those controls unused: this lesson preserves the approved request. The Calendar control opens the native time-off calendar. In the tested owner session, it also displayed a warning that this administrator was not linked to an employee in the current company. The technician's approved request remained saved. Approval created one linked calendar event and one resource-calendar absence in this runtime.

Action 65: Reload retains the same approved request. The actual target is highlighted in gold.
Reload retains the same approved request.
Action 66: The approved day leaves one day available. The actual target is highlighted in gold.
The approved day leaves one day available.
Action 67: Use List View to reopen the saved request. The actual target is highlighted in gold.
Use List View to reopen the saved request.
Action 68: Open the same approved training request. The actual target is highlighted in gold.
Open the same approved training request.
Action 69: Reload preserves the approved October 20 dates. The actual target is highlighted in gold.
Reload preserves the approved October 20 dates.
Action 70: Cancel is available; leave the approval in place. The actual target is highlighted in gold.
Cancel is available; leave the approval in place.
Action 71: Review one of two days and one day remaining. The actual target is highlighted in gold.
Review one of two days and one day remaining.
Action 72: Open the native employee Time Off Calendar. The actual target is highlighted in gold.
Open the native employee Time Off Calendar.
Action 73: The native Time Off Calendar opens here. The actual target is highlighted in gold.
The native Time Off Calendar opens here.

Step 11. Check the automatically generated internal time

As the owner, open Timesheets → Timesheets → All Timesheets. There are two existing-technician rows: the earlier October 14 / 1h 30m service entry and the new October 20 / Internal / Time Off / Time Off (1/1) / 8h row. The installed official integration created the leave row on approval. It is read-only and has no sales-order item or invoice link. The list total is 9h 30m, combining different dates and purposes; do not treat that total as billable service time or a payroll result. Keep employee/date filters explicit when preparing the later export.

Action 74: Open the owner Timesheets menu. The actual target is highlighted in gold.
Open the owner Timesheets menu.
Action 75: Review All Timesheets for the existing technician. The actual target is highlighted in gold.
Review All Timesheets for the existing technician.
Action 76: Internal leave adds eight non-billable hours. The actual target is highlighted in gold.
Internal leave adds eight non-billable hours.
Action 77: The earlier billed service entry remains one and a half hours. The actual target is highlighted in gold.
The earlier billed service entry remains one and a half hours.
Action 78: The combined total is nine hours thirty minutes. The actual target is highlighted in gold.
The combined total is nine hours thirty minutes.

Step 12. Review the service job and notification outcome separately

Open the existing service project and its S00008 - Demo Time-Billed Labor H41 task. It remains assigned to the same technician, Done in Office Review, with the original October 16, 4:00 PM deadline and billed 1.5 hours. The separate manual job also remains unchanged. October 20 leave does not overlap that October 16 deadline, so this case does not test a real scheduling conflict or automatic reassignment. Review affected jobs manually when dates do overlap. The in-app approval worked, but the fixture's blank addresses caused email delivery failures; no successful notification email is claimed or retried.

Action 79: The separate service job remains Done. The actual target is highlighted in gold.
The separate service job remains Done.
Action 80: Its October 16 deadline is separate from October 20 leave. The actual target is highlighted in gold.
Its October 16 deadline is separate from October 20 leave.
Action 81: Review this job original billed time separately. The actual target is highlighted in gold.
Review this job original billed time separately.
Action 82: The same service entry remains billed at one and a half hours. The actual target is highlighted in gold.
The same service entry remains billed at one and a half hours.
Action 83: Inspect the actual failed email notification. The actual target is highlighted in gold.
Inspect the actual failed email notification.
Action 84: Email delivery failed; leave retry unused. The actual target is highlighted in gold.
Email delivery failed; leave retry unused.

Check the result

One fictional time type, one approved two-day allocation and one technician-created request are saved. Owner validation approves October 20 as one day/eight hours, completes the approval activity and leaves one day available. Both roles reopen the same approved request. Approval creates one linked calendar event, one resource-calendar absence and one read-only eight-hour Internal/Time Off entry through the installed official integration. The original billed 1.5-hour service entry, both service tasks, skills and financial records are preserved. Four email notification exceptions remain; in-app approval does not establish delivered email.

If your screen differs

These steps use one full working day and the stated employee calendar; another calendar or partial-day policy may calculate a different duration. Check the selected type, approved allocation and both dates. If internal leave time is missing, check the official integration and company Internal project/Time Off task settings. For notifications, inspect the actual delivery status; this fixture retained blank recipient/sender failures. The demonstrated job deadline does not overlap the leave, so job coverage still needs manual review. Refusal, cancellation, accruals, overlapping requests and external calendar synchronization were not exercised. The fictional allowance does not define real entitlements or a payroll/legal policy.

Frequently asked questions

How do I request and approve time off in Odoo? Give the linked user the stock Time Off Employee access, set the employee's approver and save a time type with the intended approval/allocation policy. Approve the required allocation first. The employee uses New → New Time Off, selects the type, sets both dates and submits once. The owner reviews Management → Time Off and uses Validate. Reopen the same request and confirm Approved and the remaining balance.
Why can't an employee request time off in Odoo? Check the actual access error, user-to-employee link, Time Off permission, selected type and required approved allocation. Installing the app alone did not grant this existing technician access; the native Time Off → Employee user permission fixed that case. Also check both date endpoints and the calculated duration. The balance panel's New Request opened an allocation dialog here; use New → New Time Off for an absence.
Does Odoo time off update timesheets and reschedule jobs? In this tested configuration, approval created a linked calendar event, a resource-calendar absence and a read-only eight-hour Internal/Time Off entry through the official project_timesheet_holidays integration. The billed service entry and service-task assignments/deadlines stayed unchanged. This example has no actual job/leave overlap, so automatic conflict handling or reassignment remains untested. Review job coverage manually and do not treat generated internal hours as payroll approval.

Continue building the business

Continue with How do I export Odoo timesheets for a payroll provider?. Review the employee, date range and purpose of each row; generated leave time and billed service time need separate review before any provider handoff.

Talk to an Odoo partner

Bring your current process and the result you need to Onward to plan your Odoo workflow. Talk to an Odoo partner.