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.

Works seamlessly with
LinkedIn Indeed Greenhouse Lever Workday Any Career Page
Live Interactive Sandbox
Edit on the left Watch your Sheet update in real-time
ApplyFlow Sheet Connected
Session Hunt Active timer
00:14:32
My Job Tracker
Google Sheets • Synced via Webhook
Private to you
Date Applied Company Job Role Status
3 applications
Quick test data:
Zero Learning Curve

How it works

Three dead-simple steps. No database middleman. No new SaaS to log into.

01

Find any job opening

Browse jobs on LinkedIn, Indeed, Greenhouse, Lever, or any company careers page as you normally do.

02

Click Save in ApplyFlow

Open the extension popup with one shortcut. Company name, job title, and link auto-populate in milliseconds.

03

Review your Google Sheet

A clean, formatted row appears in your personal Google Sheet instantly. Own your career data forever.

End-to-End Walkthrough

See the real browser experience

Follow every single click: from Google search to extension setup, Apps Script deployment, and 1-click LinkedIn capture.

🔍 Google
📊 My Job Tracker - Sheets
https://www.google.com
00:00 / 00:42
STEP 1 OF 7

Google & Extensions Menu

Starting from your daily browser page, open the Chrome menu, hover over Extensions, and click Manage Extensions.

5-Minute Setup

Setup in 2 minutes

No complex OAuth or server setup. Paste one Google Apps Script, click Deploy, and you're ready.

  1. Create a new Google Sheet

    Navigate to sheets.new (opens in a new tab) and name the document My Job Tracker.

  2. Open Google Apps Script Editor

    In your new Google Sheet menu bar, click Extensions → Apps Script. Clear any sample code in the editor.

  3. Paste the Webhook Code

    Copy the complete code snippet below, paste into Code.gs, and press Save (Ctrl+S or ⌘S).

  4. 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.

  5. 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.
Code.gs Google Apps Script
/**
 * 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);
  }
}
✨ Automatically initializes styled headers and frozen row on first save.

Load the Chrome Extension

Clone from GitHub (opens in a new tab) or load from your local directory.

  1. Open Chrome and navigate to chrome://extensions
  2. Toggle Developer mode in the top right corner
  3. Click Load unpacked and select this project's root folder
Crafted with Care

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.