Automatically track your job applications by scanning Gmail confirmation emails and creating entries in a Notion database.
✅ Automatic Email Scanning
- Scans Gmail hourly for job application confirmation emails
- Detects applications from LinkedIn, Indeed, Glassdoor, and major ATS platforms
- Extracts company name, position, application date, and source
✅ Smart Status Management
- Auto-updates entries from "In progress" → "Applied" when confirmation emails arrive
- Prevents duplicate entries
✅ URL Scraping
- Paste job URLs before applying
- Automatically scrapes and populates company, position, and location details
- Works with LinkedIn, Indeed, Greenhouse, Lever, and more
✅ Notion Integration
- Clean database with Position as the main field
- Proper job application statuses (Applied, Screening, Interview, Offer, Rejected, Ghosted)
- Tracks URLs, locations, application dates, and notes
- Gmail account
- Notion account
- Google Apps Script access
- Go to https://www.notion.so/my-integrations
- Click + New integration
- Name it "Job Application Tracker"
- Select your workspace
- Click Submit
- Copy the Internal Integration Token (starts with
secret_)
- Go to https://script.google.com
- Click + New project
- Name it "Job Application Tracker"
- Delete the default code
- Copy and paste the entire contents of
Code.gsfrom this repository - Click Save (Ctrl+S / Cmd+S)
- Click the ⚙ gear icon (Project Settings)
- Scroll to Script Properties
- Click Add script property and add:
| Property | Value |
|---|---|
NOTION_TOKEN |
Your integration token from step 1 |
- Go back to the Editor tab
- Select
testSetupfrom the function dropdown - Click Run
- Click Review permissions
- Select your Google account
- Click Advanced → Go to Job Application Tracker (unsafe)
- Click Allow
- Select
createNewDatabasefrom the function dropdown - Click Run
- Check the Execution log (View → Executions)
- Copy the database ID from the log
- Select
completeSetupfrom the function dropdown - In the code editor, temporarily add this at the bottom:
function runSetup() { completeSetup("YOUR-DATABASE-ID-HERE"); }
- Replace
YOUR-DATABASE-ID-HEREwith the ID from step 5 - Select
runSetupand click Run - Delete the
runSetupfunction after it completes
- Select
setupTriggerfrom the function dropdown - Click Run
Done! The script will now scan your Gmail every hour automatically.
Once set up, the script runs every hour automatically:
- Scans last 24 hours of Gmail
- Finds job application confirmations
- Creates Notion entries OR updates existing ones
- Labels processed emails as "JobTracker/Processed"
-
Add a row in Notion with:
- Position: (leave blank or "Unknown")
- Company: (leave blank or "Unknown")
- Job URL: (paste the job posting URL)
- Status: "In progress"
-
Run
scrapeJobURLsin Apps Script to auto-populate:- Company name
- Position title
- Location
-
When you apply, the confirmation email will:
- Find your existing entry
- Update status to "Applied"
- No duplicates!
To manually scan emails:
- Run
scanEmailsAndCreateEntries- scans last 24 hours - Run
manualScan- scans last 7 days
- Indeed
- Glassdoor
- ZipRecruiter
- Monster
- CareerBuilder
- Greenhouse
- Lever
- Workday
- SmartRecruiters
- iCIMS
- Jobvite
- BambooHR
- Ashby
- JazzHR
- Taleo
- SuccessFactors
- Workable
| Property | Type | Description |
|---|---|---|
| Position | Title | Job title (main field) |
| Company | Text | Company name |
| Status | Select | Applied, Screening, Interview, Offer, Rejected, Ghosted |
| Application Date | Date | When you applied |
| Source | Select | LinkedIn, Indeed, Company Website, etc. |
| Job URL | URL | Link to job posting |
| Location | Text | Job location |
| Email Subject | Text | Original confirmation email subject |
| Notes | Text | Your notes |
Edit the EMAIL_PATTERNS array in Code.gs to add support for new job boards or ATS platforms.
Modify the setupTrigger function:
.everyHours(2)for every 2 hours.everyMinutes(30)for every 30 minutes (not recommended).everyDays(1).atHour(9)for daily at 9 AM
Change HOURS_TO_SCAN in the getConfig() function:
- Default:
24(1 day) - For weekly:
168(7 days)
- Check execution logs: Executions in left sidebar
- Verify email subject matches patterns
- Run
diagnosticScanto see what emails are found - Check if emails already have "JobTracker/Processed" label
- 401 Unauthorized: Invalid or expired integration token
- 404 Not Found: Database ID incorrect or integration not connected to database
- 400 Validation Error: Database schema doesn't match (check Status field type)
The script labels processed emails. If you see duplicates:
- Labels were removed from emails
- Run
clearProcessedLabelsthen re-scan
- Your Notion token is stored in Script Properties (encrypted by Google)
- The script only reads email metadata for job application detection
- Only writes to your specified Notion database
- No data is sent to third parties
- All processing happens in your Google Apps Script environment
Issues and pull requests welcome! To contribute:
- Fork the repository
- Create a feature branch
- Make your changes
- Test thoroughly
- Submit a pull request
MIT License - feel free to use and modify for your job search!
Built with ❤️ to help job seekers stay organized.
If this helped you land a job, consider giving it a ⭐ on GitHub!
- Initial release
- Automatic email scanning
- Notion database integration
- URL scraping feature
- Smart status updates
- Support for major job boards and ATS platforms