Solicitar trabajos desde Excel y rastrear el estado de la solicitud
Este es unPersonal Productivity, Multimodal AIflujo de automatización del dominio deautomatización que contiene 24 nodos.Utiliza principalmente nodos como If, Set, Cron, Gmail, Filter. Solicitud y seguimiento automáticos de puestos de trabajo basados en LinkedIn, Indeed y Google Sheets
- •Cuenta de Google y credenciales de API de Gmail
- •Pueden requerirse credenciales de autenticación para la API de destino
- •Credenciales de API de Google Sheets
Nodos utilizados (24)
Categoría
{
"name": "Apply to Jobs from Excel and Track Application Status",
"tags": [
{
"id": "job-automation",
"name": "Job Automation",
"createdAt": "2025-01-15T00:00:00.000Z",
"updatedAt": "2025-01-15T00:00:00.000Z"
}
],
"nodes": [
{
"id": "template-overview",
"name": "📋 Descripción general de la plantilla",
"type": "n8n-nodes-base.stickyNote",
"position": [
380,
160
],
"parameters": {
"color": 4,
"width": 389,
"height": 464,
"content": "## 🎯 Job Application Automation System\n\n**What it does:**\n- Reads job listings from Google Sheets\n- Automatically applies to jobs with personalized cover letters\n- Tracks application status every 2 days\n- Sends email notifications for updates\n- Maintains complete application history\n\n**Who's it for:**\n- Job seekers wanting to automate repetitive applications\n- Recruiters managing bulk applications\n- Career coaches tracking client progress\n\n**Requirements:**\n- Google Sheets with job data\n- Gmail account for notifications\n- Resume stored online (Google Drive recommended)\n- Job platform API access (LinkedIn, Indeed)\n\n**Setup Instructions:**\n1. Create Google Sheet with required columns\n2. Configure your spreadsheet ID in 'Configuration' node\n3. Set up Google Sheets and Gmail credentials\n4. Update email addresses in notification nodes\n5. Test with 1-2 jobs before full automation\n\n**⚠️ Important:** Replace mock HTTP requests with actual job platform APIs. Current implementation is for demonstration purposes."
},
"typeVersion": 1
},
{
"id": "sheet-structure",
"name": "📊 Estructura de la hoja",
"type": "n8n-nodes-base.stickyNote",
"position": [
820,
160
],
"parameters": {
"color": 7,
"width": 295,
"height": 284,
"content": "## 📊 Excel Sheet Structure\n\nRequired columns:\n- Job_ID: Unique identifier\n- Company: Company name\n- Position: Job title\n- Status: Not Applied, Applied, etc.\n- Applied_Date: Application date\n- Last_Checked: Last status check\n- Application_ID: Platform reference\n- Notes: Additional info\n- Job_URL: Direct job link\n- Priority: High, Medium, Low"
},
"typeVersion": 1
},
{
"id": "setup-notes",
"name": "⚙️ Notas de configuración",
"type": "n8n-nodes-base.stickyNote",
"position": [
1180,
160
],
"parameters": {
"color": 6,
"width": 295,
"height": 224,
"content": "## 🔧 Configuration Setup\n\n1. Replace 'YOUR_GOOGLE_SHEET_ID' with actual ID\n2. Add your resume URL (Google Drive link)\n3. Customize cover letter template\n4. Update email addresses\n\n**Security Note:** Never hardcode API keys!\nUse n8n's credential store for all auth."
},
"typeVersion": 1
},
{
"id": "daily-trigger",
"name": "🕘 Activador diario de solicitudes",
"type": "n8n-nodes-base.cron",
"position": [
240,
480
],
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 9 * * 1-5"
}
]
}
},
"typeVersion": 1
},
{
"id": "configuration",
"name": "⚙️ Configuración",
"type": "n8n-nodes-base.set",
"position": [
460,
480
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "spreadsheet-id",
"name": "spreadsheetId",
"type": "string",
"value": "REPLACE_WITH_YOUR_GOOGLE_SHEET_ID"
},
{
"id": "resume-url",
"name": "resumeUrl",
"type": "string",
"value": "https://drive.google.com/file/d/YOUR_RESUME_ID/view"
},
{
"id": "cover-letter",
"name": "coverLetterTemplate",
"type": "string",
"value": "Dear Hiring Manager,\n\nI am excited to apply for the {{position}} role at {{company}}. With my experience in software development and {{skills}}, I believe I would be a valuable addition to your team.\n\nI am particularly drawn to {{company}} because of your innovation in the tech industry. I would love to contribute to your continued success.\n\nBest regards,\nYour Name"
},
{
"id": "user-email",
"name": "userEmail",
"type": "string",
"value": "your-email@example.com"
}
]
}
},
"typeVersion": 3
},
{
"id": "read-jobs",
"name": "📖 Leer hoja de trabajos",
"type": "n8n-nodes-base.googleSheets",
"position": [
680,
480
],
"parameters": {
"range": "A:J",
"keyRow": 1,
"dataMode": "autoMapInputData",
"sheetName": "Jobs",
"documentId": "={{ $json.spreadsheetId }}",
"requestMethod": "GET",
"authentication": "oAuth2"
},
"typeVersion": 4
},
{
"id": "filter-pending",
"name": "🎯 Filtrar solicitudes pendientes",
"type": "n8n-nodes-base.filter",
"position": [
900,
480
],
"parameters": {
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "not-applied",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.Status }}",
"rightValue": "Not Applied"
},
{
"id": "has-url",
"operator": {
"type": "string",
"operation": "isNotEmpty"
},
"leftValue": "={{ $json.Job_URL }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2
},
{
"id": "split-jobs",
"name": "🔄 Procesar trabajos uno por uno",
"type": "n8n-nodes-base.splitInBatches",
"position": [
1120,
480
],
"parameters": {
"options": {
"reset": false
},
"batchSize": 1
},
"typeVersion": 3
},
{
"id": "prepare-data",
"name": "📝 Preparar datos de la solicitud",
"type": "n8n-nodes-base.set",
"position": [
1340,
480
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "job-platform",
"name": "platform",
"type": "string",
"value": "={{ $json.Job_URL.includes('linkedin.com') ? 'linkedin' : $json.Job_URL.includes('indeed.com') ? 'indeed' : 'generic' }}"
},
{
"id": "personalized-cover",
"name": "personalizedCoverLetter",
"type": "string",
"value": "={{ $('Configuration').first().json.coverLetterTemplate.replace('{{position}}', $json.Position).replace('{{company}}', $json.Company).replace('{{skills}}', 'relevant technical skills') }}"
},
{
"id": "application-date",
"name": "applicationDate",
"type": "string",
"value": "={{ $now.format('yyyy-MM-dd') }}"
},
{
"id": "resume-url",
"name": "resumeUrl",
"type": "string",
"value": "={{ $('Configuration').first().json.resumeUrl }}"
}
]
}
},
"typeVersion": 3
},
{
"id": "platform-router",
"name": "🔀 Enrutar por plataforma",
"type": "n8n-nodes-base.switch",
"position": [
1560,
480
],
"parameters": {
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "linkedin-check",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.platform }}",
"rightValue": "linkedin"
}
]
}
},
"typeVersion": 3
},
{
"id": "linkedin-apply",
"name": "💼 Aplicar vía LinkedIn",
"type": "n8n-nodes-base.httpRequest",
"position": [
1780,
380
],
"parameters": {
"url": "https://api.linkedin.com/v2/jobs/applications",
"options": {
"retry": {
"enabled": true,
"maxTries": 3
},
"timeout": 30000
},
"sendBody": true,
"sendHeaders": true,
"requestMethod": "POST",
"authentication": "predefinedCredentialType",
"bodyParameters": {
"parameters": [
{
"name": "jobId",
"value": "={{ $json.Job_ID }}"
},
{
"name": "coverLetter",
"value": "={{ $json.personalizedCoverLetter }}"
},
{
"name": "resumeUrl",
"value": "={{ $json.resumeUrl }}"
}
]
},
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
},
"nodeCredentialType": "linkedInOAuth2Api"
},
"typeVersion": 4
},
{
"id": "indeed-apply",
"name": "🔍 Aplicar vía Indeed",
"type": "n8n-nodes-base.httpRequest",
"position": [
1780,
580
],
"parameters": {
"url": "https://api.indeed.com/ads/applications",
"options": {
"retry": {
"enabled": true,
"maxTries": 3
},
"timeout": 30000
},
"sendBody": true,
"sendHeaders": true,
"requestMethod": "POST",
"authentication": "predefinedCredentialType",
"bodyParameters": {
"parameters": [
{
"name": "jobkey",
"value": "={{ $json.Job_ID }}"
},
{
"name": "message",
"value": "={{ $json.personalizedCoverLetter }}"
}
]
},
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
},
"nodeCredentialType": "indeedApi"
},
"typeVersion": 4
},
{
"id": "process-result",
"name": "📊 Procesar resultado de la aplicación",
"type": "n8n-nodes-base.set",
"position": [
2000,
480
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "application-status",
"name": "applicationStatus",
"type": "string",
"value": "={{ $json.statusCode >= 200 && $json.statusCode < 300 ? 'Applied' : 'Failed' }}"
},
{
"id": "app-id",
"name": "applicationId",
"type": "string",
"value": "={{ $json.body?.applicationId || $json.body?.id || 'AUTO_' + $now.format('yyyyMMddHHmmss') }}"
},
{
"id": "status-notes",
"name": "statusNotes",
"type": "string",
"value": "={{ $json.statusCode >= 200 && $json.statusCode < 300 ? 'Application submitted successfully via ' + $('Prepare Application Data').first().json.platform : 'Application failed: ' + $json.statusCode }}"
},
{
"id": "job-data",
"name": "originalJobData",
"type": "object",
"value": "={{ $('Prepare Application Data').first().json }}"
}
]
}
},
"typeVersion": 3
},
{
"id": "update-status",
"name": "📝 Actualizar estado del trabajo",
"type": "n8n-nodes-base.googleSheets",
"position": [
2220,
480
],
"parameters": {
"range": "D{{ $json.originalJobData.row_index }}:H{{ $json.originalJobData.row_index }}",
"keyRow": 1,
"values": {
"values": [
[
"={{ $json.applicationStatus }}",
"={{ $json.originalJobData.applicationDate }}",
"={{ $json.originalJobData.applicationDate }}",
"={{ $json.applicationId }}",
"={{ $json.statusNotes }}"
]
]
},
"dataMode": "autoMapInputData",
"sheetName": "Jobs",
"documentId": "={{ $('Configuration').first().json.spreadsheetId }}",
"requestMethod": "UPDATE",
"authentication": "oAuth2",
"valueInputMode": "raw"
},
"typeVersion": 4
},
{
"id": "send-notification",
"name": "📧 Enviar notificación de solicitud",
"type": "n8n-nodes-base.gmail",
"position": [
2440,
480
],
"parameters": {
"email": "={{ $('Configuration').first().json.userEmail }}",
"message": "<h3>Application Status Update</h3>\n<p><strong>Company:</strong> {{ $json.originalJobData.Company }}</p>\n<p><strong>Position:</strong> {{ $json.originalJobData.Position }}</p>\n<p><strong>Status:</strong> {{ $json.applicationStatus }}</p>\n<p><strong>Date:</strong> {{ $json.originalJobData.applicationDate }}</p>\n<p><strong>Platform:</strong> {{ $json.originalJobData.platform }}</p>\n<p><strong>Notes:</strong> {{ $json.statusNotes }}</p>\n<p><strong>Application ID:</strong> {{ $json.applicationId }}</p>",
"subject": "Job Application: {{ $json.originalJobData.Company }} - {{ $json.originalJobData.Position }}",
"operation": "sendEmail",
"emailFormat": "html"
},
"typeVersion": 2
},
{
"id": "status-tracking-info",
"name": "📊 Información de seguimiento de estado",
"type": "n8n-nodes-base.stickyNote",
"position": [
380,
740
],
"parameters": {
"color": 7,
"width": 329,
"height": 204,
"content": "## 📈 Status Tracking Workflow\n\nThis section runs every 2 days to:\n- Check status of applied jobs\n- Update the spreadsheet\n- Send notifications for changes\n\n**Note:** Replace mock status checks with actual API calls to job platforms for real status updates."
},
"typeVersion": 1
},
{
"id": "status-trigger",
"name": "🕐 Activador de verificación de estado",
"type": "n8n-nodes-base.cron",
"position": [
240,
980
],
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 10 */2 * *"
}
]
}
},
"typeVersion": 1
},
{
"id": "read-applied",
"name": "📖 Leer trabajos aplicados",
"type": "n8n-nodes-base.googleSheets",
"position": [
460,
980
],
"parameters": {
"range": "A:J",
"keyRow": 1,
"dataMode": "autoMapInputData",
"sheetName": "Jobs",
"documentId": "={{ $('Configuration').first().json.spreadsheetId }}",
"requestMethod": "GET",
"authentication": "oAuth2"
},
"typeVersion": 4
},
{
"id": "filter-applied",
"name": "🎯 Filtrar trabajos aplicados",
"type": "n8n-nodes-base.filter",
"position": [
680,
980
],
"parameters": {
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "applied-filter",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.Status }}",
"rightValue": "Applied"
}
]
}
},
"typeVersion": 2
},
{
"id": "split-status",
"name": "🔄 Verificar estado uno por uno",
"type": "n8n-nodes-base.splitInBatches",
"position": [
900,
980
],
"parameters": {
"options": {
"reset": false
},
"batchSize": 1
},
"typeVersion": 3
},
{
"id": "mock-status-check",
"name": "🔍 Simulación de verificación de estado",
"type": "n8n-nodes-base.set",
"position": [
1120,
980
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "mock-status",
"name": "newStatus",
"type": "string",
"value": "={{ ['Applied', 'Under Review', 'Interview Scheduled', 'Rejected'][Math.floor(Math.random() * 4)] }}"
},
{
"id": "check-date",
"name": "checkDate",
"type": "string",
"value": "={{ $now.format('yyyy-MM-dd') }}"
},
{
"id": "status-notes",
"name": "statusNotes",
"type": "string",
"value": "Status checked automatically via API"
}
]
}
},
"typeVersion": 3
},
{
"id": "status-changed",
"name": "🔄 Verificar si el estado cambió",
"type": "n8n-nodes-base.if",
"position": [
1340,
980
],
"parameters": {
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "status-changed",
"operator": {
"type": "string",
"operation": "notEquals"
},
"leftValue": "={{ $json.Status }}",
"rightValue": "={{ $json.newStatus }}"
}
]
}
},
"typeVersion": 2
},
{
"id": "update-changed",
"name": "📝 Actualizar estado modificado",
"type": "n8n-nodes-base.googleSheets",
"position": [
1560,
980
],
"parameters": {
"range": "D{{ $json.row_index }}:F{{ $json.row_index }}",
"keyRow": 1,
"values": {
"values": [
[
"={{ $json.newStatus }}",
"={{ $json.Applied_Date }}",
"={{ $json.checkDate }}"
]
]
},
"dataMode": "autoMapInputData",
"sheetName": "Jobs",
"documentId": "={{ $('Configuration').first().json.spreadsheetId }}",
"requestMethod": "UPDATE",
"authentication": "oAuth2",
"valueInputMode": "raw"
},
"typeVersion": 4
},
{
"id": "send-status-update",
"name": "📧 Enviar actualización de estado",
"type": "n8n-nodes-base.gmail",
"position": [
1780,
980
],
"parameters": {
"email": "={{ $('Configuration').first().json.userEmail }}",
"message": "<h3>Application Status Changed</h3>\n<p><strong>Company:</strong> {{ $json.Company }}</p>\n<p><strong>Position:</strong> {{ $json.Position }}</p>\n<p><strong>Previous Status:</strong> {{ $json.Status }}</p>\n<p><strong>New Status:</strong> {{ $json.newStatus }}</p>\n<p><strong>Last Checked:</strong> {{ $json.checkDate }}</p>\n<p><strong>Notes:</strong> {{ $json.statusNotes }}</p>",
"subject": "Status Update: {{ $json.Company }} - {{ $json.Position }}",
"operation": "sendEmail",
"emailFormat": "html"
},
"typeVersion": 2
}
],
"settings": {
"executionOrder": "v1"
},
"updatedAt": "2025-01-15T00:00:00.000Z",
"versionId": "1",
"staticData": null,
"connections": {
"configuration": {
"main": [
[
{
"node": "read-jobs",
"type": "main",
"index": 0
}
]
]
},
"read-jobs": {
"main": [
[
{
"node": "filter-pending",
"type": "main",
"index": 0
}
]
]
},
"indeed-apply": {
"main": [
[
{
"node": "process-result",
"type": "main",
"index": 0
}
]
]
},
"read-applied": {
"main": [
[
{
"node": "filter-applied",
"type": "main",
"index": 0
}
]
]
},
"update-status": {
"main": [
[
{
"node": "send-notification",
"type": "main",
"index": 0
}
]
]
},
"platform-router": {
"main": [
[
{
"node": "linkedin-apply",
"type": "main",
"index": 0
}
],
[
{
"node": "indeed-apply",
"type": "main",
"index": 0
}
]
]
},
"mock-status-check": {
"main": [
[
{
"node": "status-changed",
"type": "main",
"index": 0
}
]
]
},
"linkedin-apply": {
"main": [
[
{
"node": "process-result",
"type": "main",
"index": 0
}
]
]
},
"filter-applied": {
"main": [
[
{
"node": "split-status",
"type": "main",
"index": 0
}
]
]
},
"status-trigger": {
"main": [
[
{
"node": "read-applied",
"type": "main",
"index": 0
}
]
]
},
"update-changed": {
"main": [
[
{
"node": "send-status-update",
"type": "main",
"index": 0
}
]
]
},
"split-status": {
"main": [
[
{
"node": "mock-status-check",
"type": "main",
"index": 0
}
]
]
},
"status-changed": {
"main": [
[
{
"node": "update-changed",
"type": "main",
"index": 0
}
]
]
},
"split-jobs": {
"main": [
[
{
"node": "prepare-data",
"type": "main",
"index": 0
}
]
]
},
"prepare-data": {
"main": [
[
{
"node": "platform-router",
"type": "main",
"index": 0
}
]
]
},
"daily-trigger": {
"main": [
[
{
"node": "configuration",
"type": "main",
"index": 0
}
]
]
},
"process-result": {
"main": [
[
{
"node": "update-status",
"type": "main",
"index": 0
}
]
]
},
"filter-pending": {
"main": [
[
{
"node": "split-jobs",
"type": "main",
"index": 0
}
]
]
}
},
"triggerCount": 2
}¿Cómo usar este flujo de trabajo?
Copie el código de configuración JSON de arriba, cree un nuevo flujo de trabajo en su instancia de n8n y seleccione "Importar desde JSON", pegue la configuración y luego modifique la configuración de credenciales según sea necesario.
¿En qué escenarios es adecuado este flujo de trabajo?
Avanzado - Productividad personal, IA Multimodal
¿Es de pago?
Este flujo de trabajo es completamente gratuito, puede importarlo y usarlo directamente. Sin embargo, tenga en cuenta que los servicios de terceros utilizados en el flujo de trabajo (como la API de OpenAI) pueden requerir un pago por su cuenta.
Flujos de trabajo relacionados recomendados
VipinW
@vxi14Compartir este flujo de trabajo