AutomationFlowsSlack & Telegram › Form Submission to Slack Alerts

Form Submission to Slack Alerts

Original n8n title: AI Recruitment Automation System

Ai Recruitment Automation System. Uses formTrigger, slack. Event-driven trigger; 4 nodes.

Event trigger★★☆☆☆ complexity4 nodesForm TriggerSlack
Slack & Telegram Trigger: Event Nodes: 4 Complexity: ★★☆☆☆ Added:

This workflow follows the Form Trigger → Slack 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
{
  "name": "AI Recruitment Automation System",
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "job-application",
        "responseMode": "responseNode",
        "options": {}
      },
      "id": "rec1a2b3-1111-2222-3333-444455556666",
      "name": "Application Webhook",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 1,
      "position": [
        250,
        300
      ]
    },
    {
      "parameters": {
        "modelId": {
          "__rl": true,
          "value": "gpt-4",
          "mode": "id"
        },
        "messages": {
          "values": [
            {
              "content": "=Analyze this job application and return JSON:\n\nPosition Applied: {{ $json.position }}\nResume Text: {{ $json.resume_text }}\n\nReturn JSON with:\n- extracted_skills (array)\n- years_of_experience (number)\n- education_level (string)\n- technical_score (0-100)\n- experience_score (0-100)\n- culture_fit_score (0-100)\n- overall_score (0-100)\n- recommendation (top_candidate, good_candidate, not_suitable)\n- interview_notes (string)\n\nReturn only JSON."
            }
          ]
        },
        "options": {
          "temperature": 0.3
        }
      },
      "id": "rec2b3c4-2222-3333-4444-555566667777",
      "name": "AI Resume Analyzer",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "typeVersion": 1.3,
      "position": [
        480,
        300
      ]
    },
    {
      "parameters": {
        "conditions": {
          "number": [
            {
              "value1": "={{ JSON.parse($json.message.content).overall_score }}",
              "value2": 85,
              "operation": "largerEqual"
            }
          ]
        }
      },
      "id": "rec3c4d5-3333-4444-5555-666677778888",
      "name": "Is Top Candidate?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 1,
      "position": [
        710,
        300
      ]
    },
    {
      "parameters": {
        "calendarId": {
          "__rl": true,
          "value": "primary",
          "mode": "list"
        },
        "start": "={{ $now.plus({days: 2}).toISO() }}",
        "end": "={{ $now.plus({days: 2, hours: 1}).toISO() }}",
        "additionalFields": {
          "summary": "=Interview: {{ $('Application Webhook').item.json.name }} - {{ $('Application Webhook').item.json.position }}",
          "description": "=AI Notes: {{ JSON.parse($('AI Resume Analyzer').item.json.message.content).interview_notes }}",
          "attendees": [
            {
              "email": "{{ $('Application Webhook').item.json.email }}"
            }
          ]
        }
      },
      "id": "rec4d5e6-4444-5555-6666-777788889999",
      "name": "Schedule Interview",
      "type": "n8n-nodes-base.googleCalendar",
      "typeVersion": 1.1,
      "position": [
        940,
        200
      ]
    },
    {
      "parameters": {
        "channel": "#hiring-team",
        "text": "=\u2b50 TOP CANDIDATE ALERT!\n\nName: {{ $('Application Webhook').item.json.name }}\nPosition: {{ $('Application Webhook').item.json.position }}\nOverall Score: {{ JSON.parse($('AI Resume Analyzer').item.json.message.content).overall_score }}\n\nSkills: {{ JSON.parse($('AI Resume Analyzer').item.json.message.content).extracted_skills.join(', ') }}\n\nInterview scheduled for 2 days from now. Please review the resume!",
        "additionalFields": {
          "parse_mode": "Markdown"
        }
      },
      "id": "rec5e6f7-5555-6666-7777-888899990000",
      "name": "Notify Hiring Team",
      "type": "n8n-nodes-base.slack",
      "typeVersion": 2.1,
      "position": [
        1170,
        200
      ]
    },
    {
      "parameters": {
        "fromEmail": "hr@yourcompany.com",
        "toEmail": "={{ $('Application Webhook').item.json.email }}",
        "subject": "=Interview Invitation - {{ $('Application Webhook').item.json.position }}",
        "emailType": "text",
        "message": "=Dear {{ $('Application Webhook').item.json.name }},\n\nWe were very impressed with your application for the {{ $('Application Webhook').item.json.position }} role!\n\nWe have scheduled an interview for you. Please check your calendar for the exact time.\n\nLooking forward to speaking with you.\n\nBest regards,\nHR Team",
        "options": {}
      },
      "id": "rec6f7a8-6666-7777-8888-999900001111",
      "name": "Send Interview Invite",
      "type": "n8n-nodes-base.emailSend",
      "typeVersion": 2,
      "position": [
        1400,
        200
      ]
    },
    {
      "parameters": {
        "conditions": {
          "number": [
            {
              "value1": "={{ JSON.parse($json.message.content).overall_score }}",
              "value2": 60,
              "operation": "largerEqual"
            }
          ]
        }
      },
      "id": "rec7a8b9-7777-8888-9999-000011112222",
      "name": "Is Good Candidate?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 1,
      "position": [
        940,
        400
      ]
    },
    {
      "parameters": {
        "fromEmail": "hr@yourcompany.com",
        "toEmail": "={{ $('Application Webhook').item.json.email }}",
        "subject": "=Update on your application - {{ $('Application Webhook').item.json.position }}",
        "emailType": "text",
        "message": "=Dear {{ $('Application Webhook').item.json.name }},\n\nThank you for applying for the {{ $('Application Webhook').item.json.position }} role.\n\nYour application is currently under review by our team. We will get back to you with the next steps within 5 business days.\n\nBest regards,\nHR Team",
        "options": {}
      },
      "id": "rec8b9c0-8888-9999-0000-111122223333",
      "name": "Send Next Steps Email",
      "type": "n8n-nodes-base.emailSend",
      "typeVersion": 2,
      "position": [
        1170,
        400
      ]
    },
    {
      "parameters": {
        "fromEmail": "noreply@yourcompany.com",
        "toEmail": "={{ $('Application Webhook').item.json.email }}",
        "subject": "=Application Status - {{ $('Application Webhook').item.json.position }}",
        "emailType": "text",
        "message": "=Dear {{ $('Application Webhook').item.json.name }},\n\nThank you for your interest in the {{ $('Application Webhook').item.json.position }} role.\n\nAfter careful review, we have decided to move forward with other candidates whose qualifications more closely match our current needs.\n\nWe wish you the best in your job search.\n\nBest regards,\nHR Team",
        "options": {}
      },
      "id": "rec9c0d1-9999-0000-1111-222233334444",
      "name": "Send Rejection Email",
      "type": "n8n-nodes-base.emailSend",
      "typeVersion": 2,
      "position": [
        1170,
        600
      ]
    },
    {
      "parameters": {
        "operation": "append",
        "documentId": {
          "__rl": true,
          "value": "YOUR_GOOGLE_SHEET_ID",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "Applicants",
          "mode": "name"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "date": "={{ $now.toISO() }}",
            "name": "={{ $('Application Webhook').item.json.name }}",
            "email": "={{ $('Application Webhook').item.json.email }}",
            "position": "={{ $('Application Webhook').item.json.position }}",
            "skills": "={{ JSON.stringify(JSON.parse($('AI Resume Analyzer').item.json.message.content).extracted_skills) }}",
            "experience_years": "={{ JSON.parse($('AI Resume Analyzer').item.json.message.content).years_of_experience }}",
            "overall_score": "={{ JSON.parse($('AI Resume Analyzer').item.json.message.content).overall_score }}",
            "recommendation": "={{ JSON.parse($('AI Resume Analyzer').item.json.message.content).recommendation }}",
            "status": "={{ $('Is Top Candidate?').item.json ? 'Interview Scheduled' : $('Is Good Candidate?').item.json ? 'Under Review' : 'Rejected' }}"
          },
          "schema": []
        },
        "options": {}
      },
      "id": "rec0d1e2-0000-1111-2222-333344445555",
      "name": "Save to HR Database",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4,
      "position": [
        1630,
        400
      ]
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={\"status\": \"success\", \"message\": \"Application received and processed\", \"score\": \"{{ JSON.parse($('AI Resume Analyzer').item.json.message.content).overall_score }}\", \"recommendation\": \"{{ JSON.parse($('AI Resume Analyzer').item.json.message.content).recommendation }}\"}",
        "options": {}
      },
      "id": "rec1e2f3-1111-2222-3333-444455556666",
      "name": "Respond to Webhook",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1,
      "position": [
        1860,
        400
      ]
    }
  ],
  "connections": {
    "Application Webhook": {
      "main": [
        [
          {
            "node": "AI Resume Analyzer",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Resume Analyzer": {
      "main": [
        [
          {
            "node": "Is Top Candidate?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Is Top Candidate?": {
      "main": [
        [
          {
            "node": "Schedule Interview",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Is Good Candidate?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Interview": {
      "main": [
        [
          {
            "node": "Notify Hiring Team",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Notify Hiring Team": {
      "main": [
        [
          {
            "node": "Send Interview Invite",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Interview Invite": {
      "main": [
        [
          {
            "node": "Save to HR Database",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Is Good Candidate?": {
      "main": [
        [
          {
            "node": "Send Next Steps Email",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Send Rejection Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Next Steps Email": {
      "main": [
        [
          {
            "node": "Save to HR Database",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Rejection Email": {
      "main": [
        [
          {
            "node": "Save to HR Database",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Save to HR Database": {
      "main": [
        [
          {
            "node": "Respond to Webhook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  }
}

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.

Pro

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

About this workflow

Ai Recruitment Automation System. Uses formTrigger, slack. Event-driven trigger; 4 nodes.

Source: https://github.com/vtusharkumar2/AI-Recruitment-Automation-System/blob/main/workflow.json — 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.

Slack & Telegram

This workflow collects a blog brief via an n8n form, uses Anthropic Claude to generate an outline and write each section, saves both outline and article as formatted Google Docs in Google Drive, then

Form Trigger, Google Sheets, HTTP Request +2
Slack & Telegram

This workflow runs a SEEK.com.au job search via Apify on a daily schedule or on-demand form submission, deduplicates new listings, and routes results to Google Sheets, Airtable, a webhook endpoint, an

HTTP Request, Google Sheets, Airtable +5
Slack & Telegram

SEO Tracker. Uses googleSheets, formTrigger, dataTable, @hasdata/n8n-nodes-hasdata. Event-driven trigger; 32 nodes.

Google Sheets, Form Trigger, Data Table +2
Slack & Telegram

Upload a document (PDF, PNG, JPEG) via a web form and let easybits Extractor classify it into one of your defined categories. Based on the classification result and a confidence score, the document is

Form Trigger, HTTP Request, Google Drive +1
Slack & Telegram

Sweep departing staff commitments from Google Calendar and Asana into a Notion checklist and Slack. Uses formTrigger, googleCalendar, asana, notion. Event-driven trigger; 23 nodes.

Form Trigger, Google Calendar, Asana +3