AutomationFlowsAI & RAG › Collect Linkedin Details and Generate Cv Feedback with Gemini and Google…

Collect Linkedin Details and Generate Cv Feedback with Gemini and Google…

Original n8n title: Collect Linkedin Details and Generate Cv Feedback with Gemini and Google Workspace

ByAbdullah Al Shishani @arais415 on n8n.io

This workflow helps HR teams, career coaches, and training programs collect candidate data and automatically generate CV improvement recommendations and a cover letter draft. Candidates submit their LinkedIn profile URL, contact details, and an optional CV PDF using an n8n Form.…

Event trigger★★★★☆ complexityAI-powered17 nodesForm TriggerGoogle SheetsGoogle Gemini ChatGoogle Docs ToolGoogle DriveGmailAgent
AI & RAG Trigger: Event Nodes: 17 Complexity: ★★★★☆ AI nodes: yes Added:

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

This workflow follows the Agent → Form Trigger recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "id": "VxO5b3QxnoyD0sge",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Collect LinkedIn details and generate CV feedback with n8n Forms and Gemini",
  "tags": [],
  "nodes": [
    {
      "id": "70647895-4167-456b-80c2-67657fb92def",
      "name": "On form submission",
      "type": "n8n-nodes-base.formTrigger",
      "position": [
        0,
        0
      ],
      "parameters": {
        "options": {
          "appendAttribution": false
        },
        "formTitle": "Submit Your LinkedIn Profile",
        "formFields": {
          "values": [
            {
              "fieldLabel": "LinkedIn Profile URL",
              "requiredField": true
            },
            {
              "fieldLabel": "First & Last Name",
              "placeholder": "e.g., Jane Doe",
              "requiredField": true
            },
            {
              "fieldType": "email",
              "fieldLabel": "Email Address",
              "placeholder": "e.g., user@example.com",
              "requiredField": true
            },
            {
              "fieldLabel": "Phone Number",
              "placeholder": "e.g., +962XXXXXXXXX",
              "requiredField": true
            },
            {
              "fieldType": "file",
              "fieldLabel": "Upload CV / Resume",
              "acceptFileTypes": ".pdf"
            }
          ]
        },
        "formDescription": "Add the URL to your linkedin account"
      },
      "typeVersion": 2.3
    },
    {
      "id": "635544f3-30f8-4118-8bef-912be196e799",
      "name": "Append row in sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        400,
        32
      ],
      "parameters": {
        "columns": {
          "value": {
            "#": "0",
            "Date & Time": "={{ $('On form submission').item.json.submittedAt }}",
            "Phone Number": "={{ $('On form submission').item.json['Phone Number'] }}",
            "Email Address": "={{ $('On form submission').item.json['Email Address'] }}",
            "First & Last Name": "={{ $('On form submission').item.json['First & Last Name'] }}",
            "Upload CV / Resume": "={{ $('On form submission').item.json['Upload CV / Resume'][0].filename }}",
            "LinkedIn Profile URL": "={{ $('On form submission').item.json['LinkedIn Profile URL'] }}"
          },
          "schema": [
            {
              "id": "#",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "#",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Date & Time",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Date & Time",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "LinkedIn Profile URL",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "LinkedIn Profile URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "First & Last Name",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "First & Last Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Email Address",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Email Address",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Phone Number",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Phone Number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Upload CV / Resume",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Upload CV / Resume",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "#"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1GykOoVC8l8ipf7RS-89Yr_qFWvgrTlXyj-aJW329tDE/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1GykOoVC8l8ipf7RS-89Yr_qFWvgrTlXyj-aJW329tDE",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1GykOoVC8l8ipf7RS-89Yr_qFWvgrTlXyj-aJW329tDE/edit?usp=drivesdk",
          "cachedResultName": "Submit Form Results"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "c4f4ce78-4e1f-47a2-8af9-d350643df360",
      "name": "Extract from File",
      "type": "n8n-nodes-base.extractFromFile",
      "position": [
        240,
        32
      ],
      "parameters": {
        "options": {
          "joinPages": true
        },
        "operation": "pdf",
        "binaryPropertyName": "Upload_CV___Resume"
      },
      "typeVersion": 1
    },
    {
      "id": "efa8c2b3-e45e-4917-9a3f-1733e75b49f3",
      "name": "Google Gemini Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        656,
        208
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "9e40e3f4-41e8-4eaa-ab1e-b8b1bd905c1d",
      "name": "Google_Docs",
      "type": "n8n-nodes-base.googleDocsTool",
      "position": [
        800,
        208
      ],
      "parameters": {
        "title": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Title', ``, 'string') }}",
        "folderId": "1NQ_ZMlpWXfjgpvllFsk54nHdTLs4YB2v"
      },
      "credentials": {
        "googleDocsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "a4b1e42b-30f2-46b9-88a9-82491c54936a",
      "name": "Google_Docs_Update",
      "type": "n8n-nodes-base.googleDocsTool",
      "position": [
        912,
        176
      ],
      "parameters": {
        "simple": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Simplify', ``, 'boolean') }}",
        "actionsUi": {
          "actionFields": [
            {
              "text": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('actionFields0_Text', ``, 'string') }}",
              "action": "insert"
            }
          ]
        },
        "operation": "update",
        "documentURL": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Doc_ID_or_URL', ``, 'string') }}"
      },
      "credentials": {
        "googleDocsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "cd50ff38-9306-4acb-af33-3f6e8c4e9c09",
      "name": "Google Gemini Chat Model1",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        1072,
        208
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "dc0d11e6-e63d-458d-8772-c47acb395b9c",
      "name": "Google_Docs_Title",
      "type": "n8n-nodes-base.googleDocsTool",
      "position": [
        1216,
        224
      ],
      "parameters": {
        "title": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Title', ``, 'string') }}",
        "folderId": "1NQ_ZMlpWXfjgpvllFsk54nHdTLs4YB2v"
      },
      "credentials": {
        "googleDocsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "42fb2663-37a2-4d3e-8046-39b9631365c9",
      "name": "Google_Docs_Body",
      "type": "n8n-nodes-base.googleDocsTool",
      "position": [
        1328,
        176
      ],
      "parameters": {
        "simple": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Simplify', ``, 'boolean') }}",
        "actionsUi": {
          "actionFields": [
            {
              "text": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('actionFields0_Text', ``, 'string') }}",
              "action": "insert"
            }
          ]
        },
        "operation": "update",
        "documentURL": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Doc_ID_or_URL', ``, 'string') }}"
      },
      "credentials": {
        "googleDocsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "2223d94f-ddfd-4003-9829-578c9344f0c1",
      "name": "Upload file",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        240,
        208
      ],
      "parameters": {
        "name": "={{ $json['First & Last Name'] }} - LinkedIn CV PDF",
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive"
        },
        "options": {},
        "folderId": {
          "__rl": true,
          "mode": "list",
          "value": "1NQ_ZMlpWXfjgpvllFsk54nHdTLs4YB2v",
          "cachedResultUrl": "https://drive.google.com/drive/folders/1NQ_ZMlpWXfjgpvllFsk54nHdTLs4YB2v",
          "cachedResultName": "CV Refiner & Generator"
        },
        "inputDataFieldName": "=Upload_CV___Resume"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "51f74265-4ee2-467e-ba0a-5967bdd2c1d5",
      "name": "Send a message",
      "type": "n8n-nodes-base.gmail",
      "position": [
        400,
        208
      ],
      "parameters": {
        "sendTo": "={{ $('On form submission').item.json['Email Address'] }}",
        "message": "=Hello {{ $('On form submission').item.json['First & Last Name'] }}\n\nHere is The Downloaded CV from LinkedIn Profile URL: \n{{ $json.webContentLink }}\n\nIf you do not have access please request an access and i will have it approved to share it. \n\nRegards, \nAbdullah Al Shishani",
        "options": {
          "attachmentsUi": {
            "attachmentsBinary": [
              {
                "property": "={{ $('On form submission').item.json['Upload CV / Resume'][0].filename }}"
              }
            ]
          },
          "appendAttribution": false
        },
        "subject": "={{ $json.name }}",
        "emailType": "text"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "f089a442-86ce-4792-94aa-2090b6aabd74",
      "name": "LinkedIn Analyst",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        672,
        32
      ],
      "parameters": {
        "text": "={{ $('Extract from File').item.json.text }}",
        "options": {
          "systemMessage": "=## Role\nYour are a professional linkedin analyst, the link here is for a linkedin profile text {{ $('Extract from File').item.json.text }}\n\n- Evaluate the current text, add a score out of 100%\n- Create recommendation on fixes for the CV building info to be added, and linkedin profile needed, be briefed and summarized with steps to do on fix. 3-5 lines max.\n- Add suggestions on the best CV design from canva if possible\n\nCreate a detailed information about the linkedin text, that has the basic info for a CV, that has the following information: \n\n1. First and Last Name \n2. Headline \n3. Phone Number\n4. Email \n5. Location \n6. About \n7. Experience information with details about the job as: \n- Position/Title \n- Company Name \n- Job Start Date \n- Job End Date \n- Working Period \n- Location information \n8. Education 1, 2, or more, information with details as: \n- Name of Institution \n- Degree \n- Field \n- Start Year \n- End Year \n9. Skills \n10. Languages\n\n- Analyze the information in especially for (Headline, About, Experience details) then refine it and add me all the new information, to be suitable and perfect to build a new cv that should be an ATS friendly and compliant. \n\n- Return the text back well formatted, easy to map and structured well. \n\n## Google_Docs\nAdd all the output to a google document, with a title using the {{ $('On form submission').item.json['First & Last Name'] }} - CV / Resume Recommendations\n\n## Google_Docs_Update\nAdd the output with headers and paragraph for the ouput, well formatted and structured and to be easy to read for next steps. \n\n## Google_Sheets_CV_URLs\nUppdate the URL for the created google document in the sheet2 for the CV & its data"
        },
        "promptType": "define"
      },
      "typeVersion": 3
    },
    {
      "id": "b5964d28-f59b-444b-b96b-fc7b0a1bf824",
      "name": "Recruiter / HR",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        1072,
        32
      ],
      "parameters": {
        "text": "={{ $json.output }}",
        "options": {
          "systemMessage": "=You are a professional recruiter / HR with experience more than 15 years. Build a prompt to enahance all of the data to be used by the candidate in AI models to bring all information to be added / edited on CV and Linkedin profile. \n\ncreate a cover letter text as well. using the same method above. \n\nSuggest 2 to 3 colors to be used in the CV and profile image for the candidate, make it suitable for the experience of the candidate experience, education and personality.\n\nMake it well strcutured, formatted and use simple, catchy and user-friendly wording. and avoid any jargons words. \n\nThis is very important that all the details will be summarized, briefed and suitable for linkedin recruiters. that will enhance the profile and cv. \n\n## Google_Docs_Title\nCreate and give a title for the document as  {{ $('On form submission').item.json['First & Last Name'] }} Cover Letter\n\n## Google_Docs_Body\nAdd the output with headers and paragraph with the ouput for cover letter and other data, well formatted and structured and to be easy to read for next steps. \n\n## Google_Sheets_URLs\nUppdate the URL for the created google document in the sheet2 in cover letter URL\n\n"
        },
        "promptType": "define"
      },
      "typeVersion": 3
    },
    {
      "id": "0811e554-b8b7-45f8-adf1-bc031b6d4f90",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -448,
        -80
      ],
      "parameters": {
        "width": 352,
        "height": 384,
        "content": "## Automate linkedIn-to-CV feedback \nfrom a simple form\nThis workflow collects candidate details through an n8n Form (LinkedIn URL, name, email, phone, and optional CV upload). It then stores submissions in Google Sheets, uploads the CV to Google Drive, extracts the CV text (PDF), and uses Google Gemini to generate structured CV recommendations and LinkedIn improvement notes in Google Docs. Finally, it drafts a cover letter and sends the candidate a confirmation email via Gmail with the generated output link.\n\nBest for recruiters, career coaches, HR teams, and training programs that want fast, consistent CV and LinkedIn feedback."
      },
      "typeVersion": 1
    },
    {
      "id": "a1aea0ff-5da1-4a1e-a3eb-ae488167576b",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -64,
        -80
      ],
      "parameters": {
        "color": 7,
        "width": 224,
        "height": 224,
        "content": "## Form intake"
      },
      "typeVersion": 1
    },
    {
      "id": "a0f10a8b-8084-40ff-b6f3-cb973103b494",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        192,
        -80
      ],
      "parameters": {
        "color": 7,
        "width": 384,
        "height": 448,
        "content": "## File processing, logging and delivery"
      },
      "typeVersion": 1
    },
    {
      "id": "09938ab6-a351-497c-adaf-9e76acb6ec68",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        608,
        -80
      ],
      "parameters": {
        "color": 7,
        "width": 848,
        "height": 448,
        "content": "## AI generation & documents"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "fade9eae-30e9-4210-bff2-3963d46d4e7e",
  "connections": {
    "Google_Docs": {
      "ai_tool": [
        [
          {
            "node": "LinkedIn Analyst",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Upload file": {
      "main": [
        [
          {
            "node": "Send a message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Recruiter / HR": {
      "main": [
        []
      ]
    },
    "Google_Docs_Body": {
      "ai_tool": [
        [
          {
            "node": "Recruiter / HR",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "LinkedIn Analyst": {
      "main": [
        [
          {
            "node": "Recruiter / HR",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract from File": {
      "main": [
        [
          {
            "node": "Append row in sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google_Docs_Title": {
      "ai_tool": [
        [
          {
            "node": "Recruiter / HR",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Google_Docs_Update": {
      "ai_tool": [
        [
          {
            "node": "LinkedIn Analyst",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "On form submission": {
      "main": [
        [
          {
            "node": "Extract from File",
            "type": "main",
            "index": 0
          },
          {
            "node": "Upload file",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Append row in sheet": {
      "main": [
        [
          {
            "node": "LinkedIn Analyst",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Gemini Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "LinkedIn Analyst",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Google Gemini Chat Model1": {
      "ai_languageModel": [
        [
          {
            "node": "Recruiter / HR",
            "type": "ai_languageModel",
            "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

This workflow helps HR teams, career coaches, and training programs collect candidate data and automatically generate CV improvement recommendations and a cover letter draft. Candidates submit their LinkedIn profile URL, contact details, and an optional CV PDF using an n8n Form.…

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

Streamline your recruitment process with AI-powered resume analysis that goes beyond keyword matching.

Form Trigger, Google Drive, Google Gemini Chat +7
AI & RAG

This n8n workflow automates turning short user ideas into production-ready real-estate marketing assets (photorealistic images and optional 360° videos). A form submission seeds a prompt board → an LL

Form Trigger, Google Sheets, Agent +6
AI & RAG

This workflow automates batch video publishing prep from a Google Drive folder with AI-generated, platform-specific copy and a simple approval queue in Google Sheets. Perfect for Agencies, content cre

Form Trigger, Google Drive, Google Gemini +5
AI & RAG

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 uplo

Form Trigger, Google Sheets, Google Drive +8
AI & RAG

Based on the Google Sheet data, the AI will retrieve the userstories ID's, retrieves the userstory data and the corresponding attachments and creates sprint goals according to the defined system promp

Google Gemini Chat, Google Sheets, HTTP Request Tool +6