AutomationFlowsAI & RAG › Hr AI

Hr AI

HR AI. Uses formTrigger, agent, lmChatOpenAi, googleSheets. Event-driven trigger; 7 nodes.

Event trigger★★★★☆ complexityAI-powered7 nodesForm TriggerAgentOpenAI ChatGoogle SheetsOutput Parser Structured
AI & RAG Trigger: Event Nodes: 7 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow follows the Agent → Form Trigger 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": "HR AI",
  "nodes": [
    {
      "parameters": {
        "formTitle": "Formulir Lamaran Kerja",
        "formDescription": "Isi data diri Anda untuk melamar di PT. Jago Otomasi Indonesia",
        "formFields": {
          "values": [
            {
              "fieldLabel": "Nama Lengkap",
              "requiredField": true
            },
            {
              "fieldLabel": "Tanggal Lahir",
              "fieldType": "date",
              "requiredField": true
            },
            {
              "fieldLabel": "Posisi Yang Dilamar",
              "fieldType": "dropdown",
              "fieldOptions": {
                "values": [
                  {
                    "option": "ITJRDEV - Junior Developer"
                  },
                  {
                    "option": "ITSRDEV - Senior Developer"
                  },
                  {
                    "option": "ITBEDEV - Backend Developer"
                  },
                  {
                    "option": "ITFEDEV - Frontend Developer"
                  }
                ]
              },
              "requiredField": true
            },
            {
              "fieldLabel": "Upload CV (.pdf)",
              "fieldType": "file",
              "multipleFiles": false,
              "acceptFileTypes": ".pdf",
              "requiredField": true
            }
          ]
        },
        "options": {
          "appendAttribution": false,
          "buttonLabel": "Kirim Lamaran",
          "customCss": ":root {\n\t--font-family: 'Open Sans', sans-serif;\n\t--font-weight-normal: 400;\n\t--font-weight-bold: 600;\n\t--font-size-body: 12px;\n\t--font-size-label: 14px;\n\t--font-size-test-notice: 12px;\n\t--font-size-input: 14px;\n\t--font-size-header: 20px;\n\t--font-size-paragraph: 14px;\n\t--font-size-link: 12px;\n\t--font-size-error: 12px;\n\t--font-size-html-h1: 28px;\n\t--font-size-html-h2: 20px;\n\t--font-size-html-h3: 16px;\n\t--font-size-html-h4: 14px;\n\t--font-size-html-h5: 12px;\n\t--font-size-html-h6: 10px;\n\t--font-size-subheader: 14px;\n\n\t/* Colors */\n\t--color-background: #fbfcfe;\n\t--color-test-notice-text: #e6a23d;\n\t--color-test-notice-bg: #fefaf6;\n\t--color-test-notice-border: #f6dcb7;\n\t--color-card-bg: #ffffff;\n\t--color-card-border: #dbdfe7;\n\t--color-card-shadow: rgba(99, 77, 255, 0.06);\n\t--color-link: #7e8186;\n\t--color-header: #525356;\n\t--color-label: #555555;\n\t--color-input-border: #dbdfe7;\n\t--color-input-text: #71747A;\n\t--color-focus-border: rgb(90, 76, 194);\n\t--color-submit-btn-bg: #0000FF;\n\t--color-submit-btn-text: #ffffff;\n\t--color-error: #ea1f30;\n\t--color-required: #ff6d5a;\n\t--color-clear-button-bg: #7e8186;\n\t--color-html-text: #555;\n\t--color-html-link: #ff6d5a;\n\t--color-header-subtext: #7e8186;\n\n\t/* Border Radii */\n\t--border-radius-card: 8px;\n\t--border-radius-input: 6px;\n\t--border-radius-clear-btn: 50%;\n\t--card-border-radius: 8px;\n\n\t/* Spacing */\n\t--padding-container-top: 24px;\n\t--padding-card: 24px;\n\t--padding-test-notice-vertical: 12px;\n\t--padding-test-notice-horizontal: 24px;\n\t--margin-bottom-card: 16px;\n\t--padding-form-input: 12px;\n\t--card-padding: 24px;\n\t--card-margin-bottom: 16px;\n\n\t/* Dimensions */\n\t--container-width: 448px;\n\t--submit-btn-height: 48px;\n\t--checkbox-size: 18px;\n\n\t/* Others */\n\t--box-shadow-card: 0px 4px 16px 0px var(--color-card-shadow);\n\t--opacity-placeholder: 0.5;\n}"
        }
      },
      "type": "n8n-nodes-base.formTrigger",
      "typeVersion": 2.2,
      "position": [
        0,
        0
      ],
      "id": "a3cd20c8-a4c4-4eae-8809-115b3a8d4fdd",
      "name": "On form submission"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=Isian Form :\nNama Lengkap : {{ $('On form submission').item.json['Nama Lengkap'] }}\nTanggal Lahir : {{ $('On form submission').item.json['Tanggal Lahir'] }}\n\nIsi CV PDF :\n{{ $('Extract PDF').item.json.text }}\n\n# Requirement Posisi\nUsia Minimal : {{ $json['Min Age'] }}\nUsia Maximal : {{ $json['Max Age'] }}\nMinimal Tahun Pengalaman Kerja : {{ $json['Min YoE'] }}\nPendidikan Minimal : {{ $json['Min Education'] }}\nRequired Skill : {{ $json['Required Skill'] }}",
        "hasOutputParser": true,
        "options": {
          "systemMessage": "=Hari ini adalah tanggal {{ $now.format('yyyy-MM-dd') }}.\n\nKamu adalah seorang staff HR yang bertugas untuk memfilter dan memberikan penilaian awal terhadap lamaran masuk dan harus kamu bandingkan dengan posisi yang tersedia di perusahaan dengan cara menganalisa isi CV yang dikirimkan.\n\nOutput yang harus kamu berikan :\n\n- Nama Lengkap\n- Tanggal Lahir\n- Usia Per Hari Ini (Tahun, Bulan, Hari)\n- Kecocokan Usia Dalam Persentase (Berdasarkan Usia Minimum dan Maksimum)\n- Kecocokan Status Pendidikan Dalam Persentase (Kalau strata pendidikan diatas batas minimal, maka 100%, kalau dibawah batas minimal, semakin jauh, semakin kecil persentasenya)\n- Kecocokan tahun pengalaman kerja dalam persentase,\n- Kecocokan skill yang dibutuhkan dalam persentase.\n\nContoh output :\n\n{\n  \"fullname\": \"<nama lengkap, bisa dari form atau CV, cari yang paling lengkap>\",\n  \"dob\": \"<Tanggal Lahir>\",\n  \"age\": \"<Usia per hari ini - contoh 20 Tahun, 8 Bulan, 9 hari>\",\n  \"vacancy_min_age\": \"<Usia Minimum dalam lowongan>\",\n  \"vacancy_max_age\": \"<Usia Maksimum dalam lowongan>\",\n  \"age_percentage\": \"<persentase kecocokan usia dengan lowongan, angkanya saja tanpa simbol %>\",\n  \"education_level\": \"<Level pendidikan pelamar - contoh SD, SLTA, S1, dll>\",\n  \"vacancy_education_level\": \"<level pendidikan minimal dalam lowongan>\",\n  \"education_percentage\": \"<persentase kecocokan strata pendidikan dengan lowongan, angkanya saja tanpa simbol %>\",\n  \"yoe\": \"<total tahun pengalaman pelamar>\",\n  \"vacancy_yoe\": \"<tahun pengalaman kerja yang dibutuhkan di lowongan>\",\n  \"yoe_percentage\": \"<kecocokan tahun pengalaman kerja dalam persentase, angkanya saja tanpa simbol %\",\n  \"skills\": \"<skill utama dari pelamar dengan pemisah koma>\",\n  \"vacancy_skills\": \"<skill yang dibutuhkan dalam lowongan>\",\n  \"skill_percentage\": \"<kecocokan skill dalam persentase dengan lowongan, angkanya saja tanpa simbol %>\",\n  \"average_percentage\": \"<persentase rata-rata dari age_percentage, education_percentage, yoe_percentage, skill_percentage, angkanya saja tanpa simbol %>\"\n}\n\n# PENTING\n- JANGAN PERNAH berhalusinasi soal data. Pastikan data yang kamu hitung valid.",
          "passthroughBinaryImages": true
        }
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 2,
      "position": [
        780,
        0
      ],
      "id": "add1d97c-47d1-4b14-855d-f71cc8f7b441",
      "name": "AI Agent"
    },
    {
      "parameters": {
        "model": {
          "__rl": true,
          "value": "gpt-4.1",
          "mode": "list",
          "cachedResultName": "gpt-4.1"
        },
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "typeVersion": 1.2,
      "position": [
        680,
        260
      ],
      "id": "5ae4a79f-4f10-409e-8c14-2af88240a0dd",
      "name": "OpenAI Chat Model",
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "documentId": {
          "__rl": true,
          "value": "1buT5kZNGGwjCYfgBt1LrVbwz66q45R6tQoMUQqguk5w",
          "mode": "list",
          "cachedResultName": "AI HR",
          "cachedResultUrl": "https://docs.google.com/"
        },
        "sheetName": {
          "__rl": true,
          "value": "gid=0",
          "mode": "list",
          "cachedResultName": "Vacancy",
          "cachedResultUrl": "https://docs.google.com/"
        },
        "filtersUI": {
          "values": [
            {
              "lookupColumn": "Position",
              "lookupValue": "={{ $('On form submission').item.json['Posisi Yang Dilamar'] }}"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.6,
      "position": [
        500,
        0
      ],
      "id": "872554ae-6c89-4cf0-928f-03478cb9fc68",
      "name": "Get Vacancy",
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "operation": "pdf",
        "binaryPropertyName": "Upload_CV___pdf_",
        "options": {}
      },
      "type": "n8n-nodes-base.extractFromFile",
      "typeVersion": 1,
      "position": [
        260,
        0
      ],
      "id": "73ec3a99-3f1c-4bbd-a84c-fbf5c2384b23",
      "name": "Extract PDF"
    },
    {
      "parameters": {
        "jsonSchemaExample": "{\n  \"fullname\": \"<nama lengkap, bisa dari form atau CV, cari yang paling lengkap>\",\n  \"dob\": \"<Tanggal Lahir>\",\n  \"age\": \"<Usia per hari ini - contoh 20 Tahun, 8 Bulan, 9 hari>\",\n  \"vacancy_min_age\": \"<Usia Minimum dalam lowongan>\",\n  \"vacancy_max_age\": \"<Usia Maksimum dalam lowongan>\",\n  \"age_percentage\": \"<persentase kecocokan usia dengan lowongan, angkanya saja tanpa simbol %>\",\n  \"education_level\": \"<Level pendidikan pelamar - contoh SD, SLTA, S1, dll>\",\n  \"vacancy_education_level\": \"<level pendidikan minimal dalam lowongan>\",\n  \"education_percentage\": \"<persentase kecocokan strata pendidikan dengan lowongan, angkanya saja tanpa simbol %>\",\n  \"yoe\": \"<total tahun pengalaman pelamar>\",\n  \"vacancy_yoe\": \"<tahun pengalaman kerja yang dibutuhkan di lowongan>\",\n  \"yoe_percentage\": \"<kecocokan tahun pengalaman kerja dalam persentase, angkanya saja tanpa simbol %\",\n  \"skills\": \"<skill utama dari pelamar dengan pemisah koma>\",\n  \"vacancy_skills\": \"<skill yang dibutuhkan dalam lowongan>\",\n  \"skill_percentage\": \"<kecocokan skill dalam persentase dengan lowongan, angkanya saja tanpa simbol %>\",\n  \"average_percentage\": \"<persentase rata-rata dari age_percentage, education_percentage, yoe_percentage, skill_percentage, angkanya saja tanpa simbol %>\"\n}"
      },
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "typeVersion": 1.3,
      "position": [
        1000,
        260
      ],
      "id": "1f4f00f3-c643-46e8-ba67-92574a76b6da",
      "name": "Structured Output Parser"
    },
    {
      "parameters": {
        "operation": "append",
        "documentId": {
          "__rl": true,
          "value": "1buT5kZNGGwjCYfgBt1LrVbwz66q45R6tQoMUQqguk5w",
          "mode": "list",
          "cachedResultName": "AI HR",
          "cachedResultUrl": "https://docs.google.com/"
        },
        "sheetName": {
          "__rl": true,
          "value": 180424369,
          "mode": "list",
          "cachedResultName": "Applicant",
          "cachedResultUrl": "https://docs.google.com/"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "Fullname": "={{ $json.output.fullname }}",
            "DoB": "={{ $json.output.dob }}",
            "Age": "={{ $json.output.age }}",
            "Vacancy Min Age": "={{ $json.output.vacancy_min_age }}",
            "Vacancy Max Age": "={{ $json.output.vacancy_max_age }}",
            "Age Percentage": "={{ $json.output.age_percentage }}",
            "Education Level": "={{ $json.output.education_level }}",
            "Vacancy Education Level": "={{ $json.output.vacancy_education_level }}",
            "Education Percentage": "={{ $json.output.education_percentage }}",
            "YoE": "={{ $json.output.yoe }}",
            "YoE Percentage": "={{ $json.output.yoe_percentage }}",
            "Vacancy YoE": "={{ $json.output.vacancy_yoe }}",
            "Skills": "={{ $json.output.skills }}",
            "Vacancy Skills": "={{ $json.output.vacancy_skills }}",
            "Skill Percentage": "={{ $json.output.skill_percentage }}",
            "Average Percentage": "={{ $json.output.average_percentage }}"
          },
          "matchingColumns": [],
          "schema": [
            {
              "id": "Fullname",
              "displayName": "Fullname",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "DoB",
              "displayName": "DoB",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Age",
              "displayName": "Age",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Vacancy Min Age",
              "displayName": "Vacancy Min Age",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Vacancy Max Age",
              "displayName": "Vacancy Max Age",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Age Percentage",
              "displayName": "Age Percentage",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Education Level",
              "displayName": "Education Level",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Vacancy Education Level",
              "displayName": "Vacancy Education Level",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Education Percentage",
              "displayName": "Education Percentage",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "YoE",
              "displayName": "YoE",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Vacancy YoE",
              "displayName": "Vacancy YoE",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "YoE Percentage",
              "displayName": "YoE Percentage",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Skills",
              "displayName": "Skills",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Vacancy Skills",
              "displayName": "Vacancy Skills",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Skill Percentage",
              "displayName": "Skill Percentage",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Average Percentage",
              "displayName": "Average Percentage",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            }
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {}
      },
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.6,
      "position": [
        1140,
        0
      ],
      "id": "e5aa6629-ec6c-4b03-a10e-ff1357ef6d2c",
      "name": "Save Applicant",
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      }
    }
  ],
  "connections": {
    "On form submission": {
      "main": [
        [
          {
            "node": "Extract PDF",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Get Vacancy": {
      "main": [
        [
          {
            "node": "AI Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract PDF": {
      "main": [
        [
          {
            "node": "Get Vacancy",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser": {
      "ai_outputParser": [
        [
          {
            "node": "AI Agent",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent": {
      "main": [
        [
          {
            "node": "Save Applicant",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Save Applicant": {
      "main": [
        []
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "f3bd384e-cd46-43e6-bce3-cbc484227cac",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "id": "2LEk0uAxPLc8aFwP",
  "tags": []
}

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

HR AI. Uses formTrigger, agent, lmChatOpenAi, googleSheets. Event-driven trigger; 7 nodes.

Source: https://github.com/jipraks/n8n-templates/blob/9af802a0da83a0e369ab296beb2c5c37b944043b/hr-ai-agent.json — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

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

AI & RAG

🎯 Create viral TikToks, Shorts, Reels, podcasts, and ASMR videos in minutes — all on autopilot.

OpenAI, HTTP Request, Form Trigger +7
AI & RAG

Digistars - Scrape & Crawl. Uses httpRequest, n8n-nodes-firecrawl-scraper, googleSheets, lmChatOpenAi. Event-driven trigger; 63 nodes.

HTTP Request, N8N Nodes Firecrawl Scraper, Google Sheets +5
AI & RAG

🧠 Automate end-to-end SEO blog creation and WordPress publishing using a GPT-5 multi-agent workflow with real-time research, metadata generation, and optional featured images.

Output Parser Structured, HTTP Request, OpenAI +10
AI & RAG

This n8n workflow template automates your lead generation and follow-up process using AI. It captures leads through a form, enriches them with company data, classifies them into different categories,

Gmail, Output Parser Structured, Form Trigger +5
AI & RAG

The workflow runs every hour with a randomized delay of 5–20 minutes to help distribute load. It records the exact date and time a lead is emailed so you can track outreach. Follow-ups are automatical

Google Sheets, Agent, OpenAI Chat +5