This workflow corresponds to n8n.io template #12545 — we link there as the canonical source.
This workflow follows the Agent → Gmail 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 →
{
"meta": {
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "6e86afb1-7faf-4249-b45a-d4a9c51cc87c",
"name": "Notion: Create Onboarding Tracker",
"type": "n8n-nodes-base.notion",
"position": [
112,
1360
],
"parameters": {
"resource": "database",
"operation": "createPage"
},
"typeVersion": 2
},
{
"id": "75bae1cf-9893-4a00-b3b0-560c464f8739",
"name": "Merge: Combine AI & PDF Data",
"type": "n8n-nodes-base.merge",
"position": [
928,
1712
],
"parameters": {
"mode": "combine",
"options": {},
"combinationMode": "mergeByPosition"
},
"typeVersion": 2.1
},
{
"id": "6eddc75a-bbb0-464b-b38d-4167afa2bdaf",
"name": "Code: Generate IT Provisioning",
"type": "n8n-nodes-base.code",
"position": [
1296,
1648
],
"parameters": {
"jsCode": "// Generate comprehensive IT provisioning checklist\nconst item = $input.first().json;\n\n// Create system access requests\nconst accessRequests = item.requiredSystems.map(system => ({\n system: system,\n employeeName: item.fullName,\n employeeEmail: item.email,\n employeeId: item.employeeId,\n department: item.department,\n priority: item.isTechRole ? 'High' : 'Medium',\n status: 'Pending',\n requestedAt: new Date().toISOString()\n}));\n\n// Create hardware requirements\nconst hardwareNeeds = [];\nif (item.isTechRole) {\n hardwareNeeds.push(\n { item: 'MacBook Pro 16\"', quantity: 1, priority: 'Critical' },\n { item: 'External Monitor', quantity: 2, priority: 'High' },\n { item: 'Mechanical Keyboard', quantity: 1, priority: 'Medium' },\n { item: 'Ergonomic Mouse', quantity: 1, priority: 'Medium' },\n { item: 'Laptop Stand', quantity: 1, priority: 'Medium' },\n { item: 'USB-C Hub', quantity: 1, priority: 'High' }\n );\n} else if (item.isManager) {\n hardwareNeeds.push(\n { item: 'MacBook Air', quantity: 1, priority: 'Critical' },\n { item: 'External Monitor', quantity: 1, priority: 'High' },\n { item: 'Wireless Mouse', quantity: 1, priority: 'Medium' }\n );\n} else {\n hardwareNeeds.push(\n { item: 'Standard Laptop', quantity: 1, priority: 'Critical' },\n { item: 'Wireless Mouse', quantity: 1, priority: 'Low' }\n );\n}\n\n// Add desk setup\nhardwareNeeds.push(\n { item: 'Ergonomic Chair', quantity: 1, priority: 'High' },\n { item: 'Desk', quantity: 1, priority: 'High' },\n { item: 'Welcome Kit', quantity: 1, priority: 'Medium' }\n);\n\nitem.itProvisioningTicket = {\n ticketId: `IT-${Date.now().toString().slice(-8)}`,\n accessRequests: accessRequests,\n hardwareNeeds: hardwareNeeds,\n totalItems: accessRequests.length + hardwareNeeds.length,\n estimatedCompletionDays: item.isTechRole ? 3 : 2,\n assignedTo: 'IT Ops Team',\n createdAt: new Date().toISOString()\n};\n\nreturn { json: item };"
},
"typeVersion": 2
},
{
"id": "2e270d8a-596b-4f36-996a-9b730d4f477b",
"name": "Jira: Create IT Provisioning Ticket",
"type": "n8n-nodes-base.jira",
"position": [
1504,
1648
],
"parameters": {
"project": "IT",
"summary": "=New Hire IT Setup - {{ $json.fullName }}",
"issueType": "Task",
"additionalFields": {
"labels": {
"labels": [
"onboarding",
"new-hire",
"={{ $json.department.toLowerCase() }}"
]
},
"priority": {
"priority": "={{ $json.isTechRole ? 'High' : 'Medium' }}"
}
}
},
"typeVersion": 1
},
{
"id": "4989cf5e-56c7-46ba-ba03-923cc91d4816",
"name": "Slack: Announce New Hire",
"type": "n8n-nodes-base.slack",
"position": [
1504,
1840
],
"parameters": {
"text": "=\ud83c\udf89 *New Team Member Alert!*\n\n*Name:* {{ $json.fullName }}\n*Role:* {{ $json.jobTitle }}\n*Department:* {{ $json.department }}\n*Start Date:* {{ $json.startDate }}\n\n\ud83d\udccb Onboarding tracker created in Notion\n\ud83c\udfab IT provisioning ticket: {{ $json.itProvisioningTicket.ticketId }}\n\ud83d\udce7 Welcome email sent\n\nLet's give them a warm welcome! \ud83d\udc4b",
"otherOptions": {},
"authentication": "oAuth2"
},
"credentials": {
"slackOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "5cbf74f8-5012-4418-9812-67111288d074",
"name": "Sticky Note: Intake",
"type": "n8n-nodes-base.stickyNote",
"position": [
-368,
1504
],
"parameters": {
"color": 7,
"width": 340,
"height": 280,
"content": "### \ud83d\udce5 INTAKE & ENRICHMENT\nWebhook receives data, validates fields, classifies role, determines systems access"
},
"typeVersion": 1
},
{
"id": "33527f66-2eff-4a8d-98a5-b23cabc9a417",
"name": "Sticky Note: Intelligence",
"type": "n8n-nodes-base.stickyNote",
"position": [
80,
1264
],
"parameters": {
"color": 7,
"width": 420,
"height": 280,
"content": "### \ud83e\udd16 AI & TRACKING\nNotion tracker + AI-generated personalized welcome message"
},
"typeVersion": 1
},
{
"id": "302adccb-6fad-47a2-abd2-f6b80b079e4b",
"name": "Sticky Note: Merge",
"type": "n8n-nodes-base.stickyNote",
"position": [
496,
1584
],
"parameters": {
"color": 7,
"width": 340,
"height": 328,
"content": "### \ud83d\udd04 DATA CONSOLIDATION\nMerge AI content with PDF package, archive to Drive"
},
"typeVersion": 1
},
{
"id": "139d6be7-7572-409e-97ca-bdd0d4390c46",
"name": "Sticky Note: Delivery",
"type": "n8n-nodes-base.stickyNote",
"position": [
864,
1552
],
"parameters": {
"color": 7,
"width": 868,
"height": 472,
"content": "### \u2705 DELIVERY & NOTIFICATIONS\nIT provisioning, welcome email, Slack announcement"
},
"typeVersion": 1
},
{
"id": "0b6e2564-136e-457d-a028-ebac727878b8",
"name": "Trigger: New Hire Webhook1",
"type": "n8n-nodes-base.webhook",
"position": [
-320,
1648
],
"parameters": {
"path": "onboard-employee",
"options": {},
"httpMethod": "POST"
},
"typeVersion": 1
},
{
"id": "e6318db4-292f-46f2-92af-ab44325aa4b2",
"name": "Validate & Enrich Employee Data1",
"type": "n8n-nodes-base.code",
"position": [
-112,
1648
],
"parameters": {
"jsCode": "// Enhanced employee data validation and enrichment\nconst item = $input.first().json.body || $input.first().json;\n\n// Basic validation\nif (!item.firstName || !item.lastName || !item.email) {\n throw new Error('Missing required fields: firstName, lastName, or email');\n}\n\n// Generate comprehensive employee profile\nitem.fullName = `${item.firstName} ${item.lastName}`;\nitem.generatedAt = new Date().toISOString();\nitem.startDate = item.startDate || new Date().toISOString().split('T')[0];\n\n// Enhanced role classification\nconst techRoles = ['Engineer', 'Developer', 'IT', 'Data', 'DevOps', 'QA', 'Architect', 'Programmer'];\nconst managerRoles = ['Manager', 'Director', 'VP', 'Lead', 'Head', 'Chief'];\nconst salesRoles = ['Sales', 'Account Executive', 'BDR', 'SDR', 'Account Manager'];\nconst financeRoles = ['Finance', 'Accounting', 'Controller', 'Analyst'];\n\nitem.isTechRole = techRoles.some(role => item.jobTitle?.includes(role));\nitem.isManager = managerRoles.some(role => item.jobTitle?.includes(role));\nitem.isSales = salesRoles.some(role => item.jobTitle?.includes(role));\nitem.isFinance = financeRoles.some(role => item.jobTitle?.includes(role));\n\n// Determine department\nif (item.isTechRole) item.department = 'Engineering';\nelse if (item.isSales) item.department = 'Sales';\nelse if (item.isFinance) item.department = 'Finance';\nelse if (item.isManager) item.department = 'Management';\nelse item.department = item.department || 'General';\n\n// Generate employee ID if not provided\nitem.employeeId = item.employeeId || `EMP-${Date.now().toString().slice(-6)}`;\n\n// Determine required systems access\nitem.requiredSystems = [];\nif (item.isTechRole) {\n item.requiredSystems.push('GitHub', 'AWS', 'Jira', 'Confluence', 'VPN');\n}\nif (item.isSales) {\n item.requiredSystems.push('Salesforce', 'HubSpot', 'LinkedIn Sales Navigator');\n}\nif (item.isFinance) {\n item.requiredSystems.push('QuickBooks', 'Expensify', 'Bill.com');\n}\nif (item.isManager) {\n item.requiredSystems.push('BambooHR', 'Workday', 'Performance Management System');\n}\n// Everyone gets basic systems\nitem.requiredSystems.push('Slack', 'Google Workspace', '1Password');\n\n// Calculate onboarding checklist size\nitem.checklistItems = 5 + (item.isTechRole ? 3 : 0) + (item.isManager ? 2 : 0);\n\n// Set welcome package type\nitem.packageType = item.isManager ? 'Leadership' : (item.isTechRole ? 'Technical' : 'Standard');\n\nreturn { json: item };"
},
"typeVersion": 2
},
{
"id": "00533563-e95d-420b-9934-8b64a247dba4",
"name": "Fetch Role-Based Templates1",
"type": "n8n-nodes-base.googleDrive",
"position": [
112,
1744
],
"parameters": {
"resource": "folder",
"operation": "list"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "8b1a14e0-f8f1-42f0-a8ed-abfe76c36879",
"name": "Download Policy Binaries1",
"type": "n8n-nodes-base.googleDrive",
"position": [
288,
1744
],
"parameters": {
"fileId": "={{ $json.id }}",
"options": {},
"operation": "download"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "34fa1f58-fd7e-4b42-90a1-ea5f744f79c9",
"name": "Merge Multiple PDFs into One1",
"type": "n8n-nodes-htmlcsstopdf.htmlcsstopdf",
"position": [
528,
1728
],
"parameters": {
"resource": "pdfManipulation",
"operation": "mergePdf"
},
"credentials": {
"htmlcsstopdfApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "33f2a03c-f3be-4983-ba8b-a3734080a6d3",
"name": "Archive to Employee Folder1",
"type": "n8n-nodes-base.googleDrive",
"position": [
1120,
1712
],
"parameters": {
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive"
},
"options": {},
"folderId": "={{ $json.employeeId }}"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "68e88e57-09df-48b2-80b2-ab42827730a6",
"name": "Deliver Welcome Email (Gmail)1",
"type": "n8n-nodes-base.gmail",
"position": [
1296,
1840
],
"parameters": {
"sendTo": "={{ $json.email }}",
"message": "=<!DOCTYPE html>\n<html>\n<head>\n <style>\n body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; }\n .header { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 30px; text-align: center; }\n .content { padding: 30px; background: #f9f9f9; }\n .info-box { background: white; padding: 20px; margin: 20px 0; border-left: 4px solid #667eea; }\n .systems-list { background: #e8eaf6; padding: 15px; border-radius: 5px; }\n .footer { text-align: center; padding: 20px; color: #666; font-size: 12px; }\n </style>\n</head>\n<body>\n <div class=\"header\">\n <h1>Welcome to the Team! \ud83c\udf89</h1>\n </div>\n <div class=\"content\">\n <h2>Hi {{ $json.firstName }},</h2>\n \n <div class=\"info-box\">\n <p><strong>{{ $node[\"AI: Generate Personal Welcome\"].json.content[0].text }}</strong></p>\n </div>\n \n <h3>Your Quick Start Guide</h3>\n <div class=\"info-box\">\n <p><strong>\ud83d\udccb Your Details:</strong></p>\n <ul>\n <li><strong>Employee ID:</strong> {{ $json.employeeId }}</li>\n <li><strong>Job Title:</strong> {{ $json.jobTitle }}</li>\n <li><strong>Department:</strong> {{ $json.department }}</li>\n <li><strong>Start Date:</strong> {{ $json.startDate }}</li>\n </ul>\n </div>\n \n <div class=\"info-box\">\n <p><strong>\ud83d\udda5\ufe0f IT Setup in Progress:</strong></p>\n <p>Our IT team has been notified and is preparing your workspace. You'll have access to:</p>\n <div class=\"systems-list\">\n {{ $json.requiredSystems.map(s => `<span style=\"display: inline-block; background: white; padding: 5px 10px; margin: 5px; border-radius: 3px;\">\u2713 ${s}</span>`).join('') }}\n </div>\n <p><em>Expected completion: {{ $json.itProvisioningTicket.estimatedCompletionDays }} business days</em></p>\n </div>\n \n <div class=\"info-box\">\n <p><strong>\ud83d\udce6 Attached Documents:</strong></p>\n <p>Please review the attached onboarding package which includes:</p>\n <ul>\n <li>Company policies and procedures</li>\n <li>Benefits information</li>\n <li>Department-specific guidelines</li>\n <li>Code of conduct</li>\n </ul>\n </div>\n \n <div class=\"info-box\">\n <p><strong>\ud83d\udcc5 First Day Checklist:</strong></p>\n <ol>\n <li>Arrive at 9:00 AM (or join the virtual onboarding session)</li>\n <li>Check in at reception (they're expecting you!)</li>\n <li>Meet your manager and team</li>\n <li>Complete HR paperwork</li>\n <li>Set up your workspace</li>\n <li>Attend new hire orientation at 2:00 PM</li>\n </ol>\n </div>\n \n <p>If you have any questions before your start date, don't hesitate to reach out to hr@company.com</p>\n \n <p><strong>We're excited to have you on board!</strong></p>\n \n <p>Best regards,<br>\n The HR Team</p>\n </div>\n <div class=\"footer\">\n <p>This is an automated message from the HR Onboarding System</p>\n </div>\n</body>\n</html>",
"options": {},
"subject": "=\ud83c\udf89 Welcome to the team, {{ $json.firstName }}!"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "ad5990ea-16d0-45bd-a474-20022483d113",
"name": "Main Documentation1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-944,
832
],
"parameters": {
"color": 2,
"width": 540,
"height": 724,
"content": "## \ud83d\ude80 How it works\nThis intelligent onboarding workflow automates the entire new hire process from webhook trigger to day-one readiness. It enriches employee data with role-based classifications, creates a **Notion tracking dashboard**, generates **AI-personalized welcome messages**, fetches and merges role-specific policy documents, provisions IT systems via **Jira tickets**, archives everything to Google Drive, sends beautiful HTML welcome emails with all documents attached, and announces the new hire on Slack.\n\n**Key Intelligence:**\n- Auto-detects tech, sales, finance, or management roles\n- Generates custom system access requirements\n- Creates detailed hardware provisioning lists\n- Calculates onboarding completion timelines\n- AI writes personalized welcome messages\n\n## \u2699\ufe0f Setup steps\n1. **Webhook**: Point your HRIS (BambooHR, Workday, etc.) to the webhook URL\n2. **Notion**: Create an onboarding database with fields: Employee Name, Email, Job Title, Department, Start Date, Employee ID, Onboarding Status\n3. **Google Drive**: \n - Set up template folders with \"Technical\", \"Leadership\", \"Standard\" subfolders\n - Configure employee folder structure\n4. **Anthropic AI**: Add your API key for personalized message generation\n5. **HTML to PDF**: Add API credentials for document merging\n6. **Jira**: Connect to your IT project and configure issue types\n7. **Gmail**: Authenticate to send HTML emails with attachments\n8. **Slack**: Set the #new-hires channel for announcements\n9. **Code Logic**: Customize role keywords and system access requirements"
},
"typeVersion": 1
},
{
"id": "3620f8f9-f67e-4091-9ca5-9b9e1809984b",
"name": "Processing Sticky1",
"type": "n8n-nodes-base.stickyNote",
"position": [
96,
1632
],
"parameters": {
"color": 7,
"width": 340,
"height": 280,
"content": "### \ud83d\udcc4 DOCUMENT PROCESSING\nFetch role-based templates, download policies, merge into single PDF package"
},
"typeVersion": 1
},
{
"id": "098b1915-2f88-4740-b3e9-f425400f7873",
"name": "AI Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
256,
1360
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "e1d150aa-f549-4f2d-96e7-d67e28dcd266",
"name": "OpenAI Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
256,
1504
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini"
},
"options": {},
"builtInTools": {}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.3
}
],
"connections": {
"AI Agent": {
"main": [
[
{
"node": "Merge: Combine AI & PDF Data",
"type": "main",
"index": 0
}
]
]
},
"OpenAI Chat Model": {
"ai_languageModel": [
[
{
"node": "AI Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Download Policy Binaries1": {
"main": [
[
{
"node": "Merge Multiple PDFs into One1",
"type": "main",
"index": 0
}
]
]
},
"Trigger: New Hire Webhook1": {
"main": [
[
{
"node": "Validate & Enrich Employee Data1",
"type": "main",
"index": 0
}
]
]
},
"Archive to Employee Folder1": {
"main": [
[
{
"node": "Code: Generate IT Provisioning",
"type": "main",
"index": 0
},
{
"node": "Deliver Welcome Email (Gmail)1",
"type": "main",
"index": 0
}
]
]
},
"Fetch Role-Based Templates1": {
"main": [
[
{
"node": "Download Policy Binaries1",
"type": "main",
"index": 0
}
]
]
},
"Merge: Combine AI & PDF Data": {
"main": [
[
{
"node": "Archive to Employee Folder1",
"type": "main",
"index": 0
}
]
]
},
"Merge Multiple PDFs into One1": {
"main": [
[
{
"node": "Merge: Combine AI & PDF Data",
"type": "main",
"index": 1
}
]
]
},
"Code: Generate IT Provisioning": {
"main": [
[
{
"node": "Jira: Create IT Provisioning Ticket",
"type": "main",
"index": 0
}
]
]
},
"Deliver Welcome Email (Gmail)1": {
"main": [
[
{
"node": "Slack: Announce New Hire",
"type": "main",
"index": 0
}
]
]
},
"Validate & Enrich Employee Data1": {
"main": [
[
{
"node": "Notion: Create Onboarding Tracker",
"type": "main",
"index": 0
},
{
"node": "Fetch Role-Based Templates1",
"type": "main",
"index": 0
}
]
]
},
"Notion: Create Onboarding Tracker": {
"main": [
[]
]
},
"Jira: Create IT Provisioning Ticket": {
"main": [
[
{
"node": "Slack: Announce New Hire",
"type": "main",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
gmailOAuth2googleDriveOAuth2ApihtmlcsstopdfApiopenAiApislackOAuth2Api
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
A high-fidelity employee onboarding engine: Intake → Role-Based Enrichment → AI Personalization → IT Provisioning.
Source: https://n8n.io/workflows/12545/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
🧾 An intelligent automation system that turns Google Meet recordings into structured meeting notes — integrating Fireflies.ai, OpenAI GPT-4.1-mini, Notion, Slack, Google Drive, and Gmail via n8n.
This workflow automates the entire process of taking a raw user-submitted script, rewriting it into a polished HeyGen-ready narration, generating a full avatar video, handling all processing checks, r
This workflow automates the end-to-end employee onboarding process by provisioning new hires across multiple internal systems and delivering a personalized welcome experience.
Transform procurement from manual chaos to intelligent automation - AI-powered supplier selection analyzes urgency, cost, and delivery requirements to recommend optimal vendors, then automatically gen
Who is this for? This template is perfect for agencies, consultancies, freelancers, and project-based teams who want to eliminate repetitive onboarding tasks. If you're tired of manually creating fold