AutomationFlowsAI & RAG › Generate Tailored Cv and Cover Letter From Job Links

Generate Tailored Cv and Cover Letter From Job Links

ByDhaval Variya @dhv9545 on n8n.io

How it works This Workflow automatically creates a new CV and Cover Letter based on the job description and your Current CV.

Webhook trigger★★★★☆ complexityAI-powered27 nodesAgentGoogle SheetsHTTP RequestOpenRouter ChatRead Write FileGoogle Docs
AI & RAG Trigger: Webhook Nodes: 27 Complexity: ★★★★☆ AI nodes: yes Added:
Generate Tailored Cv and Cover Letter From Job Links — n8n workflow card showing Agent, Google Sheets, HTTP Request integration

This workflow corresponds to n8n.io template #15255 — we link there as the canonical source.

This workflow follows the Agent → Google Docs 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": "aUXSrNxYvScKFS5z",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "My workflow",
  "tags": [],
  "nodes": [
    {
      "id": "edd1bd7b-718c-495c-8eca-f3785f1e25ab",
      "name": "Merge",
      "type": "n8n-nodes-base.merge",
      "position": [
        928,
        32
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineAll"
      },
      "typeVersion": 3.2
    },
    {
      "id": "85a2dc12-2007-442a-8401-5eb9cd412ce5",
      "name": "CoverLetter Writer",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        1184,
        -192
      ],
      "parameters": {
        "text": "=### ROLE\nYou are an expert Career Coach and Technical Copywriter specializing in high-conversion cover letters. Your goal is to bridge the gap between a candidate's specific achievements and a company's unique needs.\n\n### CONTEXT\n1. Job Description:\n{{ $(Merge).item.json.output }}\n\n2. Candidate Resume:\n{{ $(Merge).item.json.text }}\n\n### TASK\nWrite a bespoke, compelling cover letter that does not simply repeat the resume but tells a story of how the candidate's past success will solve the employer's future problems.\n\n### GUIDELINES\n- **Tone:** Professional yet authentic and energetic. Avoid \"corporate speak\" or \"I am writing to apply for...\" clich\u00e9s.\n- **The Hook:** Start with a strong opening statement that demonstrates immediate value or passion for the company\u2019s mission.\n- **Evidence-Based:** Select the top 2-3 achievements from the resume that directly map to the \"Must-Haves\" in the job description. Use metrics where available.\n- **Cultural Fit:** Analyze the tone of the job description (e.g., startup vs. corporate) and mirror that language style.\n- **Call to Action:** End with a confident closing that invites a conversation.\n\n### CONSTRAINTS\n- Length: Maximum 300 words.\n- Format: Use standard professional letter formatting.\n- No Hallucinations: Do not invent skills or experiences not found in the resume.\n- Output: Return ONLY the text of the cover letter.",
        "options": {},
        "promptType": "define"
      },
      "typeVersion": 3.1
    },
    {
      "id": "a15970d4-160f-438c-9f49-f6fcdb6b8862",
      "name": "CV Writer",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        1200,
        208
      ],
      "parameters": {
        "text": "=### ROLE\nYou are a Professional Resume Writer and Applicant Tracking System (ATS) Optimization Expert. Your goal is to rewrite a candidate's CV to make it a perfect 95%+ match for a specific job description.\n\n### INPUT DATA\n- **Target Job Description:** {{ $(Merge).item.json.output }}\n- **Current CV Data:** {{ $(Merge).item.json.text }}\n\n### OBJECTIVE\nGenerate a tailored version of the CV that highlights the most relevant skills and experiences while maintaining 100% honesty.\n\n### GUIDELINES & STRATEGY\n1. **Keyword Optimization:** Identify the top 10 hard skills and tools mentioned in the Job Description. Ensure these are naturally integrated into the \"Skills\" section and \"Professional Experience.\"\n2. **Contextual Bullet Points:** Rewrite existing bullet points to lead with the results most relevant to the job. (e.g., If the job emphasizes Linux, move Linux-related achievements to the top of each role).\n3. **Action Verbs:** Use strong action verbs (e.g., \"Engineered,\" \"Optimized,\" \"Orchestrated\") that match the seniority level of the job.\n4. **Quantification:** Where the resume provides numbers (%, $, time), keep them. If a result is vague, refine the phrasing to sound more impactful without inventing data.\n5. **Format:** Keep a clean, professional reverse-chronological structure.\n\n### CONSTRAINTS\n- **No Hallucinations:** Do not add certifications, degrees, or job titles that are not in the Current CV.\n- **Tone:** Sharp, professional, and achievement-oriented.\n- **Output:** Return ONLY the rewritten CV text. Do not include introductory remarks or \"Here is your tailored CV.\"",
        "options": {},
        "promptType": "define"
      },
      "typeVersion": 3.1
    },
    {
      "id": "1b1fb223-c497-4ee3-a152-f140ee80b91d",
      "name": "Merge1",
      "type": "n8n-nodes-base.merge",
      "position": [
        1776,
        432
      ],
      "parameters": {
        "numberInputs": 4
      },
      "typeVersion": 3.2
    },
    {
      "id": "1af8a276-b9ed-4e98-b49c-b35340fe0cf0",
      "name": "Trigger by google sheet",
      "type": "n8n-nodes-base.webhook",
      "position": [
        -512,
        -176
      ],
      "parameters": {
        "path": "3d23f43d-9d38-45ba-9ad1-b696a2b97905",
        "options": {},
        "httpMethod": "POST"
      },
      "typeVersion": 2.1
    },
    {
      "id": "7cf84bf8-5fc1-49a3-93df-23c326726f78",
      "name": "Get data from google sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -288,
        -176
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1BfLK1tK82DvMu1fK8mVig5u2-Sk-u4IfmWXcMWz_eUM/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1BfLK1tK82DvMu1fK8mVig5u2-Sk-u4IfmWXcMWz_eUM",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1BfLK1tK82DvMu1fK8mVig5u2-Sk-u4IfmWXcMWz_eUM/edit?usp=drivesdk",
          "cachedResultName": "Job IDs"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7,
      "alwaysOutputData": false
    },
    {
      "id": "ac3edea6-4fcf-47ec-9fb2-334effc73fa5",
      "name": "Loop Over Job ID/Link",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        -80,
        -176
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "34fddc34-1de7-4218-bf0f-d9b71f2b2235",
      "name": "If CV & Cover Letter not created",
      "type": "n8n-nodes-base.if",
      "position": [
        144,
        -160
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "fb0a2503-5ebc-4221-b141-b8359a156fc5",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ $json.JobLink }}",
              "rightValue": 0
            },
            {
              "id": "9e674de7-d429-4920-8ab4-ccc5a3f6b3c6",
              "operator": {
                "type": "string",
                "operation": "empty",
                "singleValue": true
              },
              "leftValue": "={{ $json.CoverLetter }}",
              "rightValue": ""
            },
            {
              "id": "095f24ed-8c9c-42b7-8bda-7fde35a15d06",
              "operator": {
                "type": "string",
                "operation": "empty",
                "singleValue": true
              },
              "leftValue": "={{ $json.CV }}",
              "rightValue": ""
            }
          ]
        },
        "looseTypeValidation": true
      },
      "typeVersion": 2.3
    },
    {
      "id": "3eea3982-e097-43d3-a8d2-090c256f51cc",
      "name": "Get Web Data from Job Site",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        432,
        -176
      ],
      "parameters": {
        "url": "={{ $json.JobLink }}",
        "options": {},
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "linkedInOAuth2Api"
      },
      "credentials": {
        "linkedInOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.4
    },
    {
      "id": "8cfa534e-5d90-4cb1-b171-46e8d58324bc",
      "name": "Free AI Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "position": [
        608,
        0
      ],
      "parameters": {
        "model": "openai/gpt-oss-120b:free",
        "options": {}
      },
      "credentials": {
        "openRouterApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "f03ad136-0d55-4fc7-8e4d-10fd0b1264bd",
      "name": "Extract Job Data from Job Site",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        608,
        -176
      ],
      "parameters": {
        "text": "=You're an intelligent bot capable of pulling out data from a job listing site.\n\nHere's job site: {{ $json.data }}\n\nPlease output the data in JSON format, using the following structure:\n{\n  \"job_description\": \"\"\n}",
        "options": {},
        "promptType": "define"
      },
      "typeVersion": 3.1,
      "alwaysOutputData": false
    },
    {
      "id": "e32e2ea2-66d0-403a-b757-e5dd740b000c",
      "name": "Read CV from Disk",
      "type": "n8n-nodes-base.readWriteFile",
      "position": [
        480,
        192
      ],
      "parameters": {
        "options": {},
        "fileSelector": "C:\\Users\\variy\\.n8n-files\\Lebenslauf.pdf"
      },
      "typeVersion": 1.1
    },
    {
      "id": "3d34df89-25bd-4a92-967c-ff95456e70e9",
      "name": "Extract Data From CV",
      "type": "n8n-nodes-base.extractFromFile",
      "position": [
        672,
        192
      ],
      "parameters": {
        "options": {},
        "operation": "pdf"
      },
      "typeVersion": 1.1
    },
    {
      "id": "af6786f2-4612-4461-98d4-6323dde80030",
      "name": "Free AI Model1",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "position": [
        1184,
        -16
      ],
      "parameters": {
        "model": "openai/gpt-oss-120b:free",
        "options": {}
      },
      "credentials": {
        "openRouterApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "ffc157fe-10fc-42c3-b5b1-205451449dc5",
      "name": "Free AI Model2",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "position": [
        1200,
        384
      ],
      "parameters": {
        "model": "openai/gpt-oss-120b:free",
        "options": {}
      },
      "credentials": {
        "openRouterApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "c1857c87-bd1d-4262-a4a6-c72f1a16a32f",
      "name": "Write Cover Letter",
      "type": "n8n-nodes-base.googleDocs",
      "position": [
        1520,
        -288
      ],
      "parameters": {
        "actionsUi": {
          "actionFields": [
            {
              "text": "={{ $json.output }}",
              "action": "insert"
            }
          ]
        },
        "operation": "update",
        "documentURL": "1b17rYvIAr6l38pLUWCflINQOzpoCkaYahNpDInxDvkM"
      },
      "credentials": {
        "googleDocsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "0f2fb648-1c97-4de3-8413-3c851141f493",
      "name": "Append Cover Letter in sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1520,
        -32
      ],
      "parameters": {
        "columns": {
          "value": {
            "JobLink": "={{ $('If CV & Cover Letter not created').item.json.JobLink }}",
            "CoverLetter": "={{ $('CoverLetter Writer').item.json.output }}"
          },
          "schema": [
            {
              "id": "JobLink",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "JobLink",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Status",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "CoverLetter",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "CoverLetter",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "CV",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "CV",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "JobLink"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1BfLK1tK82DvMu1fK8mVig5u2-Sk-u4IfmWXcMWz_eUM/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1BfLK1tK82DvMu1fK8mVig5u2-Sk-u4IfmWXcMWz_eUM",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1BfLK1tK82DvMu1fK8mVig5u2-Sk-u4IfmWXcMWz_eUM/edit?usp=drivesdk",
          "cachedResultName": "Job IDs"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "985ba59b-33d0-4715-acbb-574272190331",
      "name": "Append CV in sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1520,
        208
      ],
      "parameters": {
        "columns": {
          "value": {
            "CV": "={{ $json.output }}",
            "JobLink": "={{ $('If CV & Cover Letter not created').item.json.JobLink }}"
          },
          "schema": [
            {
              "id": "JobLink",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "JobLink",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Status",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "CoverLetter",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "CoverLetter",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "CV",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "CV",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "JobLink"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1BfLK1tK82DvMu1fK8mVig5u2-Sk-u4IfmWXcMWz_eUM/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1BfLK1tK82DvMu1fK8mVig5u2-Sk-u4IfmWXcMWz_eUM",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1BfLK1tK82DvMu1fK8mVig5u2-Sk-u4IfmWXcMWz_eUM/edit?usp=drivesdk",
          "cachedResultName": "Job IDs"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "da921541-0899-466b-bb20-ba6bdf10bd6b",
      "name": "Write CV",
      "type": "n8n-nodes-base.googleDocs",
      "position": [
        1552,
        448
      ],
      "parameters": {
        "actionsUi": {
          "actionFields": [
            {
              "text": "={{ $json.output }}",
              "action": "insert"
            }
          ]
        },
        "operation": "update",
        "documentURL": "1t_sKAvNjnB_AYNUWsHfRW7FcPJ70ETspe1kmjMbpOb8"
      },
      "credentials": {
        "googleDocsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "d85da7e5-7f34-4ff3-b4b9-c5065f5bd0ec",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -640,
        48
      ],
      "parameters": {
        "color": "#9D5E15",
        "width": 496,
        "height": 480,
        "content": "## How this works\n* Everytime you add new JobLink into yout Google sheet (\"Job IDs\") this workflow will be triggered and new tailored CV and Cover Letter will be appended into Google sheet and also into Google Docs.\n\n## How to set it up\n**1 :** Create API keys for Google sheet [Link](https://console.cloud.google.com/apis), Google Docs [Link](https://console.cloud.google.com/apis) and OpenRouter [link](https://openrouter.ai/workspaces/default/keys/)\n- If you do not know how create and add API key then simply search in google and you will fild solution or write comment in my YouTube video\n\n**2 :** Create google sheet (Job IDs) and Docs (Cover Letter and CV) into your Google Drive and link them\n\n**3 :** Learn how to use Webhook node and set it up so you can trigger it when you add new JobLink into Google sheet\n\n## Constomization\n* Replace to better free/paid AI model you like\n* Edit promt to get better result\n* Feel free to change workflow to get your desired output"
      },
      "typeVersion": 1
    },
    {
      "id": "68bed006-cda7-4c06-badc-3d7982a4220d",
      "name": "Sticky Note10",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1760,
        -304
      ],
      "parameters": {
        "color": "#483FC6",
        "width": 384,
        "height": 416,
        "content": "## Video tutorial\n@[youtube](TfnEjOTBIh8)"
      },
      "typeVersion": 1
    },
    {
      "id": "21808190-8ea0-4ff7-90cc-f012ef4a4c90",
      "name": "Sticky Note11",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -640,
        -256
      ],
      "parameters": {
        "color": "#423D3D",
        "width": 496,
        "height": 272,
        "content": "## Triggered from Google sheet and get data from Google sheet"
      },
      "typeVersion": 1
    },
    {
      "id": "f5a72a70-fca3-46ee-8aae-d5c4bab4be4b",
      "name": "Sticky Note12",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -128,
        -256
      ],
      "parameters": {
        "color": "#423D3D",
        "width": 496,
        "height": 272,
        "content": "## Loop over each row from Google sheet"
      },
      "typeVersion": 1
    },
    {
      "id": "41df90e9-7965-43b9-825b-e14013de895b",
      "name": "Sticky Note13",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        384,
        128
      ],
      "parameters": {
        "color": "#423D3D",
        "width": 496,
        "height": 272,
        "content": "## Get data from your current CV"
      },
      "typeVersion": 1
    },
    {
      "id": "63dbaf8b-8c65-4044-9677-59e4d39ed3f7",
      "name": "Sticky Note14",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        384,
        -256
      ],
      "parameters": {
        "color": "#423D3D",
        "width": 496,
        "height": 368,
        "content": "## Extract data from job link"
      },
      "typeVersion": 1
    },
    {
      "id": "e7a369eb-0e0f-4eaa-81f9-2b5f7231da92",
      "name": "Sticky Note15",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1136,
        -304
      ],
      "parameters": {
        "color": "#423D3D",
        "width": 560,
        "height": 448,
        "content": "## Generate cover letter and appnd"
      },
      "typeVersion": 1
    },
    {
      "id": "23688153-d2a6-422e-a26a-73f3ac1c49d6",
      "name": "Sticky Note16",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1136,
        160
      ],
      "parameters": {
        "color": "#423D3D",
        "width": 560,
        "height": 448,
        "content": "## Generate cover letter and appnd"
      },
      "typeVersion": 1
    }
  ],
  "active": true,
  "settings": {
    "timezone": "Europe/Berlin",
    "binaryMode": "separate",
    "callerPolicy": "workflowsFromSameOwner",
    "timeSavedMode": "fixed",
    "availableInMCP": false,
    "executionOrder": "v1"
  },
  "versionId": "0f5246cd-67da-4722-ae3d-31febaba70d0",
  "connections": {
    "Merge": {
      "main": [
        [
          {
            "node": "CoverLetter Writer",
            "type": "main",
            "index": 0
          },
          {
            "node": "CV Writer",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge1": {
      "main": [
        [
          {
            "node": "Loop Over Job ID/Link",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Write CV": {
      "main": [
        [
          {
            "node": "Merge1",
            "type": "main",
            "index": 3
          }
        ]
      ]
    },
    "CV Writer": {
      "main": [
        [
          {
            "node": "Append CV in sheet",
            "type": "main",
            "index": 0
          },
          {
            "node": "Write CV",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Free AI Model": {
      "ai_languageModel": [
        [
          {
            "node": "Extract Job Data from Job Site",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Free AI Model1": {
      "ai_languageModel": [
        [
          {
            "node": "CoverLetter Writer",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Free AI Model2": {
      "ai_languageModel": [
        [
          {
            "node": "CV Writer",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Read CV from Disk": {
      "main": [
        [
          {
            "node": "Extract Data From CV",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Append CV in sheet": {
      "main": [
        [
          {
            "node": "Merge1",
            "type": "main",
            "index": 2
          }
        ]
      ]
    },
    "CoverLetter Writer": {
      "main": [
        [
          {
            "node": "Write Cover Letter",
            "type": "main",
            "index": 0
          },
          {
            "node": "Append Cover Letter in sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Write Cover Letter": {
      "main": [
        [
          {
            "node": "Merge1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Data From CV": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Loop Over Job ID/Link": {
      "main": [
        [],
        [
          {
            "node": "If CV & Cover Letter not created",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Trigger by google sheet": {
      "main": [
        [
          {
            "node": "Get data from google sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Web Data from Job Site": {
      "main": [
        [
          {
            "node": "Extract Job Data from Job Site",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get data from google sheet": {
      "main": [
        [
          {
            "node": "Loop Over Job ID/Link",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Append Cover Letter in sheet": {
      "main": [
        [
          {
            "node": "Merge1",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Extract Job Data from Job Site": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If CV & Cover Letter not created": {
      "main": [
        [
          {
            "node": "Get Web Data from Job Site",
            "type": "main",
            "index": 0
          },
          {
            "node": "Read CV from Disk",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Loop Over Job ID/Link",
            "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

How it works This Workflow automatically creates a new CV and Cover Letter based on the job description and your Current CV.

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

Transform your WhatsApp group conversations into actionable business intelligence through automated AI analysis and daily reporting. This workflow eliminates manual conversation monitoring by capturin

OpenRouter Chat, Output Parser Autofixing, Agent +6
AI & RAG

This suite automates distinct aspects of real estate operations: incoming web lead qualification, scheduled/manual data research and content generation, and automated voice call outreach with lead qua

Agent, HTTP Request, OpenAI Chat +6
AI & RAG

This workflow turns a spreadsheet row into a fully formatted, media-rich WordPress article. It pulls the outline and brand context from Google Sheets/Docs, drafts the article with Anthropic or Gemini,

Agent, Google Sheets, Google Docs +5
AI & RAG

Hi! I'm Amanda — I create smart, useful AI automations for n8n and Make. This workflow helps you monitor how many tokens are consumed per conversation with AI Agent Tokens, and logs that usage into Go

Gmail Tool, Airtable Tool, Google Sheets +7
AI & RAG

This template is perfect for: Market Researchers tracking industry trends. Tech Teams wanting to stay updated on specific technologies (e.g., "AI", "Cybersecurity"). Content Creators looking for curat

HTTP Request, Agent, OpenRouter Chat +5