Google Sheets Tracker Template
An automated Google Apps Script tool that helps you track and manage your job applications by scanning your Gmail inbox. Originally created by Adam Rangwala; this fork keeps the original idea and adds reliability-focused improvements for larger inboxes.
The Job Application Tracker is a powerful Google Apps Script application that automatically scans your Gmail inbox for job application-related emails and organizes them into a structured Google Sheets dashboard. It detects different application statuses, extracts company and job title information, automatically generates draft replies to rejections and provides insightful visualizations of your job search progress.
- Automatic Email Scanning: Detects job application emails, interview invitations, assessments, and offer/rejection notices
- Smart Data Extraction: Extracts job titles, company names, and status updates from email content
- Status Tracking: Automatically categorizes applications into statuses like "Applied," "Assessment," "Interview Request," "Offer Received," or "Rejected"
- Dynamic Dashboard: Visualizes your application data with charts and graphs
- Follow-up Tools: Creates draft emails to follow up on rejections to maintain professional connections
- Application Insights: Analyzes job titles, application timing, and success rates
- Fully Automated: Runs daily to keep your application tracking up-to-date
- Bounded Scans: Processes Gmail in resumable batches so a large inbox does not exhaust Apps Script runtime
- Privacy-Conscious Logs: Reports compact counters instead of raw email bodies or sensitive URLs
- A Google account
- A Gmail account used for submitting job applications
Option 1: Use the Templateand follow the instructions
Option 2: Set up the the Extension yourself using the JS files in this repository
- Create a new Google Sheet
- Name the first sheet "Instructions" and the second sheet "Applications"
- Click on "Extensions" > "Apps Script" to open the script editor
- Copy and paste each of the script files from this repository into separate script files in the Apps Script editor:
main.gs(Main script)extractionUtils.gs(Company and job title extraction)statusUtils.gs(Application status detection)spreadsheetUtils.gs(Spreadsheet formatting)scanUtils.gs(batching, query construction, resume state, skip rules)testFixtures.gs(callable regression tests)applicationInsights.gs(Analytics tools)jobTitleVisualization.gs(Job title analysis)
- Save all files
- Return to your spreadsheet and refresh the page
- After refreshing, you should see a new menu item called "Job Tracker"
- Click on "Job Tracker" > "Scan Emails" to run a normal recent scan
- Click on "Job Tracker" > "Import Historical Emails" to process older backfill batches
- Allow the necessary permissions when prompted
- The script will automatically set up your spreadsheet with the correct headers and formatting
- To enable daily automatic scanning, click "Job Tracker" > "Set up daily scanning"
The tool can automatically create draft emails for rejected applications to help you maintain professional relationships. To use this feature:
- Click "Job Tracker" > "Create Rejection Follow-up Drafts"
- Review the created drafts in your Gmail drafts folder
- Personalize and send as appropriate
- Email Detection: The script uses a grouped Gmail search query with exclusions for common noise
- Information Extraction: For each relevant email, it extracts:
- Job title from the subject and body
- Company name from the sender and content
- Current application status based on email content
- Status Updates: When follow-up emails arrive, it updates the status of existing applications
- Visualization: Refreshes charts on demand so expensive presentation work does not slow ingestion
The scanner now separates fast ingestion from dashboard refreshes, processes a fixed batch at a time, and saves progress between runs. Normal scans use timestamp windows with a one-day overlap so newly arriving mail cannot shift the resume point; historical imports move through older thirty-day windows. Intentional overlap may re-read a few emails, but thread/application dedupe prevents duplicate rows. The changes were made because Apps Script has strict execution limits and Gmail searches can easily return hundreds of matching emails.
- Bounded batches (50 threads by default) with resumable timestamp windows in
PropertiesService - A global, grouped query with exclusions for digests, promotions, password resets, and obvious bulk noise
- Skip rules before expensive parsing
- Batched insertion of new rows and reduced hot-path formatting work
- Targeted parsing for LinkedIn and Rogers/SuccessFactors-style confirmations
- Corrected status priority: offer → interview → assessment → rejection → applied/status update
Classification policy:
- Production uses deterministic regex/rule classification only.
- Gemini is audit-only.
- PASS includes submitted applications, specific application status updates, interviews, assessments, offers, rejections, referrals, user-sent application/recruiter responses, and personalized recruiter outreach.
- SKIP includes job alerts/digests/newsletters, career advice/marketing, generic candidate account/profile setup, OTP/security notices, non-employment applications, consumer/financial/education/government/community workflows, and career-services/coaching/workshop administration.
- Gmail result sets can be noisy and broad terms create false positives
- Large initial backfills can exceed runtime limits
- Some application emails use abbreviated titles or atypical body layouts
- Raw parser logging can leak private email content into cloud logs
The tracker categorizes applications into the following statuses:
- Applied: Initial application confirmation
- Status Update: General updates without a specific status change
- Assessment: Technical assessments or skills tests
- Interview Request: Invitations for interviews
- Offer Received: Job offers
- Rejected: Application rejections
The summary dashboard provides insights into your job search:
- Application activity timeline
- Applications by company
- Job title analysis
- Seniority level distribution
- Application funnel analysis
- Day-of-week application patterns
You can customize the script by modifying:
- Email Search Query: Adjust the query builder in
scanUtils.gsto refine which emails are detected - Status Detection Keywords: Modify the status detection patterns in
statusUtils.gs - Company/Job Title Extraction: Update extraction patterns in
extractionUtils.gs
If the script runs but no applications appear:
- Ensure you've granted the script permission to access Gmail and Google Sheets
- Check that your sheet is named "Applications" (case-sensitive)
- Manually test the Gmail search query from
buildGmailSearchQuery('recent')to make sure it finds job application emails - Check the logs in the Apps Script editor for any errors
If you're having trouble with permissions:
- Go to your Google Account's security settings
- Remove the script's access
- Run the script again and reauthorize
Contributions to improve the Job Application Tracker are welcome! Please feel free to submit a pull request or open an issue to suggest improvements. Feedback: Please use the feedback form to provide quick 2 minutes of feedback for me to help improve the app.
This project is licensed under the MIT License - see the LICENSE file for details.
- Original project and core tracker concept by Adam Rangwala
- Built using Google Apps Script
- Inspired by the challenges of managing a modern job search process
Run runTrackerTests() in the Apps Script editor after copying files. It covers representative LinkedIn confirmations and digests, Rogers-style confirmations, low-confidence titles, skip behavior, and status classification.
The regression harness includes a golden corpus for LinkedIn application confirmations, recruiter outreach, referrals, non-job application noise, OTP/security noise, extraction, and date-aware status updates. Production scans use deterministic regex/rule classification; Gemini is only used by the BroadGapLLM audit tool.
