This workflow follows the Gmail → Google Sheets 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 →
{
"nodes": [
{
"parameters": {
"content": "## \ud83c\udfaf 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**\u26a0\ufe0f Important:** Replace mock HTTP requests with actual job platform APIs. Current implementation is for demonstration purposes.",
"height": 464,
"width": 389,
"color": 4
},
"id": "template-overview",
"name": "\ud83d\udccb Template Overview",
"type": "n8n-nodes-base.stickyNote",
"position": [
368,
240
],
"typeVersion": 1
},
{
"parameters": {
"content": "## \ud83d\udcca 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",
"height": 284,
"width": 295,
"color": 7
},
"id": "sheet-structure",
"name": "\ud83d\udcca Sheet Structure",
"type": "n8n-nodes-base.stickyNote",
"position": [
816,
240
],
"typeVersion": 1
},
{
"parameters": {
"content": "## \ud83d\udd27 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.",
"height": 224,
"width": 295,
"color": 6
},
"id": "setup-notes",
"name": "\u2699\ufe0f Setup Notes",
"type": "n8n-nodes-base.stickyNote",
"position": [
1168,
240
],
"typeVersion": 1
},
{
"parameters": {},
"id": "daily-trigger",
"name": "\ud83d\udd58 Daily Application Trigger",
"type": "n8n-nodes-base.cron",
"position": [
240,
560
],
"typeVersion": 1
},
{
"parameters": {
"options": {}
},
"id": "configuration",
"name": "\u2699\ufe0f Configuration",
"type": "n8n-nodes-base.set",
"position": [
448,
560
],
"typeVersion": 3
},
{
"parameters": {
"documentId": "={{ $json.spreadsheetId }}",
"sheetName": "Jobs",
"options": {}
},
"id": "read-jobs",
"name": "\ud83d\udcd6 Read Jobs Sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
672,
560
],
"typeVersion": 4
},
{
"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": ""
}
]
},
"options": {}
},
"id": "filter-pending",
"name": "\ud83c\udfaf Filter Pending Applications",
"type": "n8n-nodes-base.filter",
"position": [
896,
560
],
"typeVersion": 2
},
{
"parameters": {
"options": {
"reset": false
}
},
"id": "split-jobs",
"name": "\ud83d\udd04 Process Jobs One by One",
"type": "n8n-nodes-base.splitInBatches",
"position": [
1120,
560
],
"typeVersion": 3
},
{
"parameters": {
"options": {}
},
"id": "prepare-data",
"name": "\ud83d\udcdd Prepare Application Data",
"type": "n8n-nodes-base.set",
"position": [
1328,
560
],
"typeVersion": 3
},
{
"parameters": {
"rules": {
"values": [
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict"
},
"conditions": [
{
"leftValue": "",
"rightValue": "",
"operator": {
"type": "string",
"operation": "equals"
}
}
],
"combinator": "and"
}
}
]
},
"options": {}
},
"id": "platform-router",
"name": "\ud83d\udd00 Route by Platform",
"type": "n8n-nodes-base.switch",
"position": [
1552,
560
],
"typeVersion": 3
},
{
"parameters": {
"url": "https://api.linkedin.com/v2/jobs/applications",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "linkedInOAuth2Api",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
},
"sendBody": true,
"bodyParameters": {
"parameters": [
{
"name": "jobId",
"value": "={{ $json.Job_ID }}"
},
{
"name": "coverLetter",
"value": "={{ $json.personalizedCoverLetter }}"
},
{
"name": "resumeUrl",
"value": "={{ $json.resumeUrl }}"
}
]
},
"options": {
"timeout": 30000
}
},
"id": "linkedin-apply",
"name": "\ud83d\udcbc Apply via LinkedIn",
"type": "n8n-nodes-base.httpRequest",
"position": [
1776,
464
],
"typeVersion": 4
},
{
"parameters": {
"url": "https://api.indeed.com/ads/applications",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "indeedApi",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
},
"sendBody": true,
"bodyParameters": {
"parameters": [
{
"name": "jobkey",
"value": "={{ $json.Job_ID }}"
},
{
"name": "message",
"value": "={{ $json.personalizedCoverLetter }}"
}
]
},
"options": {
"timeout": 30000
}
},
"id": "indeed-apply",
"name": "\ud83d\udd0d Apply via Indeed",
"type": "n8n-nodes-base.httpRequest",
"position": [
1776,
672
],
"typeVersion": 4
},
{
"parameters": {
"options": {}
},
"id": "process-result",
"name": "\ud83d\udcca Process Application Result",
"type": "n8n-nodes-base.set",
"position": [
2000,
560
],
"typeVersion": 3
},
{
"parameters": {
"documentId": "={{ $('Configuration').first().json.spreadsheetId }}",
"sheetName": "Jobs",
"options": {}
},
"id": "update-status",
"name": "\ud83d\udcdd Update Job Status",
"type": "n8n-nodes-base.googleSheets",
"position": [
2208,
560
],
"typeVersion": 4
},
{
"parameters": {
"operation": "sendEmail"
},
"id": "send-notification",
"name": "\ud83d\udce7 Send Application Notification",
"type": "n8n-nodes-base.gmail",
"position": [
2432,
560
],
"typeVersion": 2
},
{
"parameters": {
"content": "## \ud83d\udcc8 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.",
"height": 204,
"width": 329,
"color": 7
},
"id": "status-tracking-info",
"name": "\ud83d\udcca Status Tracking Info",
"type": "n8n-nodes-base.stickyNote",
"position": [
368,
832
],
"typeVersion": 1
},
{
"parameters": {},
"id": "status-trigger",
"name": "\ud83d\udd50 Status Check Trigger",
"type": "n8n-nodes-base.cron",
"position": [
240,
1072
],
"typeVersion": 1
},
{
"parameters": {
"documentId": "={{ $('Configuration').first().json.spreadsheetId }}",
"sheetName": "Jobs",
"options": {}
},
"id": "read-applied",
"name": "\ud83d\udcd6 Read Applied Jobs",
"type": "n8n-nodes-base.googleSheets",
"position": [
448,
1072
],
"typeVersion": 4
},
{
"parameters": {
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "applied-filter",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.Status }}",
"rightValue": "Applied"
}
]
},
"options": {}
},
"id": "filter-applied",
"name": "\ud83c\udfaf Filter Applied Jobs",
"type": "n8n-nodes-base.filter",
"position": [
672,
1072
],
"typeVersion": 2
},
{
"parameters": {
"options": {
"reset": false
}
},
"id": "split-status",
"name": "\ud83d\udd04 Check Status One by One",
"type": "n8n-nodes-base.splitInBatches",
"position": [
896,
1072
],
"typeVersion": 3
},
{
"parameters": {
"options": {}
},
"id": "mock-status-check",
"name": "\ud83d\udd0d Mock Status Check",
"type": "n8n-nodes-base.set",
"position": [
1120,
1072
],
"typeVersion": 3
},
{
"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 }}"
}
]
},
"options": {}
},
"id": "status-changed",
"name": "\ud83d\udd04 Check if Status Changed",
"type": "n8n-nodes-base.if",
"position": [
1328,
1072
],
"typeVersion": 2
},
{
"parameters": {
"documentId": "={{ $('Configuration').first().json.spreadsheetId }}",
"sheetName": "Jobs",
"options": {}
},
"id": "update-changed",
"name": "\ud83d\udcdd Update Changed Status",
"type": "n8n-nodes-base.googleSheets",
"position": [
1552,
1072
],
"typeVersion": 4
},
{
"parameters": {
"operation": "sendEmail"
},
"id": "send-status-update",
"name": "\ud83d\udce7 Send Status Update",
"type": "n8n-nodes-base.gmail",
"position": [
1776,
1072
],
"typeVersion": 2
}
],
"connections": {
"\ud83d\udd58 Daily Application Trigger": {
"main": [
[
{
"node": "\u2699\ufe0f Configuration",
"type": "main",
"index": 0
}
]
]
},
"\u2699\ufe0f Configuration": {
"main": [
[
{
"node": "\ud83d\udcd6 Read Jobs Sheet",
"type": "main",
"index": 0
}
]
]
},
"\ud83d\udcd6 Read Jobs Sheet": {
"main": [
[
{
"node": "\ud83c\udfaf Filter Pending Applications",
"type": "main",
"index": 0
}
]
]
},
"\ud83c\udfaf Filter Pending Applications": {
"main": [
[
{
"node": "\ud83d\udd04 Process Jobs One by One",
"type": "main",
"index": 0
}
]
]
},
"\ud83d\udd04 Process Jobs One by One": {
"main": [
[
{
"node": "\ud83d\udcdd Prepare Application Data",
"type": "main",
"index": 0
}
]
]
},
"\ud83d\udcdd Prepare Application Data": {
"main": [
[
{
"node": "\ud83d\udd00 Route by Platform",
"type": "main",
"index": 0
}
]
]
},
"\ud83d\udd00 Route by Platform": {
"main": [
[
{
"node": "\ud83d\udcbc Apply via LinkedIn",
"type": "main",
"index": 0
}
],
[
{
"node": "\ud83d\udd0d Apply via Indeed",
"type": "main",
"index": 0
}
]
]
},
"\ud83d\udcbc Apply via LinkedIn": {
"main": [
[
{
"node": "\ud83d\udcca Process Application Result",
"type": "main",
"index": 0
}
]
]
},
"\ud83d\udd0d Apply via Indeed": {
"main": [
[
{
"node": "\ud83d\udcca Process Application Result",
"type": "main",
"index": 0
}
]
]
},
"\ud83d\udcca Process Application Result": {
"main": [
[
{
"node": "\ud83d\udcdd Update Job Status",
"type": "main",
"index": 0
}
]
]
},
"\ud83d\udcdd Update Job Status": {
"main": [
[
{
"node": "\ud83d\udce7 Send Application Notification",
"type": "main",
"index": 0
}
]
]
},
"\ud83d\udd50 Status Check Trigger": {
"main": [
[
{
"node": "\ud83d\udcd6 Read Applied Jobs",
"type": "main",
"index": 0
}
]
]
},
"\ud83d\udcd6 Read Applied Jobs": {
"main": [
[
{
"node": "\ud83c\udfaf Filter Applied Jobs",
"type": "main",
"index": 0
}
]
]
},
"\ud83c\udfaf Filter Applied Jobs": {
"main": [
[
{
"node": "\ud83d\udd04 Check Status One by One",
"type": "main",
"index": 0
}
]
]
},
"\ud83d\udd04 Check Status One by One": {
"main": [
[
{
"node": "\ud83d\udd0d Mock Status Check",
"type": "main",
"index": 0
}
]
]
},
"\ud83d\udd0d Mock Status Check": {
"main": [
[
{
"node": "\ud83d\udd04 Check if Status Changed",
"type": "main",
"index": 0
}
]
]
},
"\ud83d\udd04 Check if Status Changed": {
"main": [
[
{
"node": "\ud83d\udcdd Update Changed Status",
"type": "main",
"index": 0
}
]
]
},
"\ud83d\udcdd Update Changed Status": {
"main": [
[
{
"node": "\ud83d\udce7 Send Status Update",
"type": "main",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Raw. Uses googleSheets, httpRequest, gmail. Scheduled trigger; 24 nodes.
Source: https://gist.github.com/striversahil/e6749a66caea8da384b10034eee3a645 — 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.
YOUR_ID 4. Uses gmail, googleDrive, googleSheets, httpRequest. Scheduled trigger; 53 nodes.
Looking for a way to track GitHub bounty issues automatically and get notified in real time? This GitHub Bounty Tracker workflow monitors repositories for issues labeled 💎 Bounty, logs them in Google
This workflow automatically sends a beautifully designed HTML newsletter every Sunday at 8 AM, featuring products currently on sale from your Algolia-powered e-commerce store.
This n8n template demonstrates how to build a Auto Lead Gen & Outreach System for Local Businesses specifically designed to help businesses that don’t have a website yet.
I created this workflow with care for marketing professionals and agencies who manage multiple Meta Ads (Facebook) accounts and want to track ad account balances automatically — no more logging in eve