AutomationFlowsAI & RAG › Automate Job Search with Linkedin, Google Sheets & AI

Automate Job Search with Linkedin, Google Sheets & AI

ByJugal @jugaldb on n8n.io

When I was applying for roles, I learned the hard way that a one-size-fits-all resume never wins. I obsessively tailored my resume for each posting, reflecting the exact scope, impact, and stack the team cared about. That’s when the callbacks really started landing from places…

Cron / scheduled trigger★★★★☆ complexityAI-powered27 nodesGoogle DriveGoogle SheetsHTTP RequestAgentGoogle Gemini ChatGmail
AI & RAG Trigger: Cron / scheduled Nodes: 27 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #9602 — 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 →

Download .json
{
  "id": "SrQYoBJKHtuSzi6B",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "My workflow",
  "tags": [],
  "nodes": [
    {
      "id": "9dd871da-bb3b-4ebe-963b-128fcff34099",
      "name": "Download file",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        208,
        0
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "url",
          "value": ""
        },
        "options": {},
        "operation": "download"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "6bdbd596-b061-427a-b97c-e789fe7090a4",
      "name": "Extract from File",
      "type": "n8n-nodes-base.extractFromFile",
      "position": [
        416,
        0
      ],
      "parameters": {
        "options": {},
        "operation": "pdf"
      },
      "typeVersion": 1
    },
    {
      "id": "484e0f62-0d1a-4637-8b58-4942d6d0a4e0",
      "name": "Get row(s) in sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        624,
        0
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1m_p1yu6j10cuHK-bImqz86Oraegz5j9ii2u5LJqxg1g/edit#gid=0",
          "cachedResultName": "Filter"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1m_p1yu6j10cuHK-bImqz86Oraegz5j9ii2u5LJqxg1g",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1m_p1yu6j10cuHK-bImqz86Oraegz5j9ii2u5LJqxg1g/edit?usp=drivesdk",
          "cachedResultName": "Job Search N8N"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "c4bc1e36-3acb-4637-a867-085a3079eb14",
      "name": "LinkedIn Search URL",
      "type": "n8n-nodes-base.code",
      "position": [
        832,
        0
      ],
      "parameters": {
        "jsCode": "let url = \"https://www.linkedin.com/jobs/search/?f_TPR=r86400\"\n\nconst keyword = $input.first().json.Keyword\nconst location = $input.first().json.Location\nconst experienceLevel = $input.first().json['Experience Level']\nconst remote = $input.first().json.Remote\nconst easyApply = $input.first().json['Easy Apply']\n\nif (keyword != \"\") {\n  url += `&keywords=${keyword}`;\n}\n\nif (location != \"\") {\n  url += `&location=${location}`;\n}\n\nif (experienceLevel !== \"\") {\n  // Transform experience levels to LinkedIn codes\n  // Internship -> 1, Entry level -> 2, Associate -> 3\n  // Mid-Senior level -> 4, Director -> 5, Executive -> 6\n  const transformedExperiences = experienceLevel\n    .split(\",\")\n    .map((exp) => {\n      switch (exp.trim()) {\n        case \"Internship\": return \"1\";\n        case \"Entry level\": return \"2\";\n        case \"New Grad\": return \"3\";\n        default: return \"\";\n      }\n    })\n    .filter(Boolean);\n  url += `&f_E=${transformedExperiences.join(\",\")}`;\n}\n\nif (remote.length != \"\") {\n  // Transform remote options to LinkedIn codes\n  // On-Site -> 1, Remote -> 2, Hybrid -> 3\n  const transformedRemote = remote\n    .split(\",\")\n    .map((e) => {\n      switch (e.trim()) {\n        case \"Remote\": return \"2\";\n        case \"Hybrid\": return \"3\";\n        case \"On-Site\": return \"1\";\n        default: return \"\";\n      }\n    })\n    .filter(Boolean);\n  url += `&f_WT=${transformedRemote.join(\",\")}`;\n}\n\nif (easyApply != \"\") {\n  url += \"&f_EA=true\";\n}\n\nreturn {url}\n"
      },
      "typeVersion": 2
    },
    {
      "id": "dc8f887e-81e6-44bf-a356-13f61d6a0388",
      "name": "Fetch jobs from LinkedIn",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1040,
        0
      ],
      "parameters": {
        "url": "={{ $json.url }}",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "c9e59fa5-49df-47bb-89c0-87ab7845fd2f",
      "name": "HTML",
      "type": "n8n-nodes-base.html",
      "position": [
        1248,
        0
      ],
      "parameters": {
        "options": {},
        "operation": "extractHtmlContent",
        "extractionValues": {
          "values": [
            {
              "key": "jobs",
              "attribute": "href",
              "cssSelector": "ul.jobs-search__results-list li div a[class*=\"base-card\"]",
              "returnArray": true,
              "returnValue": "attribute"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "c2aec608-8302-4bcd-a00b-2e3d293b89bf",
      "name": "Split Out",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        1456,
        0
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "jobs"
      },
      "typeVersion": 1
    },
    {
      "id": "00612b80-a789-4615-9942-e62584e22fdf",
      "name": "Loop Over Items",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        1568,
        816
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "293a9da0-abfd-491c-9ee6-926fb6de30f1",
      "name": "Wait",
      "type": "n8n-nodes-base.wait",
      "position": [
        -32,
        208
      ],
      "parameters": {
        "amount": 2
      },
      "typeVersion": 1.1
    },
    {
      "id": "2f0cb178-8831-458f-9c8c-f9fbbc52abbc",
      "name": "HTTP Request",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        176,
        208
      ],
      "parameters": {
        "url": "={{ $json.jobs }}",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "33d05837-7b57-4f7d-9aa1-d79fe3e71753",
      "name": "HTML1",
      "type": "n8n-nodes-base.html",
      "position": [
        384,
        208
      ],
      "parameters": {
        "options": {},
        "operation": "extractHtmlContent",
        "extractionValues": {
          "values": [
            {
              "key": "Title",
              "cssSelector": "div h1"
            },
            {
              "key": "Company",
              "cssSelector": "div span a"
            },
            {
              "key": "Location",
              "cssSelector": "div span[class*='topcard__flavor topcard__flavor--bullet']"
            },
            {
              "key": "Description",
              "cssSelector": "div.description__text.description__text--rich"
            },
            {
              "key": "Job ID",
              "attribute": "data-semaphore-content-urn",
              "cssSelector": "a[data-item-type='semaphore']",
              "returnValue": "attribute"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "43feb566-7427-455c-9109-2a6ba56764f7",
      "name": "Edit Fields",
      "type": "n8n-nodes-base.set",
      "position": [
        592,
        208
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "240418dc-3349-48d5-ba59-3aa590d71950",
              "name": "Description",
              "type": "string",
              "value": "={{ $json.Description.replaceAll(/\\s+/g, \" \")}}"
            },
            {
              "id": "7b24938f-8b47-488d-9f65-54d036dcffd5",
              "name": "Job ID",
              "type": "string",
              "value": "={{ $json['Job ID'].split(\":\").last() }}"
            },
            {
              "id": "d6addada-9e01-464f-a768-c19f6224c491",
              "name": "Apply Link",
              "type": "string",
              "value": "={{ \"https://www.linkedin.com/jobs/view/\"+ $json['Job ID'].split(\":\").last()  }}"
            },
            {
              "id": "21c89d3a-c8b6-44eb-9719-9ae5716a7c76",
              "name": "Title",
              "type": "string",
              "value": "={{ $json.Title }}"
            },
            {
              "id": "da713845-9a81-486e-bff2-1613105e424d",
              "name": "Company",
              "type": "string",
              "value": "={{ $json.Company }}"
            },
            {
              "id": "1a9a31dd-8d51-4f35-b6b6-ca8a348de5d7",
              "name": "Location",
              "type": "string",
              "value": "={{ $json.Location }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "8d9894bd-66fe-4069-aff0-84d351b8b5b4",
      "name": "AI Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        32,
        464
      ],
      "parameters": {
        "text": "=You are a precise job-matching assistant.\n\nReturn ONE JSON object wrapped in ```json fences, followed by the line END_OF_JSON.\nNo extra prose. No Markdown inside the JSON. No comments.\n\nINPUTS\njob_description: {{ $json.Description }}\nmy_resume: {{ $('Extract from File').item.json.text }}\n\nTASKS\n1) Parse job_description \u2192 job_analysis with keys:\n   title (string), company (string), must_have_skills (string[]), nice_to_have_skills (string[]),\n   responsibilities (string[]), years_of_experience (string), education_certifications (string),\n   location_constraints (string), domain_industry_focus (string), tech_stack (string[]), measurable_kpis (string[])\n\n2) Parse my_resume \u2192 resume_analysis:\n   core_skills (string[]),\n   tools_tech { programming_languages[], frontend_technologies[], backend_technologies[], databases_devops[] },\n   years_of_experience_key_areas (object of short strings),\n   accomplishments_with_metrics (string[]),\n   education_certs (string[]), domains (string[]), roles_titles (string[]),\n   leadership_collaboration (string[]), location_work_auth (string)\n\n3) Scoring (integer 0\u2013100):\n   - Skills/Tools overlap: 40\n   - Relevant experience & seniority: 25\n   - Responsibilities alignment: 15\n   - Education/Certs fit: 10\n   - Domain/industry fit: 5\n   - Logistics (location/work auth/availability): 5\n   Allow partial credit; deduct up to 10 via red_flags. Clamp to [0,100], integer.\n\n4) Explain the score:\n   For each bucket, provide 1\u20133 concise evidence bullets. Cite \"JD\" or \"Resume\" and include short quoted fragments (escape quotes).\n\n5) Gaps & Suggestions:\n   List missing/weak requirements with 1\u20132 concrete upskilling steps per gap.\n\n6) Cover letter:\n   150\u2013220 words (2\u20134 short paragraphs), tailored to the role/company.\n   Concrete impacts; no greeting/signature. JSON-safe: escape all \" as \\\", use \\n for newlines.\n\nSTRICT CONTENT RULES (to prevent invalid JSON)\n- Do NOT paste raw paragraphs, markdown (**bold**, lists), headings, or multi-line blocks into any array fields.\n- Every array element must be a short phrase (\u2264 140 characters), single line, no line breaks, no asterisks, no bullets.\n- If a JD section is long, summarize into short phrases before placing into arrays.\n- Do NOT include unrelated job text inside arrays or objects. Keep each value semantically atomic.\n- Never invent company/title; use \"\" if unknown.\n- No trailing commas anywhere.\n\nSTRICT OUTPUT RULES\n- Output exactly the following schema (keys and types). No extra keys.\n\nSCHEMA\n```json\n{\n  \"job_analysis\": {\n    \"title\": \"\",\n    \"company\": \"\",\n    \"must_have_skills\": [],\n    \"nice_to_have_skills\": [],\n    \"responsibilities\": [],\n    \"years_of_experience\": \"\",\n    \"education_certifications\": \"\",\n    \"location_constraints\": \"\",\n    \"domain_industry_focus\": \"\",\n    \"tech_stack\": [],\n    \"measurable_kpis\": []\n  },\n  \"resume_analysis\": {\n    \"core_skills\": [],\n    \"tools_tech\": {\n      \"programming_languages\": [],\n      \"frontend_technologies\": [],\n      \"backend_technologies\": [],\n      \"databases_devops\": []\n    },\n    \"years_of_experience_key_areas\": {},\n    \"accomplishments_with_metrics\": [],\n    \"education_certs\": [],\n    \"domains\": [],\n    \"roles_titles\": [],\n    \"leadership_collaboration\": [],\n    \"location_work_auth\": \"\"\n  },\n  \"match_score\": 0,\n  \"score_explanation\": [\n    { \"category\": \"Skills/Tools overlap (40 points)\", \"score\": 0, \"evidence\": [] },\n    { \"category\": \"Relevant experience depth & seniority (25 points)\", \"score\": 0, \"evidence\": [] },\n    { \"category\": \"Responsibilities alignment (15 points)\", \"score\": 0, \"evidence\": [] },\n    { \"category\": \"Education/Certs fit (10 points)\", \"score\": 0, \"evidence\": [] },\n    { \"category\": \"Domain/industry fit (5 points)\", \"score\": 0, \"evidence\": [] },\n    { \"category\": \"Logistics (location, work auth, availability) (5 points)\", \"score\": 0, \"evidence\": [] }\n  ],\n  \"red_flags\": [],\n  \"gaps_and_suggestions\": [\n    { \"gap\": \"\", \"suggestion\": \"\" }\n  ],\n  \"cover_letter\": \"\"\n}\n",
        "options": {},
        "promptType": "define"
      },
      "typeVersion": 2.2
    },
    {
      "id": "cc137b01-1f25-4ba5-955d-6fb7f947bcd6",
      "name": "Google Gemini Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        32,
        640
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "4ef714a7-1e5d-4c45-b1fd-d961592ec459",
      "name": "Edit Fields1",
      "type": "n8n-nodes-base.set",
      "position": [
        432,
        656
      ],
      "parameters": {
        "mode": "raw",
        "options": {},
        "jsonOutput": "={{ (() => {\n  // 0) Read model output from AI Agent node\n  const raw = String(($('AI Agent').item.json.output ?? ''));\n\n  // 1) Strip code fences\n  let s = raw\n    .replace(/`{2,3}(?:json)?\\s*/gi, '')\n    .replace(/\\s*`{3}\\s*$/gi, '');\n\n  // 1b) Normalize curly quotes (Gemini sometimes emits them)\n  s = s.replace(/[\\u201C\\u201D]/g, '\"').replace(/\\u2019/g, \"'\");\n\n  // 2) Cut at END_OF_JSON if present\n  const endIdx = s.indexOf('END_OF_JSON');\n  if (endIdx !== -1) s = s.slice(0, endIdx);\n\n  // 3) Extract first complete { ... } by brace counting\n  const start = s.indexOf('{');\n  if (start < 0) return {};\n  let depth = 0, inStr = false, esc = false, end = -1;\n  for (let i = start; i < s.length; i++) {\n    const ch = s[i];\n    if (inStr) {\n      if (esc) { esc = false; }\n      else if (ch === '\\\\') { esc = true; }\n      else if (ch === '\"') { inStr = false; }\n    } else {\n      if (ch === '\"') inStr = true;\n      else if (ch === '{') depth++;\n      else if (ch === '}') { depth--; if (depth === 0) { end = i + 1; break; } }\n    }\n  }\n  if (end < 0) return {};\n\n  const cleaned = s.slice(start, end).trim();\n\n  try {\n    return JSON.parse(cleaned);   // JSON mode expects an OBJECT\n  } catch (e) {\n    // As a last resort, return an empty object to keep the run alive\n    return {};\n  }\n})() }}\n"
      },
      "typeVersion": 3.4
    },
    {
      "id": "b4795633-1f39-4d56-b19d-d2837d987d89",
      "name": "AI Agent1",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        736,
        656
      ],
      "parameters": {
        "text": "You are a ruthless resume editor. Compare the inputs and output ONLY crisp, point-wise changes to improve job fit.\n\nInputs:\n- job_description: {{ $json.Description }}\n- my_resume: {{ $('Extract from File').item.json.text }}\n\nInstructions:\n- Output a numbered list; highest-impact first.\n- One line per point; <= 14 words.\n- Start each line with a tag: [ADD], [REMOVE], [REWRITE], [ORDER], [QUANTIFY], [KEYWORDS], [FORMAT], [FOCUS].\n- Base every point on gaps vs. the job_description; do not invent experience.\n- Prefer concrete actions: skills to add, bullets to rewrite, sections to reorder/remove.\n- Include one line: 'Missing keywords: term1, term2, ...' (only if any).\n- No intros, explanations, code fences, or extra text - points only.\n\nOutput: points only, exactly as specified above.",
        "options": {},
        "promptType": "define"
      },
      "typeVersion": 2.2
    },
    {
      "id": "5e3518b8-e203-45ba-9d02-356edf668c0c",
      "name": "Google Gemini Chat Model1",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        736,
        816
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "ca1e037d-bb59-455c-8738-f1e1ce89f2b4",
      "name": "Append or update row in sheet1",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1072,
        656
      ],
      "parameters": {
        "columns": {
          "value": {
            "Link": "={{ $('Edit Fields').item.json['Apply Link'] }}",
            "Score": "={{ $('Edit Fields1').item.json.match_score }}",
            "Title": "={{ $('Edit Fields').item.json.Title }}",
            "Skills": "={{ $('Edit Fields1').item.json.resume_analysis.core_skills }}",
            "Locaton": "={{ $('Edit Fields').item.json.Location }}",
            "Company ": "={{ $('Edit Fields').item.json.Company }}",
            "Cover Letter": "={{ $('Edit Fields1').item.json.cover_letter }}",
            "Improvements": "={{ $json.output }}"
          },
          "schema": [
            {
              "id": "Title",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Title",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Company ",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Company ",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Locaton",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Locaton",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Link",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Link",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Score",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Score",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Cover Letter",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Cover Letter",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Skills",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Skills",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Improvements",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Improvements",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Link"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 11035642,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1m_p1yu6j10cuHK-bImqz86Oraegz5j9ii2u5LJqxg1g/edit#gid=11035642",
          "cachedResultName": "Result"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1m_p1yu6j10cuHK-bImqz86Oraegz5j9ii2u5LJqxg1g",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1m_p1yu6j10cuHK-bImqz86Oraegz5j9ii2u5LJqxg1g/edit?usp=drivesdk",
          "cachedResultName": "Job Search N8N"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "d2b5241e-c511-42c9-8301-e75c1b5c22c9",
      "name": "Send a message",
      "type": "n8n-nodes-base.gmail",
      "position": [
        1984,
        800
      ],
      "parameters": {
        "sendTo": "<your e-mail address>",
        "message": "Hey, your job search results with resume changes are ready in your sheet for today",
        "options": {},
        "subject": "Job search results",
        "emailType": "text"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "9100d62e-1108-4ba2-b6dd-91576b1c015b",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        112,
        -240
      ],
      "parameters": {
        "height": 192,
        "content": "## Add Google Cloud Credentials\n\n1. sign in with google\n2. Upload your resume and change to anyone can view\n3. Paste your link\n"
      },
      "typeVersion": 1
    },
    {
      "id": "ff1c1aad-5ab0-49c3-805a-092e1e371985",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        576,
        -224
      ],
      "parameters": {
        "height": 176,
        "content": "## Add Google Cloud Credentials\n\n1. sign in with google\n2. Prepare your sheet filter\n3. Add your sheet Link"
      },
      "typeVersion": 1
    },
    {
      "id": "9d6df7e1-3a16-483b-add7-9d0e2fc95498",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1904,
        592
      ],
      "parameters": {
        "content": "## Add Google Cloud Credentials\n\n- sign in with google\n- Enter your e-mail address"
      },
      "typeVersion": 1
    },
    {
      "id": "986e4584-7f86-4a56-97d4-f6a09835808e",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1008,
        448
      ],
      "parameters": {
        "height": 176,
        "content": "## Add Google Cloud Credentials\n\n1. sign in with google\n2. Select your sheet and sub sheet"
      },
      "typeVersion": 1
    },
    {
      "id": "b4e4313d-e9e1-4e81-a613-de7de233eec1",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -16,
        784
      ],
      "parameters": {
        "height": 176,
        "content": "## Add Gemini Free tier api key\n\n1. sign in with google\n2. Create API key and project\n3. Add Free Tier key"
      },
      "typeVersion": 1
    },
    {
      "id": "65c1327d-e61b-47ee-bd55-8ddf43c58cd8",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        640,
        464
      ],
      "parameters": {
        "height": 176,
        "content": "## Add Gemini Free tier api key\n\n1. sign in with google\n2. Create API key and project\n3. Add Free Tier key"
      },
      "typeVersion": 1
    },
    {
      "id": "94653150-71a5-411b-bed3-a0771b9fef44",
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -48,
        0
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 5
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "c28849bf-1393-41d1-88e7-aa2d1c8c3c8c",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        640,
        -624
      ],
      "parameters": {
        "height": 320,
        "content": "# Job search ultimate workflow - @jugaldb\n\n1. Takes about 1 hour to run\n2. Finds all relevant jobs posted in last one day, runs at 5 AM everyday\n3. Sends you an e-mail whne complete"
      },
      "typeVersion": 1
    }
  ],
  "active": true,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "25e5c7d3-60ea-47bf-b4bc-cb62a22a3ad7",
  "connections": {
    "HTML": {
      "main": [
        [
          {
            "node": "Split Out",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait": {
      "main": [
        [
          {
            "node": "HTTP Request",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTML1": {
      "main": [
        [
          {
            "node": "Edit Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent": {
      "main": [
        [
          {
            "node": "Edit Fields1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent1": {
      "main": [
        [
          {
            "node": "Append or update row in sheet1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split Out": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields": {
      "main": [
        [
          {
            "node": "AI Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields1": {
      "main": [
        [
          {
            "node": "AI Agent1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request": {
      "main": [
        [
          {
            "node": "HTML1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Download file": {
      "main": [
        [
          {
            "node": "Extract from File",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Items": {
      "main": [
        [
          {
            "node": "Send a message",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Wait",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Download file",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract from File": {
      "main": [
        [
          {
            "node": "Get row(s) in sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get row(s) in sheet": {
      "main": [
        [
          {
            "node": "LinkedIn Search URL",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "LinkedIn Search URL": {
      "main": [
        [
          {
            "node": "Fetch jobs from LinkedIn",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch jobs from LinkedIn": {
      "main": [
        [
          {
            "node": "HTML",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Gemini Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Google Gemini Chat Model1": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent1",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Append or update row in sheet1": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "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.

Pro

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

About this workflow

When I was applying for roles, I learned the hard way that a one-size-fits-all resume never wins. I obsessively tailored my resume for each posting, reflecting the exact scope, impact, and stack the team cared about. That’s when the callbacks really started landing from places…

Source: https://n8n.io/workflows/9602/ — 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

The Multi-Model Agency Content Engine is a high-performance editorial system designed for agencies. It solves the "blank page" problem by alternating between real-world social proof and strategic expe

Google Sheets, Gmail, Google Drive +6
AI & RAG

This workflow helps you find and evaluate job opportunities automatically, without spending hours searching and comparing roles. It uses your resume to look for relevant jobs on LinkedIn, checks how w

Google Drive, HTTP Request, Google Gemini Chat +3
AI & RAG

LinkedIn_Job_Hunt_and_Cover_Letter. Uses outputParserStructured, outputParserAutofixing, googleDrive, agent. Scheduled trigger; 85 nodes.

Output Parser Structured, Output Parser Autofixing, Google Drive +6
AI & RAG

This n8n automation workflow automates the creation, scripting, production, and posting of YouTube videos. It leverages AI (OpenAI), image generation (PIAPI), video rendering (Shotstack), and platform

Agent, OpenAI Chat, Airtable Tool +7
AI & RAG

This workflow automates the creation, rendering, approval, and posting of TikTok-style POV (Point of View) videos to Instagram, with cross-posting to Facebook and YouTube. It eliminates manual video p

OpenAI Chat, Output Parser Item List, HTTP Request +10