This workflow corresponds to n8n.io template #6360 — we link there as the canonical source.
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 →
{
"id": "q6IkLPK3fhmaaUBg",
"name": "Automated Candidate Status Notifier",
"tags": [],
"nodes": [
{
"id": "ef1fe3c8-04ab-404e-b703-667f21caac0a",
"name": "1. Webhook Trigger (Status Update)",
"type": "n8n-nodes-base.webhook",
"position": [
0,
0
],
"parameters": {
"path": "candidate-status-update",
"options": {},
"httpMethod": "POST"
},
"description": "Receives candidate status updates (e.g., from a form, ATS webhook, or custom script). Copy this Webhook URL into your sending system.",
"typeVersion": 1
},
{
"id": "60448125-d750-46ee-9e42-e92267d0407c",
"name": "2. Extract & Prepare Data",
"type": "n8n-nodes-base.function",
"position": [
260,
0
],
"parameters": {
"functionCode": "const inputData = items[0].json.body;\n\n// --- IMPORTANT: ADJUST THESE FIELD NAMES TO MATCH YOUR INCOMING DATA ---\n// Common assumption: Incoming data contains 'candidateName', 'position', 'newStatus', and optionally 'oldStatus' and 'notes'.\n// Example:\n// If your system sends: { \"applicant_name\": \"John Doe\", \"job_role\": \"Software Engineer\", \"current_stage\": \"Interview Scheduled\" }\n// Adjust the variables below:\n// const candidateName = inputData.applicant_name;\n// const position = inputData.job_role;\n// const newStatus = inputData.current_stage;\n\nconst candidateName = inputData.candidateName || inputData.applicant_name || 'Unknown Candidate';\nconst position = inputData.position || inputData.job_role || 'Unknown Position';\nconst newStatus = inputData.newStatus || inputData.current_status || 'No New Status';\nconst oldStatus = inputData.oldStatus || inputData.previous_status || null;\nconst notes = inputData.notes || inputData.comment || ''; // Optional: for additional notes\n\nif (!candidateName || !newStatus) {\n throw new Error('Candidate data (name or new status) is incomplete. Please check your data sender configuration.');\n}\n\n// Prepare message for Slack/Email\nlet statusMessage;\nif (oldStatus && newStatus !== oldStatus) {\n statusMessage = `Candidate Status Updated: *${candidateName}* for position *${position}* changed from *${oldStatus}* to *${newStatus}*.`;\n} else {\n statusMessage = `New Candidate Status: *${candidateName}* for position *${position}* is now *${newStatus}*.`;\n}\n\nif (notes) {\n statusMessage += `\\nNotes: ${notes}`; // Add notes if available\n}\n\nreturn [{\n json: {\n candidateName: candidateName,\n position: position,\n newStatus: newStatus,\n oldStatus: oldStatus,\n slackMessage: statusMessage, // Message formatted for Slack (supports simple Markdown)\n emailSubject: `Candidate Status Update: ${candidateName} (${position})`,\n emailBody: statusMessage.replace(/\\*/g, '**') // Convert Slack Markdown to bold for email\n }\n}];"
},
"description": "Extracts candidate details and prepares the notification message.",
"typeVersion": 1
},
{
"id": "abe896cc-945f-4d49-be11-a53932b69d3d",
"name": "3. Send Slack Notification",
"type": "n8n-nodes-base.slack",
"position": [
500,
0
],
"parameters": {
"text": "={{ $json.slackMessage }}",
"channel": "YOUR_SLACK_CHANNEL_ID_OR_NAME",
"attachments": [],
"otherOptions": {}
},
"description": "Sends a real-time notification to your Slack channel about the candidate status update.",
"typeVersion": 1
},
{
"id": "63686a52-aec3-4fb2-8bbe-24cdb61e446f",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-80,
-60
],
"parameters": {
"color": 3,
"width": 800,
"height": 240,
"content": "## Flow"
},
"typeVersion": 1
},
{
"id": "51a80419-1aaf-41b8-9d4b-bba9f866d10b",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-80,
220
],
"parameters": {
"color": 4,
"width": 800,
"height": 1820,
"content": "# Workflow Documentation: Automated Candidate Status Notifier\n\n## Problem \ud83d\ude29\nIn busy recruitment processes, keeping the entire hiring team updated on candidate status changes is a constant challenge. Manual communication about status updates (e.g., 'Applied' to 'Interview Scheduled' to 'Offered') is inefficient, leads to communication gaps, and slows down the hiring process.\n\n## Solution \u2728\nThis n8n workflow automates instant notifications about candidate status changes. It ensures that your recruiting team, hiring managers, or other relevant stakeholders are immediately informed about critical updates, improving transparency and collaboration.\n\n## For Who \ud83e\udd1d\nThis workflow is perfect for:\n* **Recruitment Teams:** To streamline internal communication.\n* **Hiring Managers:** To stay informed without constantly checking systems.\n* **HR Departments:** To ensure all stakeholders are aligned on candidate progress.\n* **Agencies & Freelance Recruiters:** To enhance their internal tracking and client communication.\n\n## Scope \ud83c\udfaf\n* **Input Data:** Candidate details and their new/old status (e.g., from a custom form, ATS webhook, or simple spreadsheet integration).\n* **Trigger:** Webhook (ideal for real-time updates from various sources).\n* **Logic:** Extracts candidate name, position, old status, and new status; constructs a concise notification message.\n* **Output:** Real-time notifications sent to a Slack channel (easily adaptable to email or other communication tools).\n* **Customization:** Flexible for different data input formats and notification channels.\n\n## How It Works \u2699\ufe0f\n\nThis workflow acts as a communication bridge for your candidate pipeline:\n\n1. **Webhook Trigger (Status Update):** \ud83d\ude80 The workflow activates when it receives data indicating a candidate's status has changed. This data could come from an internal form, a custom script, or a webhook from a basic Applicant Tracking System (ATS).\n2. **Extract & Prepare Data (Function):** \ud83e\uddf9 This node processes the incoming data. It extracts key information such as the candidate's name, the position they applied for, their previous status (if available), and their new status. It then formats this information into a clear, concise message suitable for a notification.\n3. **Send Slack Notification:** \ud83d\udce2 The prepared message is sent to a designated Slack channel (e.g., `#recruitment-updates`). This provides instant, real-time updates to your team, ensuring everyone is on the same page.\n * **(Alternative: Send Email Notification):** This node can easily be swapped with a Gmail or SendGrid node to send email notifications to a predefined list of recipients instead of Slack.\n\n## How to Set Up \ud83d\udee0\ufe0f\n\nFollow these steps carefully to get your \"Automated Candidate Status Notifier\" workflow up and running:\n\n1. **Import Workflow JSON:**\n * Open your n8n instance.\n * Click on 'Workflows' in the left sidebar.\n * Click the '+' button or 'New' to create a new workflow.\n * Click the '...' (More Options) icon in the top right.\n * Select 'Import from JSON' and paste the entire JSON code for this workflow.\n\n2. **Configure Webhook Trigger (Status Update):**\n * Locate the 'Webhook Trigger (Status Update)' node (1. Webhook Trigger).\n * Activate the workflow. n8n will provide a unique 'Webhook URL'.\n * **Crucial Step:** Configure your data-sending system (e.g., a form submission, an ATS's webhook settings, or your custom script) to send candidate status update data (preferably in JSON format via POST request) to this n8n Webhook URL.\n\n3. **Configure Extract & Prepare Data (Function):**\n * Locate the 'Extract & Prepare Data' node (2. Extract & Prepare Data).\n * **Adjust Field Names:** Review the `functionCode` inside this node. **You MUST adjust the variable assignments (e.g., `inputData.candidateName`, `inputData.position`)** to accurately match the exact field names your sending system uses for candidate name, position, new status, old status, and notes. Use the 'Test Workflow' feature after sending a test webhook to inspect the incoming `items[0].json.body` data structure.\n * The node automatically formats messages for Slack and Email.\n\n4. **Configure Send Slack Notification:**\n * Locate the 'Send Slack Notification' node (3. Send Slack Notification).\n * **Credentials:** Select your existing Slack API credential or click 'Create New' to set one up. Replace `YOUR_SLACK_CREDENTIAL_ID` with the actual ID or name of your credential from your n8n credentials.\n * **Channel:** Replace `YOUR_SLACK_CHANNEL_ID_OR_NAME` with the exact ID or name of the Slack channel where you want to receive notifications (e.g., `#recruitment-updates`).\n\n * **OPTIONAL: Switch to Email Notification"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "1ff87f1e-2e7f-4bbb-a796-135989964d30",
"connections": {
"2. Extract & Prepare Data": {
"main": [
[
{
"node": "3. Send Slack Notification",
"type": "main",
"index": 0
}
]
]
},
"1. Webhook Trigger (Status Update)": {
"main": [
[
{
"node": "2. Extract & Prepare Data",
"type": "main",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow acts as a communication bridge for your candidate pipeline: Webhook Trigger (Status Update): 🚀 The workflow activates when it receives data indicating a candidate's status has changed. This data could come from an internal form, a custom script, or a webhook from a…
Source: https://n8n.io/workflows/6360/ — original creator credit. Request a take-down →
More Slack & Telegram workflows → · Browse all categories →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
HR teams, IT Operations, and System Administrators managing employee onboarding at scale. It’s perfect if you use Odoo 18 to trigger account requests and need Redmine + GitLab accounts created instant
This workflow is a complete, production-ready solution for recovering abandoned carts in Shopify stores using a multi-channel, multi-touch approach. It automates personalized follow-ups via Email, SMS
Slack lacks a native bulk delete feature. Users must delete messages manually, which is time-consuming and inefficient for large volumes.
This workflow automates end-to-end research analysis by coordinating multiple AI models—including NVIDIA NIM (Llama), OpenAI GPT-4, and Claude to analyze uploaded documents, extract insights, and gene
Are you tired of the repetitive dance between git push, creating a pull request in GitHub, updating the corresponding task in JIRA, and then manually notifying your team in Slack, or Notion?