This workflow corresponds to n8n.io template #8775 — we link there as the canonical source.
This workflow follows the Agent → Error 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 →
{
"meta": {
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "cd2935cd-0853-40da-bbe4-17de17d788da",
"name": "On form submission",
"type": "n8n-nodes-base.formTrigger",
"position": [
80,
64
],
"parameters": {
"options": {},
"formTitle": "Upload CSV File",
"formFields": {
"values": [
{
"fieldType": "file",
"fieldLabel": "New File Attachment",
"multipleFiles": false,
"requiredField": true,
"acceptFileTypes": "csv,xlsx,xls"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "3f8140b0-fcc5-4ebc-a3a3-33a79e7c3667",
"name": "No Operation, do nothing",
"type": "n8n-nodes-base.noOp",
"position": [
656,
160
],
"parameters": {},
"typeVersion": 1
},
{
"id": "34b10d10-b3b4-46c9-9afa-44e42a4b8918",
"name": "Merge",
"type": "n8n-nodes-base.merge",
"position": [
848,
64
],
"parameters": {
"mode": "combine",
"options": {},
"combineBy": "combineByPosition"
},
"typeVersion": 3.1
},
{
"id": "f095da77-dfbb-492c-8b1c-bc8b08b3272c",
"name": "Create Google Sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
656,
-48
],
"parameters": {
"title": "=New Job Application Google Sheet Form {{ $now.format('d-LL-yyyy, H:mm') }}",
"options": {},
"resource": "spreadsheet",
"sheetsUi": {
"sheetValues": [
{
"title": "New Job Application Form"
}
]
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"executeOnce": true,
"typeVersion": 4.5
},
{
"id": "76ab3d56-cb3e-4c4d-b54a-d4741b3ee3b7",
"name": "Upload file",
"type": "n8n-nodes-base.googleDrive",
"position": [
272,
64
],
"parameters": {
"name": "=New Job Application Form {{ $now.format('d-LL-yyyy, H:mm') }}",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive"
},
"options": {},
"folderId": {
"__rl": true,
"mode": "list",
"value": "17r0X1Y16pvY1NXhKFUzzjS0mflnTy_k0",
"cachedResultUrl": "https://drive.google.com/drive/folders/17r0X1Y16pvY1NXhKFUzzjS0mflnTy_k0",
"cachedResultName": "Demos"
},
"inputDataFieldName": "New_File_Attachment"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "7d03be54-eae1-4ecb-91b1-930401916a98",
"name": "Download file",
"type": "n8n-nodes-base.googleDrive",
"position": [
464,
64
],
"parameters": {
"fileId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.id }}"
},
"options": {
"fileName": "=New Job Application Form {{ $now.format('d-LL-yyyy, H:mm') }}",
"binaryPropertyName": "New_File_Attachment"
},
"operation": "download"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "09e7c1c0-e418-4c32-9bd4-c1ca916629cb",
"name": "Extract from CSV",
"type": "n8n-nodes-base.extractFromFile",
"position": [
1216,
-32
],
"parameters": {
"options": {},
"binaryPropertyName": "New_File_Attachment"
},
"executeOnce": true,
"typeVersion": 1
},
{
"id": "359988ca-ed6f-49f7-b8ca-d9d574a0749b",
"name": "Get Rid of File",
"type": "n8n-nodes-base.googleDrive",
"position": [
1744,
64
],
"parameters": {
"fileId": {
"__rl": true,
"mode": "id",
"value": "={{ $('Upload file').item.json.id }}"
},
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive"
},
"folderId": {
"__rl": true,
"mode": "list",
"value": "1cmnKI80W2CN67l8HOMeLdRLx-rFcxbzB",
"cachedResultUrl": "https://drive.google.com/drive/folders/1cmnKI80W2CN67l8HOMeLdRLx-rFcxbzB",
"cachedResultName": "Temp"
},
"operation": "move"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"executeOnce": true,
"typeVersion": 3
},
{
"id": "483ff041-e758-4b30-941a-8ef307ca1957",
"name": "Format Columns1",
"type": "n8n-nodes-base.code",
"position": [
2208,
64
],
"parameters": {
"jsCode": "// Split the comma-separated string from $json.columns\nconst headersArray = $json.columns.split(',');\n\n// Create an object where each key is a header (trimmed) and its value is null\nconst headersObject = {};\nheadersArray.forEach(header => {\n const trimmedHeader = header.trim();\n headersObject[trimmedHeader] = null;\n});\n\n// Return the object so that each header becomes a column in the first row of your sheet\nreturn [\n {\n json: headersObject\n }\n];\n"
},
"typeVersion": 2
},
{
"id": "e5bb996e-882d-493a-82d9-2b32ceb02f8d",
"name": "Format Columns",
"type": "n8n-nodes-base.set",
"position": [
2032,
64
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "eb599b84-0ef6-4020-97f0-8e1e07bdd756",
"name": "columns",
"type": "string",
"value": "Score Explanation, Evaluation Score"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "712a1a6d-ed8a-4e09-abbd-36be4057ea89",
"name": "Add Columns",
"type": "n8n-nodes-base.googleSheets",
"position": [
2384,
64
],
"parameters": {
"columns": {
"value": {},
"schema": [
{
"id": "\u05e9\u05dd \u05e4\u05e8\u05d8\u05d9",
"type": "string",
"display": true,
"required": false,
"displayName": "\u05e9\u05dd \u05e4\u05e8\u05d8\u05d9",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "\u05e9\u05dd \u05de\u05e9\u05e4\u05d7\u05d4",
"type": "string",
"display": true,
"required": false,
"displayName": "\u05e9\u05dd \u05de\u05e9\u05e4\u05d7\u05d4",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "\u05d7\u05e9\u05d1\u05d5\u05df \u05dc\u05d9\u05e0\u05e7\u05d3\u05d0\u05d9\u05df",
"type": "string",
"display": true,
"required": false,
"displayName": "\u05d7\u05e9\u05d1\u05d5\u05df \u05dc\u05d9\u05e0\u05e7\u05d3\u05d0\u05d9\u05df",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "\u05d4\u05e8\u05e4\u05ea\u05e7\u05e0\u05d9?",
"type": "string",
"display": true,
"required": false,
"displayName": "\u05d4\u05e8\u05e4\u05ea\u05e7\u05e0\u05d9?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "\u05de\u05d4 \u05de\u05d5\u05e9\u05da \u05d0\u05d5\u05ea\u05da \u05dc\u05d4\u05d3\u05e8\u05db\u05d4",
"type": "string",
"display": true,
"required": false,
"displayName": "\u05de\u05d4 \u05de\u05d5\u05e9\u05da \u05d0\u05d5\u05ea\u05da \u05dc\u05d4\u05d3\u05e8\u05db\u05d4",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "\u05e0\u05d9\u05e1\u05d9\u05d5\u05df \u05d1\u05d4\u05d3\u05e8\u05db\u05d4",
"type": "string",
"display": true,
"required": false,
"displayName": "\u05e0\u05d9\u05e1\u05d9\u05d5\u05df \u05d1\u05d4\u05d3\u05e8\u05db\u05d4",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "\u05d0\u05d4\u05d5\u05d1 \u05d1\u05d4\u05d3\u05e8\u05db\u05d4",
"type": "string",
"display": true,
"required": false,
"displayName": "\u05d0\u05d4\u05d5\u05d1 \u05d1\u05d4\u05d3\u05e8\u05db\u05d4",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "\u05e8\u05de\u05ea \u05d0\u05e0\u05d2\u05dc\u05d9\u05ea",
"type": "string",
"display": true,
"required": false,
"displayName": "\u05e8\u05de\u05ea \u05d0\u05e0\u05d2\u05dc\u05d9\u05ea",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "\u05d4\u05ea\u05de\u05d5\u05d3\u05d3\u05d5\u05ea \u05e2\u05dd \u05e7\u05d1\u05d5\u05e6\u05d4 \u05e8\u05d5\u05e2\u05e9\u05ea",
"type": "string",
"display": true,
"required": false,
"displayName": "\u05d4\u05ea\u05de\u05d5\u05d3\u05d3\u05d5\u05ea \u05e2\u05dd \u05e7\u05d1\u05d5\u05e6\u05d4 \u05e8\u05d5\u05e2\u05e9\u05ea",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "\u05d1\u05e7\u05d9\u05d0\u05d5\u05ea \u05d1\u05d4\u05d9\u05e1\u05d8\u05d5\u05e8\u05d9\u05d4",
"type": "string",
"display": true,
"required": false,
"displayName": "\u05d1\u05e7\u05d9\u05d0\u05d5\u05ea \u05d1\u05d4\u05d9\u05e1\u05d8\u05d5\u05e8\u05d9\u05d4",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "autoMapInputData",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "id",
"value": "={{ $('Create Google Sheet').item.json.sheets[0].properties.sheetId }}"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "={{ $('Create Google Sheet').item.json.spreadsheetId }}"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "bf6a636f-648c-4922-a3c1-b5fc624ba296",
"name": "Read Sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
64,
416
],
"parameters": {
"options": {
"returnFirstMatch": true,
"dataLocationOnSheet": {
"values": {
"rangeDefinition": "detectAutomatically"
}
}
},
"sheetName": {
"__rl": true,
"mode": "id",
"value": "={{ $('Create Google Sheet').item.json.sheets[0].properties.sheetId }}"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "={{ $('Create Google Sheet').item.json.spreadsheetId }}"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "ad8d3814-ecd0-4b5e-8c64-2a213a17abe2",
"name": "Get First Row",
"type": "n8n-nodes-base.httpRequest",
"position": [
1456,
416
],
"parameters": {
"url": "=https://sheets.googleapis.com/v4/spreadsheets/{{ $('Create Google Sheet').item.json.spreadsheetId }}/values/{{ $('Create Google Sheet').item.json.sheets[0].properties.title }}!1:1",
"options": {},
"authentication": "predefinedCredentialType",
"nodeCredentialType": "googleSheetsOAuth2Api"
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "5e4d64f4-b029-4f40-b628-304112e4909b",
"name": "Apply Formatting",
"type": "n8n-nodes-base.httpRequest",
"position": [
1632,
416
],
"parameters": {
"url": "=https://sheets.googleapis.com/v4/spreadsheets/{{ $('Create Google Sheet').item.json.spreadsheetId }}:batchUpdate",
"method": "POST",
"options": {},
"jsonBody": "={\n \"requests\": [\n {\n \"updateSheetProperties\": {\n \"properties\": {\n \"sheetId\": {{ $('Create Google Sheet').item.json.sheets[0].properties.sheetId }},\n \"rightToLeft\": true\n },\n \"fields\": \"rightToLeft\"\n }\n },\n {\n \"repeatCell\": {\n \"range\": {\n \"sheetId\": {{ $('Create Google Sheet').item.json.sheets[0].properties.sheetId }},\n \"startRowIndex\": 0,\n \"endRowIndex\": 1\n },\n \"cell\": {\n \"userEnteredFormat\": {\n \"backgroundColor\": {\n \"red\": 0.8,\n \"green\": 0.9,\n \"blue\": 1.0\n },\n \"textFormat\": {\n \"bold\": true\n },\n \"verticalAlignment\": \"MIDDLE\",\n \"horizontalAlignment\": \"RIGHT\",\n \"wrapStrategy\": \"WRAP\"\n }\n },\n \"fields\": \"userEnteredFormat(backgroundColor,textFormat,verticalAlignment,horizontalAlignment,wrapStrategy)\"\n }\n },\n {\n \"repeatCell\": {\n \"range\": {\n \"sheetId\": {{ $('Create Google Sheet').item.json.sheets[0].properties.sheetId }},\n \"startRowIndex\": 1\n },\n \"cell\": {\n \"userEnteredFormat\": {\n \"verticalAlignment\": \"MIDDLE\",\n \"horizontalAlignment\": \"RIGHT\",\n \"wrapStrategy\": \"WRAP\"\n }\n },\n \"fields\": \"userEnteredFormat(verticalAlignment,horizontalAlignment,wrapStrategy)\"\n }\n },\n {\n \"setBasicFilter\": {\n \"filter\": {\n \"range\": {\n \"sheetId\": {{ $('Create Google Sheet').item.json.sheets[0].properties.sheetId }}\n }\n }\n }\n },\n {{ $('Get First Row').item.json.values[0].map((header, index) => JSON.stringify({\n \"updateDimensionProperties\": {\n \"range\": {\n \"sheetId\": $('Create Google Sheet').item.json.sheets[0].properties.sheetId,\n \"dimension\": \"COLUMNS\",\n \"startIndex\": index,\n \"endIndex\": index + 1\n },\n \"properties\": {\n \"pixelSize\": Math.max(120, header.length * 12 + 40)\n },\n \"fields\": \"pixelSize\"\n }\n })).join(',') }},\n {\n \"sortRange\": {\n \"range\": {\n \"sheetId\": {{ $('Create Google Sheet').item.json.sheets[0].properties.sheetId }},\n \"startRowIndex\": 1\n },\n \"sortSpecs\": [\n {\n \"dimensionIndex\": {{ $('Get First Row').item.json.values[0].indexOf('Evaluation Score') }},\n \"sortOrder\": \"DESCENDING\"\n }\n ]\n }\n }\n ]\n}",
"sendBody": true,
"specifyBody": "json",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "googleSheetsOAuth2Api"
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "85518e84-1bcb-48e8-ab66-5b2fb72e31b2",
"name": "AI Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
496,
416
],
"parameters": {
"text": "=Google sheets Information: {{ $json.toJsonString() }}\n",
"options": {
"systemMessage": "=## Overview\nYou are a Hiring Evaluation Agent. Your job is to update rows in Google Sheets according to the information you receive. You receive:\n1) A full Google Sheet dump of candidates including row numbers.\n2) MANDATORY: For each candidate, fetch recent LinkedIn posts using Apify before evaluation.\n\n## Data format\n- Google Sheet rows include: row_number, full name, LinkedIn profile URL, and questions in the first row with answers in subsequent rows.\n\n## Apify - LinkedIn Integration (MANDATORY)\nAlways collect up to 3 recent posts per candidate using the following exact sequence:\n1) Run an Actor in Apify\n - Input must include the candidate's LinkedIn profile URL taken from the current Google Sheet row.\n - Limit results to max 3 posts.\n2) Get last run in Apify\n - Fetch the output items from the last run triggered in step 1.\n - Store the resulting posts with the candidate context of the same row.\n3) Matching logic to ensure the posts belong to the correct person\n - Primary key: exact LinkedIn profile URL match to the sheet row.\n - Fallback: match by full name after normalization\n - trim spaces\n - case insensitive\n - tolerate minor spelling variations\n4) If no posts are found or the LinkedIn URL is invalid\n - Continue the evaluation.\n - Explicitly write in Hebrew that the score is based only on form answers due to missing LinkedIn data.\n\n## Rules\n- ALWAYS use the provided `rowNumber` or `Row_Number_to_Match` to link your evaluation to the correct row.\n- Be consistent and fair - normalize scores so only top candidates approach 90+.\n- The reason must be at least 1 sentence including all explanations.\n- Explanations must be professional and in Hebrew only.\n- You have access to a Google Sheets - Update Row tool. Use it to add two new columns in the same row for each candidate:\n - Evaluation_Score\n - Score_Explanation\n- ALWAYS use the Apify sequence above to fetch recent posts for each candidate when possible.\n- ALWAYS factor LinkedIn posts into both the score and the Hebrew explanation. If none exist, say so explicitly in Hebrew and proceed the score/explanation based only on form answers due to missing LinkedIn data.\n\n## Goals\n- Infer the job role from the provided data in the sheet.\n- Before evaluating each candidate, use Apify to fetch their recent LinkedIn posts as described.\n- For each candidate output the following fields:\n - Evaluation_Score: a number from 0 to 100 based on role fit.\n - Score_Explanation: one professional Hebrew sentence that includes insights from LinkedIn posts. If no posts were found, explicitly state that the score is based on form answers only.\n - Row_Number_to_Match: the numeric row_number to update in Google Sheets.\n\n## Scoring rubric\n- Must-have skills match - 50%\n- Relevant experience - 25%\n- Achievements and impact signals - 15%\n- Communication clarity - 10%\n\n## Matching rules between candidates and \"More Information\" blocks\n- Preferred key: LinkedIn profile URL exact match.\n- Fallback: match by full name after normalization as defined above.\n\n## Required evaluation flow per candidate\n1) Read the candidate row from Google Sheets and identify:\n - row_number\n - full name\n - LinkedIn profile URL\n - all answers\n2) Run an Actor in Apify using the LinkedIn profile URL.\n3) Get last run in Apify and collect up to 3 recent posts for this candidate if exist.\n4) Score the candidate using the rubric and LinkedIn insights.\n5) Write one Hebrew sentence that clearly includes LinkedIn insights. If no posts were found, explicitly note that the score is based on form answers only.\n6) Use Google Sheets - Update Row to write:\n - Evaluation_Score\n - Score_Explanation\n into two new columns in the same row indicated by Row_Number_to_Match.\n\n## Error handling\n- If Apify returns an error or no items:\n - Proceed with evaluation based on form answers.\n - In the Hebrew explanation state that LinkedIn data was unavailable and the score is based on form answers only.\n- If multiple LinkedIn profiles match a name during fallback:\n - Prefer exact URL matches.\n - If still ambiguous, choose the profile whose name and headline are closest to the sheet entry and state the uncertainty in the internal reasoning, but keep the Hebrew explanation concise.\n\n## Output contract\nFor each candidate, produce a structured object with exactly these keys:\n- Row_Number_to_Match: <number>\n- Evaluation_Score: <0-100 only the number>\n- Score_Explanation: <Hebrew sentence, includes LinkedIn insights or explicitly states no LinkedIn posts were available>\n\nThen call Google Sheets - Update Row using Row_Number_to_Match and write Evaluation_Score and Score_Explanation to two new columns in that same row.\n"
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 2.2
},
{
"id": "40481b0a-12ea-47b2-ac72-2a66af8af2d2",
"name": "Update row in sheet in Google Sheets1",
"type": "n8n-nodes-base.googleSheetsTool",
"position": [
752,
608
],
"parameters": {
"columns": {
"value": {
"row_number": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('row_number__using_to_match_', ``, 'number') }}",
"Evaluation Score": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Evaluation_Score', ``, 'string') }}",
"Score Explanation": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Score_Explanation', ``, 'string') }}"
},
"schema": [
{
"id": "\u05e9\u05dd \u05e4\u05e8\u05d8\u05d9",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "\u05e9\u05dd \u05e4\u05e8\u05d8\u05d9",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "\u05e9\u05dd \u05de\u05e9\u05e4\u05d7\u05d4",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "\u05e9\u05dd \u05de\u05e9\u05e4\u05d7\u05d4",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "\u05d7\u05e9\u05d1\u05d5\u05df \u05dc\u05d9\u05e0\u05e7\u05d3\u05d0\u05d9\u05df",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "\u05d7\u05e9\u05d1\u05d5\u05df \u05dc\u05d9\u05e0\u05e7\u05d3\u05d0\u05d9\u05df",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "\u05d4\u05e8\u05e4\u05ea\u05e7\u05e0\u05d9?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "\u05d4\u05e8\u05e4\u05ea\u05e7\u05e0\u05d9?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "\u05de\u05d4 \u05de\u05d5\u05e9\u05da \u05d0\u05d5\u05ea\u05da \u05dc\u05d4\u05d3\u05e8\u05db\u05d4",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "\u05de\u05d4 \u05de\u05d5\u05e9\u05da \u05d0\u05d5\u05ea\u05da \u05dc\u05d4\u05d3\u05e8\u05db\u05d4",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "\u05e0\u05d9\u05e1\u05d9\u05d5\u05df \u05d1\u05d4\u05d3\u05e8\u05db\u05d4",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "\u05e0\u05d9\u05e1\u05d9\u05d5\u05df \u05d1\u05d4\u05d3\u05e8\u05db\u05d4",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "\u05d0\u05d4\u05d5\u05d1 \u05d1\u05d4\u05d3\u05e8\u05db\u05d4",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "\u05d0\u05d4\u05d5\u05d1 \u05d1\u05d4\u05d3\u05e8\u05db\u05d4",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "\u05e8\u05de\u05ea \u05d0\u05e0\u05d2\u05dc\u05d9\u05ea",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "\u05e8\u05de\u05ea \u05d0\u05e0\u05d2\u05dc\u05d9\u05ea",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "\u05d4\u05ea\u05de\u05d5\u05d3\u05d3\u05d5\u05ea \u05e2\u05dd \u05e7\u05d1\u05d5\u05e6\u05d4 \u05e8\u05d5\u05e2\u05e9\u05ea",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "\u05d4\u05ea\u05de\u05d5\u05d3\u05d3\u05d5\u05ea \u05e2\u05dd \u05e7\u05d1\u05d5\u05e6\u05d4 \u05e8\u05d5\u05e2\u05e9\u05ea",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "\u05d1\u05e7\u05d9\u05d0\u05d5\u05ea \u05d1\u05d4\u05d9\u05e1\u05d8\u05d5\u05e8\u05d9\u05d4",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "\u05d1\u05e7\u05d9\u05d0\u05d5\u05ea \u05d1\u05d4\u05d9\u05e1\u05d8\u05d5\u05e8\u05d9\u05d4",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Score Explanation",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Score Explanation",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Evaluation Score",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Evaluation Score",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "row_number",
"type": "number",
"display": true,
"removed": false,
"readOnly": true,
"required": false,
"displayName": "row_number",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"row_number"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "id",
"value": "={{ $('Create Google Sheet').item.json.sheets[0].properties.sheetId }}"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "={{ $('Create Google Sheet').item.json.spreadsheetId }}"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "25824592-3837-4a57-8bba-0f36fa8d75f5",
"name": "Structured Output Parser1",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
1024,
624
],
"parameters": {
"jsonSchemaExample": "{\n \"Evaluation_Score\": 84,\n \"Score_Explanation\": \"\u05db\u05d0\u05df \u05ea\u05d1\u05d5\u05d0 \u05e1\u05d9\u05d1\u05d4 \u05de\u05e7\u05e6\u05d5\u05e2\u05d9\u05ea \u05d1\u05e2\u05d1\u05e8\u05d9\u05ea \u05d1\u05de\u05e9\u05e4\u05d8 \u05d0\u05d7\u05d3 \u05e8\u05e6\u05d9\u05e3\",\n \"Row_Number_to_Match\": 2\n}\n"
},
"typeVersion": 1.3
},
{
"id": "d2fd11d3-6160-4594-83ac-6445ed391b8a",
"name": "Get dataset items in Apify",
"type": "@apify/n8n-nodes-apify.apifyTool",
"position": [
560,
608
],
"parameters": {
"resource": "Datasets",
"datasetId": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Dataset_ID', `The \"defaultDatasetId\" received from the Apify actor\u00a0tool\u00a0as\u00a0is`, 'string') }}"
},
"credentials": {
"apifyApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "6218daa4-eb54-4407-91a2-307121e9d66a",
"name": "Prepare for Formatting",
"type": "n8n-nodes-base.set",
"onError": "continueRegularOutput",
"position": [
1280,
416
],
"parameters": {
"options": {}
},
"executeOnce": true,
"typeVersion": 3.4
},
{
"id": "8d7d8a62-5bf9-4964-82aa-76ab842e493f",
"name": "Switch",
"type": "n8n-nodes-base.switch",
"position": [
1024,
64
],
"parameters": {
"rules": {
"values": [
{
"outputKey": "CSV",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "dd765bcd-18d8-4a92-bed2-a9bc3f20770d",
"operator": {
"type": "string",
"operation": "endsWith"
},
"leftValue": "={{ $('On form submission').item.json[\"New File Attachment\"].filename }}",
"rightValue": ".csv"
}
]
},
"renameOutput": true
},
{
"outputKey": "XLSX",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "a2da6186-74a2-48dc-ad38-f7bf71df0ea1",
"operator": {
"type": "string",
"operation": "endsWith"
},
"leftValue": "={{ $('On form submission').item.json[\"New File Attachment\"].filename }}",
"rightValue": ".xlsx"
}
]
},
"renameOutput": true
}
]
},
"options": {}
},
"typeVersion": 3.2
},
{
"id": "4e4d8ec0-50de-4783-aae2-53bec86742bd",
"name": "Convert to Google Sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
1568,
64
],
"parameters": {
"columns": {
"value": {},
"schema": [
{
"id": "\u05e9\u05dd \u05e4\u05e8\u05d8\u05d9",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "\u05e9\u05dd \u05e4\u05e8\u05d8\u05d9",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "\u05e9\u05dd \u05de\u05e9\u05e4\u05d7\u05d4",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "\u05e9\u05dd \u05de\u05e9\u05e4\u05d7\u05d4",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "\u05d7\u05e9\u05d1\u05d5\u05df \u05dc\u05d9\u05e0\u05e7\u05d3\u05d0\u05d9\u05df",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "\u05d7\u05e9\u05d1\u05d5\u05df \u05dc\u05d9\u05e0\u05e7\u05d3\u05d0\u05d9\u05df",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "\u05d4\u05e8\u05e4\u05ea\u05e7\u05e0\u05d9?",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "\u05d4\u05e8\u05e4\u05ea\u05e7\u05e0\u05d9?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "\u05de\u05d4 \u05de\u05d5\u05e9\u05da \u05d0\u05d5\u05ea\u05da \u05dc\u05d4\u05d3\u05e8\u05db\u05d4",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "\u05de\u05d4 \u05de\u05d5\u05e9\u05da \u05d0\u05d5\u05ea\u05da \u05dc\u05d4\u05d3\u05e8\u05db\u05d4",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "\u05e0\u05d9\u05e1\u05d9\u05d5\u05df \u05d1\u05d4\u05d3\u05e8\u05db\u05d4",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "\u05e0\u05d9\u05e1\u05d9\u05d5\u05df \u05d1\u05d4\u05d3\u05e8\u05db\u05d4",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "\u05d0\u05d4\u05d5\u05d1 \u05d1\u05d4\u05d3\u05e8\u05db\u05d4",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "\u05d0\u05d4\u05d5\u05d1 \u05d1\u05d4\u05d3\u05e8\u05db\u05d4",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "\u05e8\u05de\u05ea \u05d0\u05e0\u05d2\u05dc\u05d9\u05ea",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "\u05e8\u05de\u05ea \u05d0\u05e0\u05d2\u05dc\u05d9\u05ea",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "\u05d4\u05ea\u05de\u05d5\u05d3\u05d3\u05d5\u05ea \u05e2\u05dd \u05e7\u05d1\u05d5\u05e6\u05d4 \u05e8\u05d5\u05e2\u05e9\u05ea",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "\u05d4\u05ea\u05de\u05d5\u05d3\u05d3\u05d5\u05ea \u05e2\u05dd \u05e7\u05d1\u05d5\u05e6\u05d4 \u05e8\u05d5\u05e2\u05e9\u05ea",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "\u05d1\u05e7\u05d9\u05d0\u05d5\u05ea \u05d1\u05d4\u05d9\u05e1\u05d8\u05d5\u05e8\u05d9\u05d4",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "\u05d1\u05e7\u05d9\u05d0\u05d5\u05ea \u05d1\u05d4\u05d9\u05e1\u05d8\u05d5\u05e8\u05d9\u05d4",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "autoMapInputData",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "name",
"value": "New Job Application Form"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "={{ $('Merge').item.json.spreadsheetId }}"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.5
},
{
"id": "f9b25b1d-2a7f-41d5-95b5-1103f0e6cf2b",
"name": "Extract from XLSX",
"type": "n8n-nodes-base.extractFromFile",
"position": [
1216,
160
],
"parameters": {
"options": {},
"operation": "xlsx",
"binaryPropertyName": "New_File_Attachment"
},
"executeOnce": true,
"typeVersion": 1
},
{
"id": "9161ad0b-dbbf-4a06-b1ff-a3ad111f50ca",
"name": "Sticky Note18",
"type": "n8n-nodes-base.stickyNote",
"position": [
1216,
336
],
"parameters": {
"color": 6,
"width": 612,
"height": 436,
"content": "# 4) Formatting Sheet"
},
"typeVersion": 1
},
{
"id": "7e8cab5f-ded2-419a-bd21-376fd3d96266",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
0,
336
],
"parameters": {
"color": 4,
"width": 1204,
"height": 436,
"content": "# 3) Gather Info, Enrich Data & Add Rows"
},
"typeVersion": 1
},
{
"id": "ec48a114-eaae-4629-86fe-db34bcef3bb4",
"name": "Sticky Note19",
"type": "n8n-nodes-base.stickyNote",
"position": [
1936,
-112
],
"parameters": {
"color": 2,
"width": 612,
"height": 436,
"content": "# 2) Create New Columns"
},
"typeVersion": 1
},
{
"id": "b8ce6484-886f-464d-baba-52f9ef858ce2",
"name": "Sticky Note20",
"type": "n8n-nodes-base.stickyNote",
"position": [
0,
-112
],
"parameters": {
"color": 5,
"width": 1924,
"height": 436,
"content": "# 1) Sort & Prepare Data for Actions"
},
"typeVersion": 1
},
{
"id": "b1b7f743-e7cb-470e-b72e-1a5e6d80c64d",
"name": "Run an Actor in Apify",
"type": "@apify/n8n-nodes-apify.apifyTool",
"position": [
368,
608
],
"parameters": {
"actorId": {
"__rl": true,
"mode": "list",
"value": "LQQIXN9Othf8f7R5n",
"cachedResultUrl": "https://console.apify.com/actors/LQQIXN9Othf8f7R5n/input",
"cachedResultName": "Linkedin Profile Posts Scraper [NO COOKIES] (apimaestro/linkedin-profile-posts)"
},
"customBody": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Input_JSON', `{\n \"total_posts\": 3,\n \"username\": \"paste here the exact linkedin URL of the candidate as it appears in google sheet\"\n}`, 'json') }}"
},
"credentials": {
"apifyApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "92ad23fe-fc6f-443b-85db-2e66a4393296",
"name": "Sticky Note21",
"type": "n8n-nodes-base.stickyNote",
"position": [
-496,
-112
],
"parameters": {
"color": 3,
"width": 484,
"height": 884,
"content": "# AI-Powered Candidate Evaluation and LinkedIn Enrichment in CSV/XLSX Format\n\n## Created by: [Elay Guez](https://www.linkedin.com/in/elay-g)\n\n## Features\n* \ud83d\udcc4 **Upload** CSV/XLSX file with candidate data via form\n* \ud83d\udd04 **Auto-convert** to Google Sheets with RTL support \n* \ud83d\udd0d **LinkedIn research** via Apify for recent posts (3 per candidate)\n* \ud83e\udd16 **AI evaluation** with GPT-4.1 scoring (0-100) + Hebrew explanations\n* \ud83d\udcca **Auto-formatting** with filters, sorting by score, and professional styling\n* \u26a0\ufe0f **Error handling** with email alerts to admin\n\n## Quick Setup\n1. Connect Google Drive/Sheets credentials\n2. Add OpenAI API key (GPT-4.1)\n3. Add Apify API key for LinkedIn\n4. Configure Gmail for error alerts\n5. Test & activate! \ud83d\ude80\n\n## Cost per candidate: ~$0.05\n## Time saved: 15-20 minutes per candidate"
},
"typeVersion": 1
},
{
"id": "2d8d6034-1b1c-47bb-a7db-9a44c5934187",
"name": "Merge1",
"type": "n8n-nodes-base.merge",
"position": [
1392,
64
],
"parameters": {
"mode": "combine",
"options": {
"includeUnpaired": true
},
"combineBy": "combineByPosition"
},
"typeVersion": 3.1
},
{
"id": "fa223575-a5bc-4bc5-8a49-a01109c932de",
"name": "GPT-4.1",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
208,
608
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1",
"cachedResultName": "gpt-4.1"
},
"options": {}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "dc438c8c-e6f7-45d1-bbad-90ddfe155251",
"name": "Send a message",
"type": "n8n-nodes-base.gmail",
"position": [
2080,
416
],
"parameters": {
"sendTo": "user@example.com",
"message": "=Please check out the workflow in order to be able to configure it.\nError accured in {{ $now.format('dd/MM/yyyy HH:mm') }}\n",
"options": {},
"subject": "Error in WF - \"Ben - 1st Project\"",
"emailType": "text"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "0169300f-eb55-47fc-942b-64f63fd28415",
"name": "Error Trigger",
"type": "n8n-nodes-base.errorTrigger",
"position": [
1872,
416
],
"parameters": {},
"typeVersion": 1
},
{
"id": "b5d5d85e-138c-4332-a91a-eec635907d5a",
"name": "Sticky Note14",
"type": "n8n-nodes-base.stickyNote",
"position": [
1840,
336
],
"parameters": {
"color": 3,
"width": 708,
"height": 440,
"content": "# Error Trigger"
},
"typeVersion": 1
}
],
"connections": {
"Merge": {
"main": [
[
{
"node": "Switch",
"type": "main",
"index": 0
}
]
]
},
"Merge1": {
"main": [
[
{
"node": "Convert to Google Sheet",
"type": "main",
"index": 0
}
]
]
},
"Switch": {
"main": [
[
{
"node": "Extract from CSV",
"type": "main",
"index": 0
}
],
[
{
"node": "Extract from XLSX",
"type": "main",
"index": 0
}
]
]
},
"GPT-4.1": {
"ai_languageModel": [
[
{
"node": "AI Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"AI Agent": {
"main": [
[
{
"node": "Prepare for Formatting",
"type": "main",
"index": 0
}
]
]
},
"Read Sheet": {
"main": [
[
{
"node": "AI Agent",
"type": "main",
"index": 0
}
]
]
},
"Add Columns": {
"main": [
[
{
"node": "Read Sheet",
"type": "main",
"index": 0
}
]
]
},
"Upload file": {
"main": [
[
{
"node": "Download file",
"type": "main",
"index": 0
}
]
]
},
"Download file": {
"main": [
[
{
"node": "Create Google Sheet",
"type": "main",
"index": 0
},
{
"node": "No Operation, do nothing",
"type": "main",
"index": 0
}
]
]
},
"Error Trigger": {
"main": [
[
{
"node": "Send a message",
"type": "main",
"index": 0
}
]
]
},
"Get First Row": {
"main": [
[
{
"node": "Apply Formatting",
"type": "main",
"index": 0
}
]
]
},
"Format Columns": {
"main": [
[
{
"node": "Format Columns1",
"type": "main",
"index": 0
}
]
]
},
"Format Columns1": {
"main": [
[
{
"node": "Add Columns",
"type": "main",
"index": 0
}
]
]
},
"Get Rid of File": {
"main": [
[
{
"node": "Format Columns",
"type": "main",
"index": 0
}
]
]
},
"Extract from CSV": {
"main": [
[
{
"node": "Merge1",
"type": "main",
"index": 0
}
]
]
},
"Extract from XLSX": {
"main": [
[
{
"node": "Merge1",
"type": "main",
"index": 1
}
]
]
},
"On form submission": {
"main": [
[
{
"node": "Upload file",
"type": "main",
"index": 0
}
]
]
},
"Create Google Sheet": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 0
}
]
]
},
"Run an Actor in Apify": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Prepare for Formatting": {
"main": [
[
{
"node": "Get First Row",
"type": "main",
"index": 0
}
]
]
},
"Convert to Google Sheet": {
"main": [
[
{
"node": "Get Rid of File",
"type": "main",
"index": 0
}
]
]
},
"No Operation, do nothing": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 1
}
]
]
},
"Structured Output Parser1": {
"ai_outputParser": [
[
{
"node": "AI Agent",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Get dataset items in Apify": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Update row in sheet in Google Sheets1": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"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.
apifyApigmailOAuth2googleDriveOAuth2ApigoogleSheetsOAuth2ApiopenAiApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Transform your manual hiring process into an intelligent evaluation system that saves 15-20 minutes per candidate! This workflow automates the entire candidate assessment pipeline - from CSV/XLSX upload to AI-powered scoring with LinkedIn insights.
Source: https://n8n.io/workflows/8775/ — 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.
🎯 Create viral TikToks, Shorts, Reels, podcasts, and ASMR videos in minutes — all on autopilot.
Generate AI viral videos with NanoBanana & VEO3, shared on socials via Blotato 2. Uses @blotato/n8n-nodes-blotato, googleSheets, lmChatOpenAi, toolThink. Event-driven trigger; 94 nodes.
This template is designed for marketers, content creators, and e-commerce brands who want to automate the creation of professional ad videos at scale. It’s ideal for teams looking to generate consiste
This comprehensive n8n workflow automates the entire Meta (Facebook/Instagram) advertising process, from asset analysis to ad creation. It combines AI-powered content analysis with automated ad deploy
This automation is designed to help you generate AI-powered music tracks, cover art, and fully rendered music videos — all triggered from a simple Telegram chat and managed via Google Sheets.