Home/ Workflows/ HR Managers/ Human Resources
Workflow · HR Managers

Complete New Hire Onboarding Checklist Automation with n8n

Streamline your HR onboarding process with automated checklist creation, task assignments, and progress tracking using n8n workflows

Complete New Hire Onboarding Checklist Automation with n8n

Why This Automation Matters

Manual onboarding processes are time-consuming, error-prone, and often result in inconsistent experiences for new hires. This n8n automation eliminates these pain points by:

Studies show that effective onboarding improves new hire retention by 82% and productivity by over 70%. This automation ensures no critical steps are missed while freeing up HR teams to focus on relationship building and strategic initiatives.

What You Need Before Starting

Required Tools and Accounts

Permissions and Setup

Data Requirements

Complete Node-by-Node Build Instructions

Step 1: Set Up the Trigger Node

  1. Add a Webhook node as your starting trigger
  2. Set HTTP Method to POST
  3. Configure the webhook URL path as /new-hire-onboarding
  4. Set Response Mode to “Respond to Webhook”
  5. Test the webhook to ensure it’s receiving data properly

Step 2: Process New Hire Data

  1. Add a Set node after the webhook
  2. Configure the following data mappings:
    • employeeName: {{ $json.body.name }}
    • employeeEmail: {{ $json.body.email }}
    • department: {{ $json.body.department }}
    • startDate: {{ $json.body.startDate }}
    • role: {{ $json.body.role }}
    • managerId: {{ $json.body.managerId }}
  3. Add validation for required fields

Step 3: Create Master Tracking Sheet

  1. Add Google Sheets node
  2. Select Operation: “Append”
  3. Configure spreadsheet details:
    • Spreadsheet ID: Your master onboarding tracker
    • Sheet name: “Active Onboardings”
  4. Map data columns:
    • Column A: Employee Name
    • Column B: Email
    • Column C: Department
    • Column D: Start Date
    • Column E: Role
    • Column F: Status (set to “In Progress”)
    • Column G: Created Date

Step 4: Generate Department-Specific Checklist

  1. Add IF node to branch based on department
  2. Configure conditions for each department:
    • {{ $json.department }} === "Engineering"
    • {{ $json.department }} === "Sales"
    • {{ $json.department }} === "Marketing"
  3. For each department branch, add a Set node with specific tasks:
// Engineering tasks example
[
  {
    "task": "Setup development environment",
    "owner": "IT Team",
    "dueDate": "{{ DateTime.fromISO($json.startDate).plus({days: 1}).toISO() }}",
    "priority": "High"
  },
  {
    "task": "Code repository access",
    "owner": "DevOps",
    "dueDate": "{{ DateTime.fromISO($json.startDate).plus({days: 1}).toISO() }}",
    "priority": "High"
  },
  {
    "task": "Architecture overview session",
    "owner": "Tech Lead",
    "dueDate": "{{ DateTime.fromISO($json.startDate).plus({days: 3}).toISO() }}",
    "priority": "Medium"
  }
]

Step 5: Create Project Management Tasks

  1. Add Trello node (or your preferred PM tool)
  2. Configure operation: “Create Card”
  3. Set up dynamic card creation:
    • Board ID: Your onboarding board
    • List ID: Department-specific list
    • Card Name: {{ $json.employeeName }} - {{ $json.task }}
    • Description: Include due date and owner information
    • Due Date: {{ $json.dueDate }}
  4. Add a Split In Batches node before Trello to create individual cards

Step 6: Schedule Calendar Events

  1. Add Google Calendar node
  2. Configure operation: “Create Event”
  3. Set up key events:
    • First day welcome meeting
    • HR orientation session
    • Department introduction
    • Equipment handover appointment
  4. Use Merge node to combine multiple calendar events

Step 7: Send Welcome Email Sequence

  1. Add Gmail node
  2. Configure operation: “Send Email”
  3. Set email parameters:
    • To: {{ $json.employeeEmail }}
    • Subject: “Welcome to [Company Name] - Your First Week Guide”
    • HTML Body: Use template with personalized content
  4. Add Wait node (24 hours) followed by follow-up emails

Step 8: Create Slack Channel and Notifications

  1. Add Slack node for channel creation
  2. Configure operation: “Create Channel”
  3. Set channel name: onboarding-{{ $json.employeeName.toLowerCase().replace(' ', '-') }}
  4. Add another Slack node to invite stakeholders
  5. Send welcome message with onboarding timeline

Step 9: Set Up Equipment Request

  1. Add HTTP Request node for equipment system API
  2. Configure equipment requests based on role:
    • Laptop specifications
    • Software licenses
    • Office supplies
    • Security badges
  3. Include delivery timeline and tracking information

Step 10: Create Automated Follow-ups

  1. Add Cron node for daily check-ins
  2. Configure to run at 9 AM daily
  3. Connect to Google Sheets to check task completion
  4. Add IF node to identify overdue tasks
  5. Send reminder notifications via Slack and email

Step 11: Generate Reports and Analytics

  1. Add Google Sheets node to update completion metrics
  2. Calculate onboarding progress percentage
  3. Track average completion times by department
  4. Identify bottlenecks and common delays

Step 12: Error Handling and Notifications

  1. Add error handling to each critical node
  2. Configure fallback notifications for failed processes
  3. Set up admin alerts for system issues
  4. Include retry logic for API timeouts

Complete Workflow JSON

{
  "name": "New Hire Onboarding Automation",
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "/new-hire-onboarding",
        "responseMode": "responseNode",
        "options": {}
      },
      "id": "webhook-trigger",
      "name": "New Hire Webhook",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 1,
      "position": [
        240,
        300
      ]
    },
    {
      "parameters": {
        "values": {
          "string": [
            {
              "name": "employeeName",
              "value": "={{ $json.body.name }}"
            },
            {
              "name": "employeeEmail",
              "value": "={{ $json.body.email }}"
            },
            {
              "name": "department",
              "value": "={{ $json.body.department }}"
            },
            {
              "name": "startDate",
              "value": "={{ $json.body.startDate }}"
            },
            {
              "name": "role",
              "value": "={{ $json.body.role }}"
            },
            {
              "name": "managerId",
              "value": "={{ $json.body.managerId }}"
            }
          ]
        },
        "options": {}
      },
      "id": "process-data",
      "name": "Process Employee Data",
      "type": "n8n-nodes-base.set",
      "typeVersion": 1,
      "position": [
        460,
        300
      ]
    },
    {
      "parameters": {
        "operation": "append",
        "documentId": "your-spreadsheet-id",
        "sheetName": "Active Onboardings",
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "Employee Name": "={{ $json.employeeName }}",
            "Email": "={{ $json.employeeEmail }}",
            "Department": "={{ $json.department }}",
            "Start Date": "={{ $json.startDate }}",
            "Role": "={{ $json.role }}",
            "Status": "In Progress",
            "Created": "={{ new Date().toISOString() }}"
          }
        },
        "options": {}
      },
      "id": "create-tracking",
      "name": "Create Tracking Record",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 2,
      "position": [
        680,
        300
      ]
    },
    {
      "parameters": {
        "conditions": {
          "string": [
            {
              "value1": "={{ $json.department }}",
              "operation": "equal",
              "value2": "Engineering"
            }
          ]
        }
      },
      "id": "department-check",
      "name": "Check Department",
      "type": "n8n-nodes-base.if",
      "typeVersion": 1,
      "position": [
        900,
        300
      ]
    },
    {
      "parameters": {
        "values": {
          "string": [
            {
              "name": "tasks",
              "value": "={{ JSON.stringify([\n  {\n    \"task\": \"Setup development environment\",\n    \"owner\": \"IT Team\",\n    \"dueDate\": DateTime.fromISO($json.startDate).plus({days: 1}).toISO(),\n    \"priority\": \"High\"\n  },\n  {\n    \"task\": \"Code repository access\",\n    \"owner\": \"DevOps\",\n    \"dueDate\": DateTime.fromISO($json.startDate).plus({days: 1}).toISO(),\n    \"priority\": \"High\"\n  },\n  {\n    \"task\": \"Architecture overview session\",\n    \"owner\": \"Tech Lead\",\n    \"dueDate\": DateTime.fromISO($json.startDate).plus({days: 3}).toISO(),\n    \"priority\": \"Medium\"\n  },\n  {\n    \"task\": \"Security training completion\",\n    \"owner\": \"Security Team\",\n    \"dueDate\": DateTime.fromISO($json.startDate).plus({days: 5}).toISO(),\n    \"priority\": \"High\"\n  }\n]) }}"
            }
          ]
        }
      },
      "id": "engineering-tasks",
      "name": "Engineering Checklist",
      "type": "n8n-nodes-base.set",
      "typeVersion": 1,
      "position": [
        1120,
        200
      ]
    },
    {
      "parameters": {
        "batchSize": 1,
        "options": {}
      },
      "id": "split-tasks",
      "name": "Split Tasks",
      "type": "n8n-nodes-base.splitInBatches",
      "typeVersion": 1,
      "position": [
        1340,
        300
      ]
    },
    {
      "parameters": {
        "operation": "create",
        "boardId": "your-trello-board-id",
        "listId": "your-list-id",
        "name": "={{ $json.employeeName }} - {{ JSON.parse($json.tasks)[0].task }}",
        "description": "Owner: {{ JSON.parse($json.tasks)[0].owner }}\\nDue: {{ JSON.parse($json.tasks)[0].dueDate }}\\nPriority: {{ JSON.parse($json.tasks)[0].priority }}",
        "additionalFields": {
          "dueDate": "={{ JSON.parse($json.tasks)[0].dueDate }}"
        }
      },
      "id": "create-trello-card",
      "name": "Create Trello Task",
      "type": "n8n-nodes-base.trello",
      "typeVersion": 1,
      "position": [
        1560,
        300
      ]
    },
    {
      "parameters": {
        "operation": "create",
        "calendarId": "primary",
        "start": "={{ DateTime.fromISO($json.startDate).set({hour: 9}).toISO() }}",
        "end": "={{ DateTime.fromISO($json.startDate).set({hour: 10}).toISO() }}",
        "summary": "Welcome Meeting - {{ $json.employeeName }}",
        "description": "First day welcome and orientation session",
        "attendees": "={{ $json.employeeEmail }},{{ $json.managerEmail }}",
        "additionalFields": {
          "sendNotifications": true
        }
      },
      "id": "schedule-welcome",
      "name": "Schedule Welcome Meeting",
      "type": "n8n-nodes-base.googleCalendar",
      "typeVersion": 1,
      "position": [
        1120,
        400
      ]
    },
    {
      "parameters": {
        "operation": "send",
        "to": "={{ $json.employeeEmail }}",
        "subject": "Welcome to [Company Name] - Your First Week Guide",
        "htmlBody": "<h2>Welcome {{ $json.employeeName }}!</h2>\\n<p>We're excited to have you join our {{ $json.department }} team as a {{ $json.role }}.</p>\\n<h3>Your First Week Schedule:</h3>\\n<ul>\\n<li><strong>Day 1:</strong> Welcome meeting and office tour</li>\\n<li><strong>Day 2:</strong> Equipment setup and system access</li>\\n<li><strong>Day 3:</strong> Department introductions</li>\\n<li><strong>Day 4:</strong> Training modules</li>\\n<li><strong>Day 5:</strong> First week check-in</li>\\n</ul>\\n<p>Your dedicated Slack channel #onboarding-{{ $json.employeeName.toLowerCase().replace(' ', '-') }} has been created for any questions.</p>\\n<p>Looking forward to working with you!</p>",
        "options": {}
      },
      "id": "send-welcome-email",
      "name": "Send Welcome Email",
      "type": "n8n-nodes-base.gmail",
      "typeVersion":