Your job hunt,
finally tidy.
Find a job anywhere. Click Save. ApplyFlow fills company, role & URL directly into your personal Google Sheet — zero middleman databases, no accounts needed.
| Date Applied | Company | Job Role | Status |
|---|
How it works
Three dead-simple steps. No database middleman. No new SaaS to log into.
Find any job opening
Browse jobs on LinkedIn, Indeed, Greenhouse, Lever, or any company careers page as you normally do.
Click Save in ApplyFlow
Open the extension popup with one shortcut. Company name, job title, and link auto-populate in milliseconds.
Review your Google Sheet
A clean, formatted row appears in your personal Google Sheet instantly. Own your career data forever.
See the real browser experience
Follow every single click: from Google search to extension setup, Apps Script deployment, and 1-click LinkedIn capture.
Google & Extensions Menu
Starting from your daily browser page, open the Chrome menu, hover over Extensions, and click Manage Extensions.
Setup in 2 minutes
No complex OAuth or server setup. Paste one Google Apps Script, click Deploy, and you're ready.
-
Create a new Google Sheet
Navigate to sheets.new (opens in a new tab) and name the document My Job Tracker.
-
Open Google Apps Script Editor
In your new Google Sheet menu bar, click Extensions → Apps Script. Clear any sample code in the editor.
-
Paste the Webhook Code
Copy the complete code snippet below, paste into
Code.gs, and press Save (Ctrl+S or ⌘S). -
Deploy as a Web App
Click Deploy → New deployment. Select type Web app. Set Execute as: Me and Who has access: Anyone. Click Deploy and copy the generated Web App URL.
-
Save Webhook in ApplyFlow
Open ApplyFlow extension → click Settings → paste your Web App URL into the Google Sheet field → click Save.
Privacy guarantee: "Anyone" allows your local browser extension to send rows directly to your private Sheet without OAuth overhead. The endpoint URL remains confidential to you.
/**
* ApplyFlow — Personal Google Apps Script Webhook
* Paste into Code.gs, Save, then Deploy as Web App.
*/
function doPost(e) { return handleJobLog(e); }
function doGet(e) {
if (e && e.parameter && (e.parameter.data || e.parameter.companyName))
return handleJobLog(e);
return ContentService.createTextOutput("ApplyFlow webhook is active!")
.setMimeType(ContentService.MimeType.TEXT);
}
function handleJobLog(e) {
try {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
if (sheet.getLastRow() === 0) {
sheet.appendRow(["Date Applied", "Company Name", "Job Role", "Dashboard Link", "Status", "Location", "Notes"]);
var header = sheet.getRange(1, 1, 1, 7);
header.setFontWeight("bold");
header.setBackground("#0F172A");
header.setFontColor("#FFFFFF");
sheet.setFrozenRows(1);
}
var data = {};
if (e && e.postData && e.postData.contents) {
try { data = JSON.parse(e.postData.contents); } catch(err){}
}
if (!data.companyName && e && e.parameter) {
if (e.parameter.data) try { data = JSON.parse(decodeURIComponent(e.parameter.data)); } catch(err){}
else if (e.parameter.companyName) data = e.parameter;
}
var d = data.dateApplied ? new Date(data.dateApplied).toLocaleString() : new Date().toLocaleString();
sheet.appendRow([
d,
data.companyName || 'N/A',
data.jobRole || 'N/A',
data.dashboardLink || '',
data.status || 'Applied',
data.location || '',
data.notes || ''
]);
return ContentService.createTextOutput(JSON.stringify({ status: "success" }))
.setMimeType(ContentService.MimeType.JSON);
} catch (err) {
return ContentService.createTextOutput(JSON.stringify({ status: "error", message: err.toString() }))
.setMimeType(ContentService.MimeType.JSON);
}
}
Load the Chrome Extension
Clone from GitHub (opens in a new tab) or load from your local directory.
- Open Chrome and navigate to
chrome://extensions - Toggle Developer mode in the top right corner
- Click Load unpacked and select this project's root folder
Quiet by design
Everything you need to stay organized, without notifications or clutter.
Session Hunt Timer
Track active application sprints. Background worker maintains accurate state even when the popup closes.
Smart Page Parsing
Intelligently detects company, job role, and clean job URLs across LinkedIn, Indeed, Lever, Greenhouse, and Workday.
Gentle Submit Nudges
Detects when you click "Apply" or submit a job application form and offers a polite prompt to log it to Sheets.
Offline Cache & Queue
Saves all submissions to Chrome local storage first. If you lose connection, applications sync automatically once back online.
Daily Goal Counter
Glanceable badge counter on your browser extension toolbar icon shows how many jobs you applied to today.
1-Click CSV Export
Export your application history anytime into standard CSV format for Notion, Airtable, Excel, or custom backup.