This workflow corresponds to n8n.io template #16193 — 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 →
{
"id": "6XBhCFDQmGPUza04",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Skill Gap Analyzer",
"tags": [],
"nodes": [
{
"id": "0ccc0872-000a-47f8-848b-5b5b1d472728",
"name": "Overview",
"type": "n8n-nodes-base.stickyNote",
"position": [
-3168,
-176
],
"parameters": {
"color": 4,
"width": 540,
"height": 1156,
"content": "## Skill Gap Analyzer \u2014 Student Profile vs Job Market \u2014 BrowserAct + LinkedIn + GPT-4o-mini + Google Sheets + Gmail\n\nFor students, freshers, and career changers who want to know exactly which skills they are missing for their target job role \u2014 compared against real live LinkedIn job postings. A student submits a form with their name, email, current skills, target role, experience level, and preferred location. A Code node validates inputs and builds the LinkedIn search URL. BrowserAct opens LinkedIn with a real stealth browser and extracts required skills from the top job postings \u2014 bypassing the blocks that standard HTTP requests hit. A Code node cleans the raw scraped output. GPT-4o-mini analyzes the student's skills against market demand and returns: all market skills with frequency counts, skills the student already has, missing skills by priority, a gap score, top 3 free courses with URLs, and a 3-month learning plan. A Code node parses each labeled section. Google Sheets and Gmail run in parallel \u2014 Sheets appends the full report and Gmail sends the formatted HTML plan to the student.\n\n## How it works\n- **1. Form \u2014 Student Profile** collects name, email, target role, current skills (comma-separated), experience level, and preferred location\n- **2. Code \u2014 Prepare and Build LinkedIn URL** validates required fields and builds the LinkedIn job search URL with encoded role and location\n- **3. BrowserAct \u2014 Scrape LinkedIn Jobs** uses a real stealth browser to open LinkedIn and extract required skills from the top job postings\n- **4. Code \u2014 Extract Job Data** normalises the BrowserAct response across possible field names, cleans whitespace, trims to 5000 characters, and passes all student data through\n- **5. AI Agent \u2014 Skill Gap Analysis** uses GPT-4o-mini to produce: market skills with post frequencies, skills the student already has, missing skills sorted by priority, gap score, top 3 free courses, and a 3-month plan\n- **OpenAI \u2014 GPT-4o-mini Model** language model attached to the AI Agent\n- **6. Code \u2014 Parse Analysis** extracts each labeled section from the AI output and passes all student metadata through\n- **7. Google Sheets \u2014 Save Gap Report** and **8. Gmail \u2014 Send 90-Day Plan** run in parallel from node 6 output\n\n## Set up steps\n1. Install the BrowserAct community node: Settings \u2192 Community Nodes \u2192 Install `n8n-nodes-browseract`\n2. Sign up at browseract.com \u2014 join their Discord for free credits. Create a BrowserAct workflow that opens a LinkedIn URL and extracts job titles and required skills. Replace `YOUR_BROWSERACT_WORKFLOW_ID` in node 3 and connect your BrowserAct API credential\n3. In **OpenAI \u2014 GPT-4o-mini Model** \u2014 connect your OpenAI API credential\n4. In **7. Google Sheets \u2014 Save Gap Report** \u2014 connect Google Sheets OAuth2 credential and replace `YOUR_GOOGLE_SHEET_ID`. Create a tab named Skill Gap Reports with columns: Name, Email, Target Role, Experience, Student Skills, Skills You Have, Skills Missing, Gap Score, Top Courses, 90 Day Plan, LinkedIn URL, Date\n5. In **8. Gmail \u2014 Send 90-Day Plan** \u2014 connect Gmail OAuth2 credential"
},
"typeVersion": 1
},
{
"id": "f500e63e-152f-43ab-85c1-52ceab23b643",
"name": "Section \u2014 Student Profile Form and URL Preparation",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2528,
32
],
"parameters": {
"color": 5,
"width": 484,
"height": 468,
"content": "## Student Profile Form and URL Preparation\nForm collects name, email, target role, current skills, experience level, and location. Code validates inputs and builds the LinkedIn job search URL."
},
"typeVersion": 1
},
{
"id": "18187adf-0b17-417c-9369-617bdca4cb54",
"name": "Section \u2014 LinkedIn Scrape and Job Data Extraction",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2000,
48
],
"parameters": {
"color": 6,
"width": 532,
"height": 436,
"content": "## LinkedIn Scrape and Job Data Extraction\nBrowserAct opens LinkedIn with a real stealth browser and extracts required skills from top job postings. Code normalises the response and trims to 5000 characters."
},
"typeVersion": 1
},
{
"id": "d03e328a-a57e-4204-8c2d-a6535decf844",
"name": "Section \u2014 GPT-4o-mini Gap Analysis and Section Parse",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1392,
-48
],
"parameters": {
"color": 6,
"width": 452,
"height": 644,
"content": "## GPT-4o-mini Gap Analysis and Section Parse\nGPT-4o-mini compares student skills vs market demand from job postings \u2014 produces market skills with frequencies, skills have and missing, gap score, top 3 free courses, and a 3-month learning plan. Code parses each labeled section."
},
"typeVersion": 1
},
{
"id": "2364f01e-f7e5-4792-9969-22f03df33301",
"name": "Section \u2014 Sheets Save and Gmail Send (Parallel)",
"type": "n8n-nodes-base.stickyNote",
"position": [
-832,
-144
],
"parameters": {
"color": 4,
"width": 292,
"height": 804,
"content": "## Sheets Save and Gmail Send (Parallel)\nNode 6 output branches to both nodes simultaneously. Sheets appends the full report. Gmail sends the formatted HTML gap analysis and 3-month plan to the student."
},
"typeVersion": 1
},
{
"id": "dd8dfd15-43bf-4338-a3aa-37c7d57ada6a",
"name": "1. Form \u2014 Student Profile",
"type": "n8n-nodes-base.formTrigger",
"position": [
-2432,
208
],
"parameters": {
"options": {},
"formTitle": "Skill Gap Analyzer",
"formFields": {
"values": [
{
"fieldLabel": "Your Name",
"placeholder": "e.g. Rahul Sharma",
"requiredField": true
},
{
"fieldLabel": "Your Email",
"placeholder": "rahul@email.com",
"requiredField": true
},
{
"fieldLabel": "Target Job Role",
"placeholder": "e.g. Data Analyst, Frontend Developer, Product Manager",
"requiredField": true
},
{
"fieldLabel": "Your Current Skills",
"placeholder": "Comma separated \u2014 e.g. Python, Excel, SQL, HTML",
"requiredField": true
},
{
"fieldLabel": "Experience Level",
"placeholder": "e.g. Fresher / 0-1 year / 1-3 years",
"requiredField": true
},
{
"fieldLabel": "Preferred Location",
"placeholder": "e.g. India, Remote, United States",
"requiredField": true
}
]
},
"formDescription": "Enter your skills and target job. AI will analyze the job market and send you a personalized 90-day learning plan."
},
"typeVersion": 2.2
},
{
"id": "5041a4e0-3a5c-4b36-a699-e760f4a0c0e4",
"name": "2. Code \u2014 Prepare and Build LinkedIn URL",
"type": "n8n-nodes-base.code",
"position": [
-2192,
208
],
"parameters": {
"jsCode": "const row = $json;\n\nconst studentName = (row['Your Name'] || '').trim();\nconst email = (row['Your Email'] || '').trim();\nconst targetRole = (row['Target Job Role'] || '').trim();\nconst currentSkills = (row['Your Current Skills'] || '').trim();\nconst experienceLevel = (row['Experience Level'] || 'Fresher').trim();\nconst location = (row['Preferred Location'] || 'India').trim();\n\nif (!studentName || !email || !targetRole || !currentSkills) {\n throw new Error('Name, Email, Target Role, and Current Skills are required.');\n}\n\nconst encodedRole = encodeURIComponent(targetRole);\nconst encodedLocation = encodeURIComponent(location);\nconst linkedinUrl = `https://www.linkedin.com/jobs/search/?keywords=${encodedRole}&location=${encodedLocation}&sortBy=R`;\n\nreturn [{\n json: {\n studentName,\n email,\n targetRole,\n currentSkills,\n experienceLevel,\n location,\n linkedinUrl\n }\n}];"
},
"typeVersion": 2
},
{
"id": "77aea540-d38e-4bed-87e0-a689a05f8957",
"name": "3. BrowserAct \u2014 Scrape LinkedIn Jobs",
"type": "n8n-nodes-browseract.BrowserAct",
"position": [
-1936,
208
],
"parameters": {
"workflowId": "YOUR_BROWSERACT_WORKFLOW_ID",
"workflowParams": "={{ JSON.stringify({ url: $json.linkedinUrl, targetRole: $json.targetRole }) }}"
},
"credentials": {},
"typeVersion": 1
},
{
"id": "00289020-ea18-4e94-8982-573a9abe10c5",
"name": "4. Code \u2014 Extract Job Data",
"type": "n8n-nodes-base.code",
"position": [
-1648,
208
],
"parameters": {
"jsCode": "const output = $json;\nconst studentData = $('2. Code \u2014 Prepare and Build LinkedIn URL').item.json;\n\nlet jobData = '';\nif (typeof output.result === 'string') jobData = output.result;\nelse if (typeof output.output === 'string') jobData = output.output;\nelse if (typeof output.content === 'string') jobData = output.content;\nelse if (output.data?.text) jobData = output.data.text;\nelse jobData = JSON.stringify(output);\n\njobData = jobData.replace(/\\n{3,}/g, '\\n\\n').trim();\nif (jobData.length > 5000) jobData = jobData.substring(0, 5000) + '\\n[Trimmed]';\n\nif (!jobData || jobData.length < 50) {\n throw new Error('BrowserAct returned empty data. Check your BrowserAct workflow extracts job text from LinkedIn.');\n}\n\nreturn [{\n json: {\n jobData,\n studentName: studentData.studentName,\n email: studentData.email,\n targetRole: studentData.targetRole,\n currentSkills: studentData.currentSkills,\n experienceLevel:studentData.experienceLevel,\n location: studentData.location,\n linkedinUrl: studentData.linkedinUrl\n }\n}];"
},
"typeVersion": 2
},
{
"id": "e1190a05-70f5-4666-b372-d7d634807c23",
"name": "5. AI Agent \u2014 Skill Gap Analysis",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-1344,
208
],
"parameters": {
"text": "=LinkedIn Job Postings for {{ $json.targetRole }}:\n{{ $json.jobData }}",
"options": {
"systemMessage": "=You are a career coach. Analyze job postings and the student's skills to generate a skill gap report.\n\nStudent: {{ $json.studentName }}\nTarget Role: {{ $json.targetRole }}\nExperience: {{ $json.experienceLevel }}\nLocation: {{ $json.location }}\nCurrent Skills: {{ $json.currentSkills }}\n\nReturn in this EXACT format:\n\nMARKET_SKILLS:\n- [skill] \u2014 [X]/20 jobs\n- [skill] \u2014 [X]/20 jobs\n[list all skills found sorted by frequency]\n\nSKILLS_YOU_HAVE:\n- [skill] \u2014 [why valuable for this role]\n[only skills the student already has]\n\nSKILLS_MISSING:\n- [skill] \u2014 Priority: High/Medium/Low \u2014 [why needed]\n[skills market wants but student lacks, sorted by priority]\n\nGAP_SCORE:\n[X out of Y required skills \u2014 Z percent ready]\n\nTOP_3_COURSES:\n1. [Course Name] \u2014 [Platform] \u2014 [Free URL] \u2014 fills: [skill]\n2. [Course Name] \u2014 [Platform] \u2014 [Free URL] \u2014 fills: [skill]\n3. [Course Name] \u2014 [Platform] \u2014 [Free URL] \u2014 fills: [skill]\n\nNINETY_DAY_PLAN:\nMonth 1: [Focus area + specific skill to learn + resource]\nMonth 2: [Focus area + skill + resource]\nMonth 3: [Focus area + portfolio/apply + resource]\n\nBe specific. Only use what is found in the job postings."
},
"promptType": "define"
},
"typeVersion": 1.9
},
{
"id": "9be7c0be-3950-404a-838e-9b32b1899bfe",
"name": "OpenAI \u2014 GPT-4o-mini Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
-1344,
384
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4o-mini"
},
"options": {},
"builtInTools": {}
},
"typeVersion": 1.3
},
{
"id": "8b48e500-ce28-46b2-bf3d-92425a42ef29",
"name": "6. Code \u2014 Parse Analysis",
"type": "n8n-nodes-base.code",
"position": [
-1072,
208
],
"parameters": {
"jsCode": "const output = $input.first().json.output || '';\n\nconst extract = (label, next) => {\n const p = next\n ? new RegExp(label + ':\\\\s*([\\\\s\\\\S]*?)(?=\\\\n' + next + ':|$)')\n : new RegExp(label + ':\\\\s*([\\\\s\\\\S]*)$');\n const m = output.match(p);\n return m ? m[1].trim() : '';\n};\n\nconst marketSkills = extract('MARKET_SKILLS', 'SKILLS_YOU_HAVE');\nconst skillsHave = extract('SKILLS_YOU_HAVE', 'SKILLS_MISSING');\nconst skillsMissing = extract('SKILLS_MISSING', 'GAP_SCORE');\nconst gapScore = extract('GAP_SCORE', 'TOP_3_COURSES');\nconst top3Courses = extract('TOP_3_COURSES', 'NINETY_DAY_PLAN');\nconst plan90Day = extract('NINETY_DAY_PLAN', null);\n\nif (!skillsMissing) {\n throw new Error('GPT did not return valid analysis. Preview: ' + output.substring(0, 200));\n}\n\nconst d = $('4. Code \u2014 Extract Job Data').item.json;\n\nreturn [{\n json: {\n marketSkills, skillsHave, skillsMissing,\n gapScore, top3Courses, plan90Day,\n studentName: d.studentName, email: d.email,\n targetRole: d.targetRole, currentSkills: d.currentSkills,\n experienceLevel: d.experienceLevel, location: d.location,\n linkedinUrl: d.linkedinUrl\n }\n}];"
},
"typeVersion": 2
},
{
"id": "c554d29c-64be-4afc-8d58-69a88a989f72",
"name": "7. Google Sheets \u2014 Save Gap Report",
"type": "n8n-nodes-base.googleSheets",
"position": [
-736,
96
],
"parameters": {
"columns": {
"value": {
"Date": "={{ $now.toFormat('dd MMM yyyy HH:mm') }}",
"Name": "={{ $json.studentName }}",
"Email": "={{ $json.email }}",
"Gap Score": "={{ $json.gapScore }}",
"Experience": "={{ $json.experienceLevel }}",
"90 Day Plan": "={{ $json.plan90Day }}",
"Target Role": "={{ $json.targetRole }}",
"Top Courses": "={{ $json.top3Courses }}",
"LinkedIn URL": "={{ $json.linkedinUrl }}",
"Skills Missing": "={{ $json.skillsMissing }}",
"Student Skills": "={{ $json.currentSkills }}",
"Skills You Have": "={{ $json.skillsHave }}"
},
"schema": [
{
"id": "Name",
"type": "string",
"display": true,
"required": false,
"displayName": "Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Email",
"type": "string",
"display": true,
"required": false,
"displayName": "Email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Target Role",
"type": "string",
"display": true,
"required": false,
"displayName": "Target Role",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Experience",
"type": "string",
"display": true,
"required": false,
"displayName": "Experience",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Student Skills",
"type": "string",
"display": true,
"required": false,
"displayName": "Student Skills",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Skills You Have",
"type": "string",
"display": true,
"required": false,
"displayName": "Skills You Have",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Skills Missing",
"type": "string",
"display": true,
"required": false,
"displayName": "Skills Missing",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Gap Score",
"type": "string",
"display": true,
"required": false,
"displayName": "Gap Score",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Top Courses",
"type": "string",
"display": true,
"required": false,
"displayName": "Top Courses",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "90 Day Plan",
"type": "string",
"display": true,
"required": false,
"displayName": "90 Day Plan",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "LinkedIn URL",
"type": "string",
"display": true,
"required": false,
"displayName": "LinkedIn URL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Date",
"type": "string",
"display": true,
"required": false,
"displayName": "Date",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": true
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "name",
"value": "Skill Gap Reports"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "YOUR_GOOGLE_SHEET_ID"
}
},
"typeVersion": 4.5
},
{
"id": "285632b6-6579-4e46-9c2f-417d15f10676",
"name": "8. Gmail \u2014 Send 90-Day Plan",
"type": "n8n-nodes-base.gmail",
"position": [
-736,
320
],
"parameters": {
"sendTo": "={{ $json.email }}",
"message": "=<div style=\"font-family:Arial,sans-serif;max-width:660px;margin:0 auto;background:#f5f5f5;\">\n\n <div style=\"background:#1a1a2e;padding:24px 28px;border-radius:8px 8px 0 0;\">\n <h1 style=\"color:#fff;font-size:22px;margin:0;\">Skill Gap Report</h1>\n <p style=\"color:#aaa;font-size:13px;margin:6px 0 0;\">{{ $json.targetRole }} \u2014 {{ $json.location }} \u2014 {{ $json.experienceLevel }}</p>\n </div>\n\n <div style=\"background:#4a90e2;padding:8px 28px;\">\n <p style=\"color:#fff;font-size:13px;margin:0;\">{{ $json.studentName }} \u2022 {{ $json.gapScore }}</p>\n </div>\n\n <div style=\"background:#fff;padding:24px 28px;\">\n\n <div style=\"background:#e8f5e9;border-left:4px solid #43a047;padding:14px;border-radius:0 6px 6px 0;margin-bottom:20px;\">\n <h2 style=\"margin:0 0 8px;font-size:15px;color:#1a1a2e;\">Skills You Already Have</h2>\n <pre style=\"font-size:13px;color:#2e7d32;line-height:1.8;white-space:pre-wrap;margin:0;\">{{ $json.skillsHave }}</pre>\n </div>\n\n <div style=\"background:#fff5f5;border-left:4px solid #e53935;padding:14px;border-radius:0 6px 6px 0;margin-bottom:20px;\">\n <h2 style=\"margin:0 0 8px;font-size:15px;color:#1a1a2e;\">Skills You Need to Learn</h2>\n <pre style=\"font-size:13px;color:#c62828;line-height:1.8;white-space:pre-wrap;margin:0;\">{{ $json.skillsMissing }}</pre>\n </div>\n\n <div style=\"background:#fff8e1;border-left:4px solid #ffa000;padding:14px;border-radius:0 6px 6px 0;margin-bottom:20px;\">\n <h2 style=\"margin:0 0 8px;font-size:15px;color:#1a1a2e;\">Top 3 Free Courses</h2>\n <pre style=\"font-size:13px;color:#444;line-height:1.8;white-space:pre-wrap;margin:0;\">{{ $json.top3Courses }}</pre>\n </div>\n\n <div style=\"background:#f0f4ff;border-left:4px solid #4a90e2;padding:14px;border-radius:0 6px 6px 0;margin-bottom:20px;\">\n <h2 style=\"margin:0 0 8px;font-size:15px;color:#1a1a2e;\">Your 90-Day Learning Plan</h2>\n <pre style=\"font-size:13px;color:#333;line-height:1.8;white-space:pre-wrap;margin:0;\">{{ $json.plan90Day }}</pre>\n </div>\n\n <div style=\"background:#f9f9f9;padding:14px;border-radius:6px;\">\n <h2 style=\"margin:0 0 8px;font-size:15px;color:#1a1a2e;\">Market Skills from Job Postings</h2>\n <pre style=\"font-size:12px;color:#555;line-height:1.7;white-space:pre-wrap;margin:0;\">{{ $json.marketSkills }}</pre>\n </div>\n\n </div>\n\n <div style=\"background:#1a1a2e;padding:12px 28px;text-align:center;border-radius:0 0 8px 8px;\">\n <p style=\"color:#888;font-size:11px;margin:0;\">Powered by n8n + BrowserAct + GPT-4o-mini</p>\n </div>\n\n</div>",
"options": {
"senderName": "Skill Gap Analyzer"
},
"subject": "=Your Skill Gap Report \u2014 {{ $json.targetRole }} | {{ $json.gapScore }}"
},
"typeVersion": 2.1
}
],
"active": false,
"settings": {
"binaryMode": "separate",
"executionOrder": "v1"
},
"versionId": "f9229724-7be7-452c-b176-7e56ab6dce47",
"connections": {
"6. Code \u2014 Parse Analysis": {
"main": [
[
{
"node": "7. Google Sheets \u2014 Save Gap Report",
"type": "main",
"index": 0
},
{
"node": "8. Gmail \u2014 Send 90-Day Plan",
"type": "main",
"index": 0
}
]
]
},
"1. Form \u2014 Student Profile": {
"main": [
[
{
"node": "2. Code \u2014 Prepare and Build LinkedIn URL",
"type": "main",
"index": 0
}
]
]
},
"4. Code \u2014 Extract Job Data": {
"main": [
[
{
"node": "5. AI Agent \u2014 Skill Gap Analysis",
"type": "main",
"index": 0
}
]
]
},
"OpenAI \u2014 GPT-4o-mini Model": {
"ai_languageModel": [
[
{
"node": "5. AI Agent \u2014 Skill Gap Analysis",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"5. AI Agent \u2014 Skill Gap Analysis": {
"main": [
[
{
"node": "6. Code \u2014 Parse Analysis",
"type": "main",
"index": 0
}
]
]
},
"3. BrowserAct \u2014 Scrape LinkedIn Jobs": {
"main": [
[
{
"node": "4. Code \u2014 Extract Job Data",
"type": "main",
"index": 0
}
]
]
},
"2. Code \u2014 Prepare and Build LinkedIn URL": {
"main": [
[
{
"node": "3. BrowserAct \u2014 Scrape LinkedIn Jobs",
"type": "main",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow collects a student’s profile via an n8n form, scrapes relevant LinkedIn job postings with BrowserAct, uses OpenAI GPT-4o-mini to generate a skill gap report and 90-day learning plan, then saves the results to Google Sheets and emails the plan via Gmail. Receives a…
Source: https://n8n.io/workflows/16193/ — 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.
This workflow collects a student’s skills and target role via an n8n Form, scrapes top LinkedIn job postings with BrowserAct, and uses OpenAI GPT-4o-mini to generate a skill gap report with courses an
This n8n workflow template automates your lead generation and follow-up process using AI. It captures leads through a form, enriches them with company data, classifies them into different categories,
The workflow runs every hour with a randomized delay of 5–20 minutes to help distribute load. It records the exact date and time a lead is emailed so you can track outreach. Follow-ups are automatical
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
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