Running an HVAC business with Odoo

How do I schedule recurring HVAC maintenance visits in Odoo?

Workflow overview: How do I schedule recurring HVAC maintenance visits in Odoo?
Workflow overview. Instructional screenshots show the actual demo interface.

Schedule recurring HVAC maintenance tasks in Odoo, verify the Done trigger, review copied visit details and stop at the agreement term.

Alex needs two maintenance visits within one annual agreement. Odoo recurring tasks can prepare the next job when the current task is closed. In this example, a six-month interval produces the second task, while an explicit end date prevents another task outside the agreement term. Customer booking, technician availability and billing still need their own review.

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 H50 maintenance agreements and H40 service jobs. Use official Project and the existing Demo Service Jobs H40 project, Demo Property H08, Demo Technician H42 and maintenance sale S00013. The agreement covers October 15, 2026–October 14, 2027: one annual $240 fee for two planned visits. Recurrence does not change that price or renew the agreement. The deadlines below are internal targets, not confirmed appointments. Perform the completion/stop tests only in a training environment: both future tasks are closed synthetically to check automation, with no actual work or time recorded. Keep messages in the local test sink.

Step-by-step workflow

Step 1. Enable recurring tasks on the existing project

Open Project → Projects. On Demo Service Jobs H40, open the card’s more_vert → Settings, then its Settings tab. Select Recurring Tasks and click Save manually. Keep the existing visibility, Timesheets, Billable, stages and project team. This is a project setting; the existing installation projects are unchanged.

Action 1: Use the existing Demo Service Jobs project. The actual target is highlighted in gold.
Use the existing Demo Service Jobs project.
Action 2: Open this project’s Settings. The actual target is highlighted in gold.
Open this project’s Settings.
Action 3: Enable Recurring Tasks without changing the other settings. The actual target is highlighted in gold.
Enable Recurring Tasks without changing the other settings.
Action 4: Save the project recurring setting once. The actual target is highlighted in gold.
Save the project recurring setting once.
Action 5: Saved Recurring Tasks is enabled on this project only. The actual target is highlighted in gold.
Saved Recurring Tasks is enabled on this project only.

Step 2. Create a separate maintenance visit task

Open the project’s Tasks button. Click New, enter H51 annual maintenance visit — training recurrence in Task Title, then click Edit to open the full task. This quick-create action already creates the initial task. Continue editing that same record instead of clicking Add or New again. It starts in the project’s Ready stage with In Progress status.

Action 6: New: create one separate maintenance visit. The actual target is highlighted in gold.
New: create one separate maintenance visit.
Action 7: Task Title: label the fictional recurrence test. The actual target is highlighted in gold.
Task Title: label the fictional recurrence test.
Action 8: Edit already creates this task; continue on the same record. The actual target is highlighted in gold.
Edit already creates this task; continue on the same record.
Action 9: Same task13 starts Ready and In Progress; no second creation. The actual target is highlighted in gold.
Same task13 starts Ready and In Progress; no second creation.

Step 3. Set the customer, technician and first deadline

Select Customer → Demo Property H08 and Assignees → Demo Technician H42. Set Deadline October 22, 2026, 4:00 PM in the owner’s America/New_York timezone, then commit the date. Leave Allocated Time at zero in this recurrence test. The deadline does not reserve the technician’s calendar or confirm a customer visit. Review access, equipment, actual scope and availability separately.

Action 10: Select the existing Demo Property customer. The actual target is highlighted in gold.
Select the existing Demo Property customer.
Action 11: Assign Demo Technician H42; review real availability separately. The actual target is highlighted in gold.
Assign Demo Technician H42; review real availability separately.
Action 12: Internal target October22,2026 at4PM New York; no appointment. The actual target is highlighted in gold.
Internal target October22,2026 at4PM New York; no appointment.

Step 4. Check the sales line explicitly

Inspect Sales Order Item after selecting the customer. Check the current value before continuing; it may show Non-billable or an older labor line. Replace it with S00013 – Demo Maintenance Agreement H50, using the H50-ANNUAL service. If the task was already saved with the older line, correct it and save the same task. Do not create another sale. The intended link identifies the annual agreement; it does not add another annual fee or create an invoice.

Action 14: Select the native S00013 annual agreement at240. The actual target is highlighted in gold.
Select the native S00013 annual agreement at240.
Action 15: Reviewed S00013 link identifies one annual agreement. The actual target is highlighted in gold.
Reviewed S00013 link identifies one annual agreement.
Action 18: Reopened task13 retains S00013, technician and first deadline. The actual target is highlighted in gold.
Reopened task13 retains S00013, technician and first deadline.

Step 5. Write visit scope that will remain useful when copied

In Description, label this a FICTIONAL H51 RECURRENCE TEST. Record the manual agreement reference S00013, Demo Property H08 and Service Site H08, 205 Demo Service Lane. Include the October 15, 2026–October 14, 2027 term, the annual fee covering two visits, and target dates October 22, 2026 and April 22, 2027. Ask the office to confirm customer timing, access, technical scope and technician availability before each occurrence. State that synthetic completion proves no actual work, payment or renewal.

Action 16: Fictional scope: two target visits, manual checks and no renewal. The actual target is highlighted in gold.
Fictional scope: two target visits, manual checks and no renewal.
Action 17: Save the same created task with reviewed scope and agreement. The actual target is highlighted in gold.
Save the same created task with reviewed scope and agreement.
Action 19: Reopened scope retains training-only visit and fee limits. The actual target is highlighted in gold.
Reopened scope retains training-only visit and fee limits.

Step 6. Set six months and a specific end date

Click the redo icon beside Deadline to show Repeat Every. Enter 6, select Months, and change Forever to Until. Click the end-date control and enter October 14, 2027. This task-recurrence end is entered separately; Odoo did not read it from the agreement’s free-text Terms and conditions. Keep the first deadline populated. Save, wait for pending-change controls to disappear and reload the same task. Check the S00013 line, technician, description, October 22 deadline and six-month/Until settings. At this point there is only 1 Recurring Task.

Action 20: Enable recurrence on the same reviewed task. The actual target is highlighted in gold.
Enable recurrence on the same reviewed task.
Action 21: Enter interval6 and select Months. The actual target is highlighted in gold.
Enter interval6 and select Months.
Action 22: Change Forever to a bounded Until rule. The actual target is highlighted in gold.
Change Forever to a bounded Until rule.
Action 23: Open the separate task-recurrence end date. The actual target is highlighted in gold.
Open the separate task-recurrence end date.
Action 24: Until October14,2027: entered independently of agreement Terms. The actual target is highlighted in gold.
Until October14,2027: entered independently of agreement Terms.
Action 25: Save sixMonths/Until once before any synthetic Done. The actual target is highlighted in gold.
Save sixMonths/Until once before any synthetic Done.
Action 26: Reopened endOct14,2027 with sixMonths and first deadline retained. The actual target is highlighted in gold.
Reopened endOct14,2027 with sixMonths and first deadline retained.
Action 27: Only1Recurring Task exists before first completion. The actual target is highlighted in gold.
Only1Recurring Task exists before first completion.

Step 7. Exercise the completion trigger in the training task

Open the task status menu, choose Done, then click Save manually. This native saved status change creates the next occurrence immediately; the test does not wait until October 22 or run a scheduler. The first task stays Done in its Ready stage, so stage and task status remain distinct. Only close a real task when its actual work is ready for closure. The future dates here are deliberately synthetic test data.

Action 28: Choose Done only for this synthetic future task. The actual target is highlighted in gold.
Choose Done only for this synthetic future task.
Action 29: Done is pending: save is the actual recurrence trigger. The actual target is highlighted in gold.
Done is pending: save is the actual recurrence trigger.
Action 30: Save Done once: create the next occurrence immediately. The actual target is highlighted in gold.
Save Done once: create the next occurrence immediately.
Action 31: Two recurring tasks after Save; first stays Done in Ready stage. The actual target is highlighted in gold.
Two recurring tasks after Save; first stays Done in Ready stage.

Step 8. Review the generated task before arranging a visit

Click 2 Recurring Tasks. Open the unfinished row, which has no Done checkmark, and verify Deadline April 22, 2027, 4:00 PM. Check the same project, customer, technician, S00013 agreement line and copied description. The new task is Ready/In Progress with zero allocation and time. Review its copied scope and dates before dispatch; copied text can carry old instructions forward. No calendar appointment, new invoice, payment or additional agreement charge was created.

Action 32: Open the two native recurring tasks. The actual target is highlighted in gold.
Open the two native recurring tasks.
Action 33: Ready group contains2records; one remains unfinished. The actual target is highlighted in gold.
Ready group contains2records; one remains unfinished.
Action 34: Open the unfinished row without the Done checkmark. The actual target is highlighted in gold.
Open the unfinished row without the Done checkmark.
Action 35: Generated deadline April22,2027 at4PM; review before booking. The actual target is highlighted in gold.
Generated deadline April22,2027 at4PM; review before booking.
Action 36: Copied annual S00013 line; no extra agreement fee. The actual target is highlighted in gold.
Copied annual S00013 line; no extra agreement fee.
Action 37: Copied fictional scope still needs customer and technician review. The actual target is highlighted in gold.
Copied fictional scope still needs customer and technician review.

Step 9. Check that revisiting the earlier occurrence does not duplicate the next one

In this training test, return to the first occurrence. Change its status back to In Progress, save, then choose Done and save again. Reopen Recurring Tasks and check the same two records. This repeated closure of the older occurrence produced no third task. Do not apply that result to arbitrary date edits, duplicate commands or other recurrence changes that were not tested.

Action 38: Training check: reopen the earlier occurrence13. The actual target is highlighted in gold.
Training check: reopen the earlier occurrence13.
Action 39: Save earlier InProgress; keep the same two tasks. The actual target is highlighted in gold.
Save earlier InProgress; keep the same two tasks.
Action 40: Choose Done again on the earlier synthetic occurrence. The actual target is highlighted in gold.
Choose Done again on the earlier synthetic occurrence.
Action 41: Save olderDone again; this tested repeat creates no third. The actual target is highlighted in gold.
Save olderDone again; this tested repeat creates no third.
Action 42: Reopen the native series after the older repeat. The actual target is highlighted in gold.
Reopen the native series after the older repeat.
Action 43: Same2records remain; group counter is not the task count. The actual target is highlighted in gold.
Same2records remain; group counter is not the task count.

Step 10. Verify the agreement-end stop in the training series

Open the second occurrence, verify its April 22, 2027 deadline and Until October 14, 2027, then choose Done and save. Its next six-month deadline would be October 22, 2027, beyond this configured end. Reload and inspect the series: it still contains exactly two tasks, both synthetically Done, with no third occurrence. Their recorded work time is zero; these statuses do not establish actual maintenance visits. Preserve the training evidence. Review any real renewal and future dates before setting up another term.

Action 44: Second target remains April22,2027 at4PM; synthetic test only. The actual target is highlighted in gold.
Second target remains April22,2027 at4PM; synthetic test only.
Action 45: Until October14,2027: next October22 lies beyond this end. The actual target is highlighted in gold.
Until October14,2027: next October22 lies beyond this end.
Action 46: Choose Done on the latest future task only for training. The actual target is highlighted in gold.
Choose Done on the latest future task only for training.
Action 47: Save latestDone once; configured end prevents a third task. The actual target is highlighted in gold.
Save latestDone once; configured end prevents a third task.
Action 48: After reload still2Recurring Tasks; no October2027 successor. The actual target is highlighted in gold.
After reload still2Recurring Tasks; no October2027 successor.
Action 49: Open the final synthetic series for review. The actual target is highlighted in gold.
Open the final synthetic series for review.
Action 50: Two Done records in Ready stage; group worktime0h. The actual target is highlighted in gold.
Two Done records in Ready stage; group worktime0h.
Action 13: Read-only comparison: earlier task13 retains annual S00013 line. The actual target is highlighted in gold.
Read-only comparison: earlier task13 retains annual S00013 line.

Check the result

The existing project has Recurring Tasks enabled. One new task and its generated successor share the intended annual agreement line, customer, technician, scope and native recurrence. Their deadlines are October 22, 2026 and April 22, 2027 at 4:00 PM local time. Saving the first Done creates one successor; repeating completion on the older task adds none. Saving the second Done stops at the configured October 14, 2027 end, retaining two synthetic completed tasks and no third. The $254.40 agreement total, annual terms, planned office handoff and invoiceable quantity remain unchanged; its sales order now links these two tasks. No work time, invoice, payment, stock movement, appointment or new sale is created. Earlier business records are preserved.

If your screen differs

These are recurring Project tasks in stock Odoo 20 Community. The tested generation trigger is a saved Done status on the latest occurrence; a target date alone was not demonstrated as a trigger. Both future tasks were deliberately closed in training, with no actual service or customer acceptance. Recurrence copies scope and the sales link, so review the Sales Order Item after choosing a customer and review copied instructions before each visit. The explicit recurrence end is independent of free-text agreement terms and was tested with populated deadlines. Other roles, missing deadlines, cancellation, immediate recurrence disabling, end-date edits and daylight-saving transitions outside the two tested dates remain unverified. Assignment generated a local email notification failure because the fictional technician has no valid email; no delivery or retry is claimed. Recurrence does not book appointments, renew coverage or automate billing.

Frequently asked questions

How do I schedule recurring HVAC maintenance in Odoo? Enable Recurring Tasks in the project’s Settings, prepare a task with a deadline and reviewed agreement link, then set Repeat Every and Until. In this tested stock Odoo 20 Community example, six months and an October 14, 2027 end support two annual-plan tasks. Generation prepares a job record; customer booking and technician availability remain separate.
When does Odoo create the next recurring task? Here, saving Done on the latest recurring task immediately creates the next occurrence. The first October 22, 2026 deadline becomes April 22, 2027 with a six-month interval, and reviewed scope, assignee and sales line are copied. A repeated completion of the older task produces no extra occurrence. Date-only generation and other closure states were not tested.
How do I stop recurring Odoo maintenance tasks at the contract end? Set Until to a specific end date on the recurring task and keep its deadline populated. The end is entered independently of the agreement’s text. In the test, completing the April 22, 2027 occurrence creates no October 22 successor because that next deadline falls after October 14, 2027. This checks the configured end condition; immediate disabling and other stop methods need their own verification.

Continue building the business

Continue with H52: How do I automate recurring invoices in Odoo? to configure and review a separate recurring-invoice workflow. Preserve S00013’s one annual fee and separately review H53 maintenance renewals (guide coming later) before another coverage term.

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.