AutomationFlowsEmail & Gmail › Raw

Raw

Raw. Uses googleSheets, httpRequest, gmail. Scheduled trigger; 24 nodes.

Cron / scheduled trigger★★★★☆ complexity24 nodesGoogle SheetsHTTP RequestGmail
Email & Gmail Trigger: Cron / scheduled Nodes: 24 Complexity: ★★★★☆ Added:

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 →

Download .json
{
  "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
          }
        ]
      ]
    }
  }
}
Pro

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 →

More Email & Gmail workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Email & Gmail

YOUR_ID 4. Uses gmail, googleDrive, googleSheets, httpRequest. Scheduled trigger; 53 nodes.

Gmail, Google Drive, Google Sheets +1
Email & Gmail

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

Google Sheets, HTTP Request, WhatsApp +1
Email & Gmail

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.

Google Sheets, HTTP Request, Gmail
Email & Gmail

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.

Google Sheets, HTTP Request, Google Drive +1
Email & Gmail

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

HTTP Request, Google Sheets, Gmail