INTRODUCTION

Your New Hire's First Day Is a Spreadsheet Nightmare. It Doesn't Have To Be.

Every HR manager knows the drill. A new employee starts on Monday. The IT ticket for their laptop was never filed. The tax form sits unsigned in someone's inbox. The hiring manager "forgot" to schedule the first-week training. By Wednesday the new hire is sitting at a borrowed desk with no access to the systems they need, wondering if they made a mistake accepting the offer.

This isn't a people problem -- it's a process problem. Onboarding involves 15-30 discrete tasks spread across HR, IT, facilities, finance, and the hiring manager. Without a system enforcing the sequence, things fall through the cracks every single time. A 2025 SHRM study found that organizations with structured onboarding see 62% greater new-hire productivity and 50% higher retention.

Odoo 19 ships a fully integrated onboarding engine inside the HR module. Onboarding plans, automated task assignment, document collection with e-signature, equipment requests, and training course enrollment -- all triggered the moment you confirm a new employee record. This guide walks you through every configuration step, with real XML and Python snippets you can drop into your instance today.

01

How to Create and Configure Onboarding Plans in Odoo 19

An onboarding plan is the master blueprint that defines which activities get created, for whom, and when a new employee is confirmed. In Odoo 19, plans live under Configuration → Plans inside the Employees app.

Step 1: Navigate to Plan Configuration

Go to Employees → Configuration → Plans. Click New. You'll see a form with the plan name, company, department filter, and a list of plan activities.

XML — Onboarding plan activity definition
<record id="onboarding_plan_standard" model="mail.activity.plan">
  <field name="name">Standard Employee Onboarding</field>
  <field name="res_model">hr.employee</field>
  <field name="department_id" ref="hr.dep_administration"/>
</record>

<record id="onboarding_activity_welcome" model="mail.activity.plan.template">
  <field name="plan_id" ref="onboarding_plan_standard"/>
  <field name="summary">Send welcome email with first-day instructions</field>
  <field name="responsible_type">coach</field>
  <field name="delay_from">before_plan_date</field>
  <field name="delay_count">3</field>
  <field name="delay_unit">days</field>
  <field name="activity_type_id" ref="mail.mail_activity_data_todo"/>
</record>

<record id="onboarding_activity_it_setup" model="mail.activity.plan.template">
  <field name="plan_id" ref="onboarding_plan_standard"/>
  <field name="summary">Provision laptop, email account, and VPN access</field>
  <field name="responsible_type">other</field>
  <field name="responsible_id" ref="base.user_admin"/>
  <field name="delay_from">before_plan_date</field>
  <field name="delay_count">5</field>
  <field name="delay_unit">days</field>
  <field name="activity_type_id" ref="mail.mail_activity_data_todo"/>
</record>

Step 2: Understanding Responsible Types

The responsible_type field determines who gets assigned each activity. Odoo 19 supports these options:

Responsible TypeResolved ToBest Used For
managerEmployee's direct managerPerformance goal setting, team introductions
coachAssigned onboarding coachWelcome emails, buddy system tasks
employeeThe new hire themselvesForm completion, policy acknowledgment
otherA specific user you chooseIT provisioning, facilities setup

Step 3: Launch the Plan

Once defined, you launch a plan from any employee record. Open the employee form, click the Launch Plan button in the header. Select your onboarding plan, set the plan date (usually the start date), and confirm. Odoo creates all activities with computed deadlines relative to the plan date.

Python — Auto-launch onboarding plan on employee creation
from odoo import models, fields, api

class HrEmployee(models.Model):
    _inherit = 'hr.employee'

    @api.model_create_multi
    def create(self, vals_list):
        employees = super().create(vals_list)
        onboarding_plan = self.env.ref(
            'your_module.onboarding_plan_standard',
            raise_if_not_found=False,
        )
        if onboarding_plan:
            for emp in employees:
                emp._launch_plan(onboarding_plan)
        return employees
Why Auto-Launch Matters

If you rely on HR staff to manually click "Launch Plan," it will be forgotten 30% of the time. Auto-launching on employee creation ensures zero onboarding tasks are missed regardless of who creates the employee record -- whether it's an HR officer, a recruitment flow, or an API integration.

02

Building First-Day Checklists with Activity Plan Templates

A plan with three generic activities isn't an onboarding program -- it's a to-do list. Real onboarding checklists have 20-30 items across multiple departments, with clear deadlines, dependencies, and accountability. Here's how to structure them in Odoo 19.

Recommended Checklist Structure

PhaseTimingExample ActivitiesOwner
Pre-Arrival5 days before startIT provisioning, desk assignment, welcome emailIT / Facilities / Coach
Day 1Start dateOffice tour, team introduction, system loginManager / Coach
Week 1+1 to +5 daysPolicy review, safety training, tool walkthroughsEmployee / HR
Month 1+7 to +30 days30-day check-in, role-specific training completionManager / Employee
Quarter 1+60 to +90 daysProbation review, goal setting, feedback surveyManager / HR
XML — Complete first-week checklist activities
<!-- Day 1: Office tour -->
<record id="act_office_tour" model="mail.activity.plan.template">
  <field name="plan_id" ref="onboarding_plan_standard"/>
  <field name="summary">Conduct office tour and introduce team members</field>
  <field name="responsible_type">coach</field>
  <field name="delay_from">after_plan_date</field>
  <field name="delay_count">0</field>
  <field name="delay_unit">days</field>
  <field name="note">Walk the new hire through all departments.
Introduce them to key contacts in IT, Finance, and their team.</field>
  <field name="activity_type_id" ref="mail.mail_activity_data_todo"/>
</record>

<!-- Day 1: System access verification -->
<record id="act_verify_access" model="mail.activity.plan.template">
  <field name="plan_id" ref="onboarding_plan_standard"/>
  <field name="summary">Verify email, VPN, and ERP access are working</field>
  <field name="responsible_type">employee</field>
  <field name="delay_from">after_plan_date</field>
  <field name="delay_count">0</field>
  <field name="delay_unit">days</field>
  <field name="activity_type_id" ref="mail.mail_activity_data_todo"/>
</record>

<!-- Day 3: Policy acknowledgment -->
<record id="act_policy_ack" model="mail.activity.plan.template">
  <field name="plan_id" ref="onboarding_plan_standard"/>
  <field name="summary">Read and sign company policies (handbook, NDA, IT policy)</field>
  <field name="responsible_type">employee</field>
  <field name="delay_from">after_plan_date</field>
  <field name="delay_count">3</field>
  <field name="delay_unit">days</field>
  <field name="activity_type_id" ref="mail.mail_activity_data_todo"/>
</record>

<!-- Day 30: First month check-in -->
<record id="act_30day_checkin" model="mail.activity.plan.template">
  <field name="plan_id" ref="onboarding_plan_standard"/>
  <field name="summary">30-day check-in: review integration, address concerns</field>
  <field name="responsible_type">manager</field>
  <field name="delay_from">after_plan_date</field>
  <field name="delay_count">30</field>
  <field name="delay_unit">days</field>
  <field name="activity_type_id" ref="mail.mail_activity_data_meeting"/>
</record>
Activity Notes vs. Summary

The summary field is the one-liner that appears in the activity widget and chatter. The note field is where you put detailed instructions, links to resources, or step-by-step guidance. Invest time in writing thorough notes -- they're what the assignee actually reads when completing the task.

03

Automating Document Collection and E-Signature for New Hires

Every new employee needs to submit identification documents, sign contracts, acknowledge policies, and provide bank details. In Odoo 19, the Documents module integrates directly with HR to automate this entire workflow.

Step 1: Configure Document Workspace and Tags

Navigate to Documents → Configuration → Workspaces. Create an "HR Onboarding" workspace with tags for each document type: ID Copy, Tax Form, Employment Contract, Bank Details, Emergency Contact.

Step 2: Request Documents via Onboarding Activity

Odoo 19's hr.employee model has a built-in document request mechanism. When you add a "Request Document" type activity to your onboarding plan, the new hire receives an email with a link to upload the required files directly from their browser -- no Odoo login needed if you enable portal access.

Python — Automated document request on plan launch
from odoo import models, api

class HrEmployee(models.Model):
    _inherit = 'hr.employee'

    def _launch_plan(self, plan):
        """Override to auto-request mandatory documents."""
        res = super()._launch_plan(plan)
        self._request_onboarding_documents()
        return res

    def _request_onboarding_documents(self):
        """Create document requests for mandatory onboarding files."""
        DocRequest = self.env['documents.request_wizard']
        mandatory_tags = [
            ('ID Copy', 'id_copy'),
            ('Tax Declaration', 'tax_form'),
            ('Signed Contract', 'contract'),
        ]
        workspace = self.env.ref(
            'your_module.workspace_hr_onboarding',
            raise_if_not_found=False,
        )
        if not workspace:
            return

        for tag_name, _xml_suffix in mandatory_tags:
            tag = self.env['documents.tag'].search(
                [('name', '=', tag_name)], limit=1
            )
            if tag and self.work_email:
                DocRequest.create({
                    'name': f"{{tag_name}} - {{self.name}}",
                    'requestee_id': self.user_id.partner_id.id,
                    'workspace_id': workspace.id,
                    'tag_ids': [(4, tag.id)],
                    'res_model': 'hr.employee',
                    'res_id': self.id,
                })

Step 3: E-Signature for Contracts and Policies

For documents that require a signature (employment contracts, NDAs, policy acknowledgments), use Odoo's Sign module. Create sign templates with placeholder fields, then trigger signature requests as part of the onboarding flow:

Python — Trigger e-signature request for employment contract
def _send_contract_for_signature(self):
    """Send the employment contract for e-signature."""
    template = self.env.ref('your_module.sign_template_employment_contract')
    sign_request = self.env['sign.request'].create({
        'template_id': template.id,
        'reference': f"Employment Contract - {{self.name}}",
        'request_item_ids': [(0, 0, {
            'partner_id': self.work_contact_id.id,
            'role_id': self.env.ref('sign.sign_item_role_employee').id,
        })],
    })
    sign_request.send_request()
    return sign_request
Portal Access Is Critical

New hires often don't have Odoo internal user accounts on day one. Make sure you grant portal access to their contact record before sending document requests. Otherwise, the upload links will return 403 errors and your new hire's first interaction with the company's systems is a broken page.

04

Automating Equipment Assignment: Laptops, Badges, and Office Keys

Every new hire needs equipment. A laptop. An access badge. Maybe a company phone or parking pass. In most organizations, someone in IT gets an email (or doesn't), creates a ticket (or forgets), and the new hire waits. Odoo 19 lets you automate equipment assignment directly from the onboarding plan.

Step 1: Set Up Equipment Categories

Navigate to Maintenance → Configuration → Equipment Categories. Create categories for each type of equipment you assign to employees: Laptop, Mobile Phone, Access Badge, Office Key.

Step 2: Link Equipment to Employees

Odoo's maintenance module allows assigning equipment to employees via the employee_id field on maintenance.equipment. When an onboarding activity is completed for IT provisioning, the assigned user can create or allocate equipment directly:

Python — Auto-create equipment allocation request
from odoo import models, api

class HrEmployee(models.Model):
    _inherit = 'hr.employee'

    def action_request_equipment(self):
        """Create equipment allocation requests for a new employee."""
        Equipment = self.env['maintenance.equipment']
        categories = self.env['maintenance.equipment.category'].search([
            ('name', 'in', ['Laptop', 'Access Badge', 'Office Key'])
        ])

        created = self.env['maintenance.equipment']
        for cat in categories:
            # Find available (unassigned) equipment first
            available = Equipment.search([
                ('category_id', '=', cat.id),
                ('employee_id', '=', False),
                ('equipment_assign', '=', 'employee'),
            ], limit=1)

            if available:
                available.employee_id = self.id
                created |= available
            else:
                # Create a maintenance request for procurement
                self.env['maintenance.request'].create({
                    'name': f"Provision {{cat.name}} for {{self.name}}",
                    'employee_id': self.id,
                    'category_id': cat.id,
                    'request_date': self.first_contract_date
                        or fields.Date.today(),
                    'description': f"New hire equipment request. "
                        f"Start date: {{self.first_contract_date}}",
                })
        return created
Track Equipment Through the Full Lifecycle

Equipment assignment is only half the story. Configure return activities in your offboarding plan so that when an employee departs, maintenance requests are auto-created to collect all assigned equipment. We'll cover this in the offboarding section below.

05

Integrating Training Courses and eLearning into Onboarding Plans

Odoo 19's eLearning module can be connected to onboarding so that course enrollment happens automatically when a new hire is created. No more emailing training links or hoping the manager remembered to register the new person.

Step 1: Create Onboarding Courses in eLearning

Go to eLearning → Courses. Create courses for your standard onboarding content: Company Overview, Safety Training, IT Security Awareness, Product Knowledge. Mark each course with a tag like onboarding-mandatory so they're easy to query programmatically.

Step 2: Auto-Enroll New Hires

Python — Auto-enroll employees in mandatory eLearning courses
from odoo import models, api

class HrEmployee(models.Model):
    _inherit = 'hr.employee'

    def _enroll_in_onboarding_courses(self):
        """Enroll new hire in all mandatory onboarding courses."""
        if not self.user_id:
            return  # Employee needs a user account first

        SlideChannel = self.env['slide.channel']
        onboarding_tag = self.env['slide.channel.tag'].search(
            [('name', '=', 'onboarding-mandatory')], limit=1
        )
        if not onboarding_tag:
            return

        courses = SlideChannel.search([
            ('tag_ids', 'in', onboarding_tag.ids),
            ('website_published', '=', True),
        ])

        partner = self.user_id.partner_id
        for course in courses:
            # Check if already enrolled
            existing = self.env['slide.channel.partner'].search([
                ('channel_id', '=', course.id),
                ('partner_id', '=', partner.id),
            ], limit=1)
            if not existing:
                self.env['slide.channel.partner'].create({
                    'channel_id': course.id,
                    'partner_id': partner.id,
                })

Step 3: Track Completion in the Onboarding Dashboard

Add a scheduled action that checks training completion status and marks the corresponding onboarding activity as done. This closes the loop: the plan launched the training, the employee completed it at their own pace, and the onboarding checklist updates automatically.

Python — Cron job to sync eLearning completion with onboarding activities
from odoo import models, api

class HrEmployee(models.Model):
    _inherit = 'hr.employee'

    @api.model
    def _cron_sync_training_completion(self):
        """Mark onboarding training activities as done when
        the employee completes all mandatory courses."""
        employees = self.search([
            ('activity_ids.summary', 'ilike', 'Complete mandatory training'),
        ])
        for emp in employees:
            if not emp.user_id:
                continue
            partner = emp.user_id.partner_id
            enrollments = self.env['slide.channel.partner'].search([
                ('partner_id', '=', partner.id),
                ('channel_id.tag_ids.name', '=', 'onboarding-mandatory'),
            ])
            if enrollments and all(e.completed for e in enrollments):
                # Mark the training activity as done
                training_acts = emp.activity_ids.filtered(
                    lambda a: 'mandatory training'
                        in (a.summary or '').lower()
                )
                for act in training_acts:
                    act.action_feedback(
                        feedback='All mandatory courses completed.'
                    )
Department-Specific Courses

Don't enroll sales reps in warehouse safety training, and don't enroll warehouse staff in CRM tutorials. Use the employee's department_id to filter which courses get enrolled. We cover department-specific onboarding flows in the next section.

06

Department-Specific Onboarding Flows: Sales, Engineering, Warehouse, and Finance

A one-size-fits-all onboarding plan works for the first five employees. After that, the sales team needs CRM training while engineering needs Git access, the warehouse needs forklift certification, and finance needs access to the accounting module with specific journal permissions. Odoo 19 handles this with multiple onboarding plans filtered by department.

Architecture: Base Plan + Department Plan

The cleanest approach is a two-layer system: a base plan that applies to everyone (HR paperwork, company policies, IT basics) plus a department-specific plan with role-relevant tasks. Both plans launch simultaneously.

Python — Launch base + department plan automatically
from odoo import models, api

class HrEmployee(models.Model):
    _inherit = 'hr.employee'

    @api.model_create_multi
    def create(self, vals_list):
        employees = super().create(vals_list)
        Plan = self.env['mail.activity.plan']

        # Always launch the base onboarding plan
        base_plan = self.env.ref(
            'your_module.onboarding_plan_base',
            raise_if_not_found=False,
        )

        for emp in employees:
            if base_plan:
                emp._launch_plan(base_plan)

            # Find department-specific plan
            dept_plan = Plan.search([
                ('res_model', '=', 'hr.employee'),
                ('department_id', '=', emp.department_id.id),
            ], limit=1)
            if dept_plan:
                emp._launch_plan(dept_plan)

        return employees

Example Department Plans

DepartmentUnique ActivitiesTools / Access
SalesCRM walkthrough, pipeline training, quota setupCRM, Sales, Email Marketing
EngineeringGit repo access, code review onboarding, dev environment setupGitHub/GitLab, CI/CD, Project
WarehouseSafety certification, barcode scanner training, zone assignmentInventory, Barcode, Quality
FinanceJournal access setup, approval limits, chart of accounts walkthroughAccounting, Expenses, Budget
XML — Sales department onboarding plan
<record id="onboarding_plan_sales" model="mail.activity.plan">
  <field name="name">Sales Team Onboarding</field>
  <field name="res_model">hr.employee</field>
  <field name="department_id" ref="hr.dep_sales"/>
</record>

<record id="act_sales_crm_training" model="mail.activity.plan.template">
  <field name="plan_id" ref="onboarding_plan_sales"/>
  <field name="summary">Complete CRM pipeline training course</field>
  <field name="responsible_type">employee</field>
  <field name="delay_from">after_plan_date</field>
  <field name="delay_count">5</field>
  <field name="delay_unit">days</field>
  <field name="note">Enroll in the CRM Fundamentals course on the eLearning portal.
Complete all modules and pass the final quiz with &gt;= 80%.</field>
  <field name="activity_type_id" ref="mail.mail_activity_data_todo"/>
</record>

<record id="act_sales_quota_setup" model="mail.activity.plan.template">
  <field name="plan_id" ref="onboarding_plan_sales"/>
  <field name="summary">Set initial sales targets and pipeline stages</field>
  <field name="responsible_type">manager</field>
  <field name="delay_from">after_plan_date</field>
  <field name="delay_count">7</field>
  <field name="delay_unit">days</field>
  <field name="activity_type_id" ref="mail.mail_activity_data_meeting"/>
</record>

<record id="act_sales_shadow_calls" model="mail.activity.plan.template">
  <field name="plan_id" ref="onboarding_plan_sales"/>
  <field name="summary">Shadow 5 sales calls with a senior rep</field>
  <field name="responsible_type">coach</field>
  <field name="delay_from">after_plan_date</field>
  <field name="delay_count">14</field>
  <field name="delay_unit">days</field>
  <field name="activity_type_id" ref="mail.mail_activity_data_todo"/>
</record>
07

5 Onboarding Automation Mistakes That Create More Work Than They Save

1

Launching Plans Before the Employee Record Is Complete

If you auto-launch onboarding on create(), the employee record may not yet have a department, manager, coach, or user account. Activities assigned to manager resolve to nothing; document requests fail because there's no email address. The plan creates broken activities that nobody can see or complete.

Our Fix

Use a scheduled action that runs hourly to detect new employees without an active onboarding plan, rather than triggering in create(). This gives HR time to fill in the department, manager, and coach fields before activities are generated. Alternatively, trigger plan launch from a status field transition (e.g., when the employee moves from "draft" to "active").

2

Assigning 30 Activities to the Manager and Zero to Anyone Else

We've audited onboarding plans where every single activity was assigned to the hiring manager. The manager gets 30 activities dumped into their schedule on top of their regular work. They ignore most of them, mark a few as done without actually doing them, and the onboarding "system" becomes a checkbox exercise that nobody trusts.

Our Fix

Distribute activities across roles. IT provisioning goes to the IT user. Document requests go to the employee. Facility setup goes to facilities. The manager should own 3-5 high-value activities: team introduction, goal setting, and check-in meetings. Everything else should be delegated.

3

Forgetting to Handle Contractor and Part-Time Onboarding

Your standard onboarding plan includes "Enroll in health insurance" and "Set up retirement plan contributions." A contractor starts and gets those activities. They can't complete them. Nobody knows whether to mark them done or delete them. The onboarding dashboard shows the contractor at 60% completion forever.

Our Fix

Create separate plans for different employment types: full-time, part-time, contractor, intern. Use the employee_type field on hr.employee to select the right plan. Contractors skip benefits enrollment; interns get a simplified checklist without equipment allocation for personal devices.

4

No Escalation When Activities Are Overdue

IT was supposed to provision the laptop 5 days before the start date. They didn't. Nobody noticed until the new hire showed up empty-handed. Odoo creates the activity with a deadline, but there is no built-in escalation when it goes overdue. The activity just turns red in the assignee's view -- which they may never check.

Our Fix

Create a scheduled action that runs daily and searches for overdue onboarding activities. When found, it sends an email to both the assignee and the HR manager. After 3 days overdue, escalate to the department head. This is 10 lines of Python but saves countless first-day disasters.

5

Not Testing the Full Flow with a Dummy Employee

You configured 25 activities, 8 document requests, and 3 training enrollments. You're confident it works. The first real hire starts, and the welcome email references "Dear [Employee Name]" because the email template placeholder was wrong, the document request goes to the wrong portal user, and two activities have the same deadline creating confusion.

Our Fix

Before going live, create a test employee and run the entire onboarding flow end-to-end. Complete every activity. Upload every document. Sign every contract. Take the training courses. Then delete the test employee. This 2-hour investment reveals every broken link, wrong template, and missing permission before a real human encounters it.

08

Offboarding: The Forgotten Mirror of Onboarding

If onboarding is about giving access, offboarding is about revoking it systematically. A missed offboarding step is a security risk (active VPN access for a departed employee) and a financial risk (company phone plan still billing monthly). Odoo 19 uses the same plan architecture for offboarding.

XML — Offboarding plan definition
<record id="offboarding_plan" model="mail.activity.plan">
  <field name="name">Employee Offboarding</field>
  <field name="res_model">hr.employee</field>
</record>

<!-- Revoke system access immediately -->
<record id="offboard_revoke_access" model="mail.activity.plan.template">
  <field name="plan_id" ref="offboarding_plan"/>
  <field name="summary">Deactivate user account, email, and VPN access</field>
  <field name="responsible_type">other</field>
  <field name="responsible_id" ref="base.user_admin"/>
  <field name="delay_from">after_plan_date</field>
  <field name="delay_count">0</field>
  <field name="delay_unit">days</field>
  <field name="activity_type_id" ref="mail.mail_activity_data_todo"/>
</record>

<!-- Collect equipment -->
<record id="offboard_collect_equipment" model="mail.activity.plan.template">
  <field name="plan_id" ref="offboarding_plan"/>
  <field name="summary">Collect laptop, badge, keys, and company phone</field>
  <field name="responsible_type">other</field>
  <field name="responsible_id" ref="base.user_admin"/>
  <field name="delay_from">after_plan_date</field>
  <field name="delay_count">0</field>
  <field name="delay_unit">days</field>
  <field name="activity_type_id" ref="mail.mail_activity_data_todo"/>
</record>

<!-- Knowledge transfer -->
<record id="offboard_knowledge_transfer" model="mail.activity.plan.template">
  <field name="plan_id" ref="offboarding_plan"/>
  <field name="summary">Complete knowledge transfer document and handover meetings</field>
  <field name="responsible_type">manager</field>
  <field name="delay_from">before_plan_date</field>
  <field name="delay_count">14</field>
  <field name="delay_unit">days</field>
  <field name="activity_type_id" ref="mail.mail_activity_data_todo"/>
</record>

<!-- Final payroll processing -->
<record id="offboard_final_pay" model="mail.activity.plan.template">
  <field name="plan_id" ref="offboarding_plan"/>
  <field name="summary">Process final payslip, unused leave payout, and expense reimbursement</field>
  <field name="responsible_type">other</field>
  <field name="responsible_id" ref="base.user_admin"/>
  <field name="delay_from">after_plan_date</field>
  <field name="delay_count">5</field>
  <field name="delay_unit">days</field>
  <field name="activity_type_id" ref="mail.mail_activity_data_todo"/>
</record>

<!-- Exit interview -->
<record id="offboard_exit_interview" model="mail.activity.plan.template">
  <field name="plan_id" ref="offboarding_plan"/>
  <field name="summary">Schedule and conduct exit interview</field>
  <field name="responsible_type">manager</field>
  <field name="delay_from">before_plan_date</field>
  <field name="delay_count">3</field>
  <field name="delay_unit">days</field>
  <field name="activity_type_id" ref="mail.mail_activity_data_meeting"/>
</record>

Auto-Launch Offboarding on Departure

Python — Trigger offboarding plan when departure date is set
from odoo import models, api

class HrEmployee(models.Model):
    _inherit = 'hr.employee'

    def write(self, vals):
        res = super().write(vals)
        if 'departure_date' in vals and vals['departure_date']:
            offboarding_plan = self.env.ref(
                'your_module.offboarding_plan',
                raise_if_not_found=False,
            )
            if offboarding_plan:
                for emp in self:
                    emp._launch_plan(offboarding_plan)
        return res
Security-Critical: Access Revocation Must Be Day-Zero

The access revocation activity must have a delay_count of 0 from the departure date. We've seen cases where a departing employee still had active Odoo access for two weeks after their last day because the IT task was scheduled with a 7-day buffer. System access revocation is a same-day task, always.

BUSINESS ROI

What Automated Onboarding Saves Your Organization

Structured onboarding isn't about making HR's life easier (though it does). It's about getting new hires to full productivity faster and keeping them long enough to recoup your recruiting investment.

50%Faster Time-to-Productivity

When training, documents, and system access happen in parallel instead of sequentially, new hires reach full contribution in weeks instead of months.

82%Higher Retention (Year 1)

Employees who experience structured onboarding are 82% more likely to stay past their first year. At an average replacement cost of 50-200% of salary, the math is straightforward.

3 hrsHR Admin Time Saved Per Hire

No more manual email chains, spreadsheet tracking, or "did you send the laptop request?" conversations. Activities auto-assign, deadlines auto-enforce, and completion auto-tracks.

The compounding effect is what matters most. If you hire 50 people per year and each onboarding saves 3 hours of HR admin time, that's 150 hours returned to strategic work. If structured onboarding improves first-year retention by even 10%, and each avoided turnover saves $15,000 in recruiting and training costs, that's $75,000 in avoided costs. The Odoo configuration takes two days. The ROI is measured in weeks, not years.

SEO NOTES

Optimization Metadata

Meta Desc

Automate employee onboarding in Odoo 19 with plans, checklists, document collection, equipment assignment, and training integration. Includes offboarding and department-specific flows.

H2 Keywords

1. "How to Create and Configure Onboarding Plans in Odoo 19"
2. "Building First-Day Checklists with Activity Plan Templates"
3. "Automating Document Collection and E-Signature for New Hires"
4. "Department-Specific Onboarding Flows: Sales, Engineering, Warehouse, and Finance"
5. "5 Onboarding Automation Mistakes That Create More Work Than They Save"

Stop Onboarding with Spreadsheets and Email Chains

Every new hire who spends their first week waiting for a laptop, hunting for training links, or asking "who do I send this form to?" is a failure of process, not people. Odoo 19 gives you the infrastructure to make onboarding automatic, trackable, and consistent -- across departments, employment types, and geographies.

If your onboarding process lives in spreadsheets, email threads, or someone's memory, we can help. We configure onboarding and offboarding plans, integrate document collection and e-signature, connect training enrollment, and build the escalation automations that ensure nothing falls through the cracks. Your next hire deserves a first day that makes them glad they joined.

Book a Free HR Automation Assessment