AutomationFlowsEmail & Gmail › Provision New Hire It Accounts with Google Workspace, Slack, and Gmail

Provision New Hire It Accounts with Google Workspace, Slack, and Gmail

ByAvkash Kakdiya @itechnotion on n8n.io

This workflow receives new-hire records via a webhook, validates and normalizes the data, then provisions a Google Workspace account, creates an onboarding task in Google Tasks, notifies the IT team in Slack, emails the hiring manager via Gmail, and logs the run to Google…

Webhook trigger★★★★☆ complexity14 nodesSlackHTTP RequestGoogle TasksGmailGoogle Sheets
Email & Gmail Trigger: Webhook Nodes: 14 Complexity: ★★★★☆ Added:

This workflow corresponds to n8n.io template #16268 — we link there as the canonical source.

This workflow follows the Gmail → Google Sheets recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "id": "ygTKOIQvOeAZRTy7",
  "name": "New Hire IT Provisioning Automator",
  "tags": [
    {
      "id": "2V3HXFbv2wqNGm6s",
      "name": "Dev",
      "createdAt": "2025-06-17T05:42:41.949Z",
      "updatedAt": "2025-06-17T05:42:41.949Z"
    }
  ],
  "nodes": [
    {
      "id": "d25e7230-3e35-47d3-9dd9-4b075336907e",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -576,
        -144
      ],
      "parameters": {
        "width": 512,
        "height": 688,
        "content": "## New Hire IT Provisioning Automator\nThis workflow automatically provisions IT access the moment a new employee record is created in the HR system. It validates the incoming hire data, creates a Google Workspace account, generates an onboarding ticket, posts the new hire to a Slack channel, emails the manager a day-one checklist, and logs the whole run to a tracking sheet. This removes manual setup delays and makes sure every new hire is ready on day one.\n\n### How it Works\n\t- Receives a new hire record from the HR system via webhook\n\t- Cleans and validates the incoming employee data\n\t- Stops the run if required fields like name or email are missing\n\t- Generates a company email address and starting credentials\n\t- Creates a Google Workspace user account for the new hire\n\t- Creates an IT onboarding ticket with an equipment and access checklist\n\t- Posts a welcome and provisioning summary to the IT Slack channel\n\t- Emails the hiring manager a day-one readiness checklist\n\t- Logs the completed provisioning run to a tracking spreadsheet\n\n### Setup Steps\n\t1. Configure the HR system to send new hire records to the webhook URL\n\t2. Connect a Google Workspace admin credential for account creation\n\t3. Connect a ticketing tool credential for onboarding ticket creation\n\t4. Connect a Slack credential and set the IT notifications channel\n\t5. Connect a Gmail credential for manager checklist emails\n\t6. Connect a Google Sheets credential for run logging\n\t7. Activate the workflow so it runs automatically"
      },
      "typeVersion": 1
    },
    {
      "id": "8647b94b-a4fc-4f3e-9470-6bfecac7f8fb",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -48,
        -144
      ],
      "parameters": {
        "color": 7,
        "width": 656,
        "height": 688,
        "content": "## Step 1: Receive and Validate Hire\n\nThis section receives the new employee record from the HR system, cleans and standardizes the fields, and stops the run if required details such as name or work email are missing. It makes sure only complete and valid records move forward."
      },
      "typeVersion": 1
    },
    {
      "id": "a3b01d8d-effa-4997-ad23-cd37186530cd",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        624,
        -144
      ],
      "parameters": {
        "color": 7,
        "width": 656,
        "height": 688,
        "content": "## Step 2: Provision Accounts and Access\n\nThis section generates the company email and starting credentials, creates the Google Workspace user account, and opens an IT onboarding ticket containing the full equipment and access checklist for the new hire."
      },
      "typeVersion": 1
    },
    {
      "id": "c87b1a92-0b32-4a49-b141-a7b874c9d86b",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1296,
        -144
      ],
      "parameters": {
        "color": 7,
        "width": 704,
        "height": 688,
        "content": "## Step 3: Notify Team and Log Run\n\nThis section posts a provisioning summary to the IT Slack channel, emails the hiring manager a day-one readiness checklist, and records the completed run to a tracking spreadsheet for audit and reporting."
      },
      "typeVersion": 1
    },
    {
      "id": "48bdf21a-c2c2-4c70-9229-cd184a68de1a",
      "name": "New Hire Webhook",
      "type": "n8n-nodes-base.webhook",
      "position": [
        16,
        224
      ],
      "parameters": {
        "path": "hr/new-hire",
        "options": {},
        "httpMethod": "POST"
      },
      "typeVersion": 2
    },
    {
      "id": "11abb695-9edf-41ff-97d2-46e84d8a65f1",
      "name": "Parse Hire Payload",
      "type": "n8n-nodes-base.code",
      "position": [
        240,
        224
      ],
      "parameters": {
        "jsCode": "// ================================================\n// NEW HIRE PAYLOAD PARSER and VALIDATOR\n// ================================================\n\nconst body = $input.first().json;\nconst rawHires = Array.isArray(body) ? body : [body];\n\nconst processedItems = [];\n\nfor (const hire of rawHires) {\n  const props = hire.employee || hire;\n\n  const firstName = (props.first_name || props.firstName || '').trim();\n  const lastName = (props.last_name || props.lastName || '').trim();\n  const personalEmail = (props.personal_email || props.email || '').toLowerCase().trim();\n\n  // Skip records missing required identity fields\n  if (!firstName || !lastName) {\n    console.log('Skipping: missing first or last name');\n    continue;\n  }\n\n  processedItems.push({\n    json: {\n      firstName,\n      lastName,\n      fullName: [firstName, lastName].filter(Boolean).join(' '),\n      personalEmail,\n      department: props.department || props.dept || 'General',\n      jobTitle: props.job_title || props.title || 'New Employee',\n      managerName: props.manager_name || props.manager || 'Unknown',\n      managerEmail: (props.manager_email || '').toLowerCase().trim(),\n      startDate: props.start_date || props.startDate || '',\n      location: props.location || props.office || 'Remote',\n      employeeId: props.employee_id || props.id || '',\n      processedAt: new Date().toISOString(),\n      _parseError: false\n    }\n  });\n}\n\nif (processedItems.length === 0) {\n  return [{\n    json: {\n      fullName: '',\n      firstName: '',\n      lastName: '',\n      _parseError: true\n    }\n  }];\n}\n\nreturn processedItems;"
      },
      "typeVersion": 2
    },
    {
      "id": "950e7083-1486-49ee-bdc2-e668abe7e65d",
      "name": "Is Valid Hire",
      "type": "n8n-nodes-base.if",
      "position": [
        464,
        224
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 1,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "check-no-error",
              "operator": {
                "type": "boolean",
                "operation": "notEquals"
              },
              "leftValue": "={{ $json._parseError }}",
              "rightValue": true
            },
            {
              "id": "check-has-name",
              "operator": {
                "type": "string",
                "operation": "notEquals"
              },
              "leftValue": "={{ $json.fullName }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "f693f868-e87a-45a7-a03d-173a2b7b8b7a",
      "name": "Slack Invalid Record",
      "type": "n8n-nodes-base.slack",
      "position": [
        688,
        320
      ],
      "parameters": {
        "text": "=Incomplete new hire record received and skipped - missing required fields. Manual review needed.",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "YOUR_SLACK_CHANNEL_ID",
          "cachedResultName": "it-onboarding"
        },
        "otherOptions": {
          "includeLinkToWorkflow": false
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "d5c420ec-1486-4e31-9f2e-ea8e6eec4e33",
      "name": "Generate Credentials",
      "type": "n8n-nodes-base.set",
      "position": [
        688,
        128
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "a-email",
              "name": "companyEmail",
              "type": "string",
              "value": "={{ ($json.firstName + '.' + $json.lastName).toLowerCase().replace(/[^a-z.]/g, '') + '@yourcompany.com' }}"
            },
            {
              "id": "a-username",
              "name": "username",
              "type": "string",
              "value": "={{ ($json.firstName.charAt(0) + $json.lastName).toLowerCase().replace(/[^a-z]/g, '') }}"
            },
            {
              "id": "a-temppw",
              "name": "tempPassword",
              "type": "string",
              "value": "={{ 'Welcome' + Math.floor(1000 + Math.random() * 9000) + '!' }}"
            },
            {
              "id": "a-ticket-title",
              "name": "ticketTitle",
              "type": "string",
              "value": "=IT Onboarding: {{ $json.fullName }} ({{ $json.department }}) - {{ $json.jobTitle }}"
            },
            {
              "id": "a-due",
              "name": "readyByISO",
              "type": "string",
              "value": "={{ $now.plus({days: 2}).toISO() }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "84428c32-70cd-4fae-bfae-fca17544fa4d",
      "name": "Create Workspace Account",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        912,
        128
      ],
      "parameters": {
        "url": "https://admin.googleapis.com/admin/directory/v1/users",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"primaryEmail\": \"{{ $json.companyEmail }}\",\n  \"name\": {\n    \"givenName\": \"{{ $('Parse Hire Payload').item.json.firstName }}\",\n    \"familyName\": \"{{ $('Parse Hire Payload').item.json.lastName }}\"\n  },\n  \"password\": \"{{ $json.tempPassword }}\",\n  \"changePasswordAtNextLogin\": true,\n  \"orgUnitPath\": \"/{{ $('Parse Hire Payload').item.json.department }}\"\n}",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "googleApi"
      },
      "typeVersion": 4.3
    },
    {
      "id": "9ccbf3e5-f09a-4bfa-a7c8-19d7b269e6c1",
      "name": "Create Onboarding Ticket",
      "type": "n8n-nodes-base.googleTasks",
      "position": [
        1136,
        128
      ],
      "parameters": {
        "title": "={{ $('Generate Credentials').item.json.ticketTitle }}",
        "additionalFields": {
          "notes": "=New Hire IT Onboarding Checklist\n\nEmployee: {{ $('Parse Hire Payload').item.json.fullName }}\nTitle: {{ $('Parse Hire Payload').item.json.jobTitle }}\nDepartment: {{ $('Parse Hire Payload').item.json.department }}\nManager: {{ $('Parse Hire Payload').item.json.managerName }}\nStart Date: {{ $('Parse Hire Payload').item.json.startDate }}\nLocation: {{ $('Parse Hire Payload').item.json.location }}\nCompany Email: {{ $('Generate Credentials').item.json.companyEmail }}\n\nAccess Checklist\n- Provision laptop and peripherals\n- Add to email distribution lists\n- Create Slack and project tool accounts\n- Grant VPN and SSO access\n- Assign software licenses for role\n- Schedule security and tools onboarding session\n\nReady By: {{ $('Generate Credentials').item.json.readyByISO }}",
          "dueDate": "={{ $('Generate Credentials').item.json.readyByISO }}"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "7cc24995-cca7-4430-8f1b-f2b1e7dfb336",
      "name": "Slack IT Notify",
      "type": "n8n-nodes-base.slack",
      "position": [
        1360,
        128
      ],
      "parameters": {
        "text": "=New Hire Provisioned\n\nWelcome aboard {{ $('Parse Hire Payload').item.json.fullName }}!\n\n-----------------------------------------------------\n\nEmployee Details\n- Name: {{ $('Parse Hire Payload').item.json.fullName }}\n- Title: {{ $('Parse Hire Payload').item.json.jobTitle }}\n- Department: {{ $('Parse Hire Payload').item.json.department }}\n- Manager: {{ $('Parse Hire Payload').item.json.managerName }}\n- Start Date: {{ $('Parse Hire Payload').item.json.startDate }}\n- Location: {{ $('Parse Hire Payload').item.json.location }}\n\nProvisioned Access\n- Company Email: {{ $('Generate Credentials').item.json.companyEmail }}\n- Username: {{ $('Generate Credentials').item.json.username }}\n- Workspace account created\n- IT onboarding ticket opened\n\nTarget Ready Date: {{ $('Generate Credentials').item.json.readyByISO }}\n\n-----------------------------------------------------\nAuto-created by n8n - {{ $('Parse Hire Payload').item.json.processedAt }}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "YOUR_SLACK_CHANNEL_ID",
          "cachedResultName": "it-onboarding"
        },
        "otherOptions": {
          "includeLinkToWorkflow": false
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "d4b16efc-4f99-4295-8224-159e13cd6fb9",
      "name": "Email Manager Checklist",
      "type": "n8n-nodes-base.gmail",
      "position": [
        1584,
        128
      ],
      "parameters": {
        "sendTo": "={{ $('Parse Hire Payload').item.json.managerEmail }}",
        "message": "=Hi {{ $('Parse Hire Payload').item.json.managerName }},\n\nIT provisioning has started for your new team member. Here is the day-one readiness checklist.\n\nNew Hire: {{ $('Parse Hire Payload').item.json.fullName }}\nTitle: {{ $('Parse Hire Payload').item.json.jobTitle }}\nStart Date: {{ $('Parse Hire Payload').item.json.startDate }}\nCompany Email: {{ $('Generate Credentials').item.json.companyEmail }}\n\nManager Day-One Checklist\n- Confirm the workstation and equipment have arrived\n- Verify the new hire can log in to email and SSO\n- Add the new hire to relevant team meetings and channels\n- Schedule a first-day welcome and orientation\n- Assign a buddy or mentor for the first week\n- Share the team goals and current projects\n\nTarget Ready Date: {{ $('Generate Credentials').item.json.readyByISO }}\n\nThanks,\nIT Automation",
        "options": {},
        "subject": "=Day-One Checklist for your new hire: {{ $('Parse Hire Payload').item.json.fullName }}"
      },
      "typeVersion": 2.1
    },
    {
      "id": "c9478dd2-b677-45e5-b818-2cfee6bf5063",
      "name": "Log to Sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1808,
        128
      ],
      "parameters": {
        "columns": {
          "value": {
            "Status": "Provisioned",
            "Manager": "={{ $('Parse Hire Payload').item.json.managerName }}",
            "Ready By": "={{ $('Generate Credentials').item.json.readyByISO }}",
            "Full Name": "={{ $('Parse Hire Payload').item.json.fullName }}",
            "Job Title": "={{ $('Parse Hire Payload').item.json.jobTitle }}",
            "Timestamp": "={{ $('Parse Hire Payload').item.json.processedAt }}",
            "Department": "={{ $('Parse Hire Payload').item.json.department }}",
            "Start Date": "={{ $('Parse Hire Payload').item.json.startDate }}",
            "Company Email": "={{ $('Generate Credentials').item.json.companyEmail }}"
          },
          "mappingMode": "defineBelow",
          "matchingColumns": []
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Provisioning Log"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "YOUR_SHEET_ID"
        }
      },
      "typeVersion": 4.5
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "3dc124aa-30e6-49fa-98e6-8a34914a893b",
  "connections": {
    "Is Valid Hire": {
      "main": [
        [
          {
            "node": "Generate Credentials",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Slack Invalid Record",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Slack IT Notify": {
      "main": [
        [
          {
            "node": "Email Manager Checklist",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "New Hire Webhook": {
      "main": [
        [
          {
            "node": "Parse Hire Payload",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse Hire Payload": {
      "main": [
        [
          {
            "node": "Is Valid Hire",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate Credentials": {
      "main": [
        [
          {
            "node": "Create Workspace Account",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Email Manager Checklist": {
      "main": [
        [
          {
            "node": "Log to Sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create Onboarding Ticket": {
      "main": [
        [
          {
            "node": "Slack IT Notify",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create Workspace Account": {
      "main": [
        [
          {
            "node": "Create Onboarding Ticket",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

This workflow receives new-hire records via a webhook, validates and normalizes the data, then provisions a Google Workspace account, creates an onboarding task in Google Tasks, notifies the IT team in Slack, emails the hiring manager via Gmail, and logs the run to Google…

Source: https://n8n.io/workflows/16268/ — original creator credit. Request a take-down →

More Email & Gmail workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Email & Gmail

Who is this for? This template is ideal for event organizers, conference managers, and community teams who need an automated participant management system. Perfect for workshops, conferences, meetups,

Google Sheets, HTTP Request, Gmail +1
Email & Gmail

Streamline and standardize your entire client onboarding process with a single end-to-end automation. 🚀📋 This workflow captures detailed client intake data via webhook, automatically creates a fully s

Slack, Asana, HTTP Request +4
Email & Gmail

Human Approval AI Response. Uses httpRequest, slack, gmail, googleSheets. Webhook trigger; 20 nodes.

HTTP Request, Slack, Gmail +2
Email & Gmail

Workflow-Testaeg. Uses googleSheets, httpRequest, gmail, slack. Webhook trigger; 14 nodes.

Google Sheets, HTTP Request, Gmail +1
Email & Gmail

Automate WhatsApp communication for recruitment agencies with an interactive, structured customer experience. This workflow handles pricing inquiries, request submissions, tracking, complaints, and hu

HTTP Request, Google Sheets, Gmail +1