* feat(post-application): add schema and shared types for provider ingestion (#136) * test(orchestrator): ensure full localStorage shape in vitest setup * feat(post-application): add provider registry and dispatcher framework (#137) (#146) * Implement Gmail provider credential persistence (#147) * Add unified post-application provider action API (#148) * Implement Gmail ingestion sync with 95/60 relevance policy * Implement Gmail ingestion sync with 95/60 relevance policy (#149) * feat(post-application): add job mapping engine with llm rerank fallback * feat(post-application): add inbox review APIs with transactional approve/deny (#151) * feat(post-application): add tracking inbox UI with provider controls (#152) * oauth implementation * UI changes * see past runs in more detail * occurred at comes from email * state mismatch * better UI representation * comments * comments * comments * comments * documentation * explainer * set things manually * scrolling * any found email can be pending * searchable download * Email-to-Job Matching Decision Tree * email viewer list improvement * simplification initial commit * exclude discovered jobs * show only resady * dropdown * mermaid * syntax * targets is the same as logging that is done manually * event label * duplicate avoidance * clean up html * token saving * print * send idx not uuid * remove logging * formatting * better documentation * documentation * comments * process all * comments
7.9 KiB
7.9 KiB
Post-Application Email Tracking
The Post-Application Tracking feature (also called "Tracking Inbox") automatically monitors your Gmail for job application responses and updates your job timeline accordingly.
Overview
After you've applied to jobs, keeping track of responses can be tedious. This feature automates that process by:
- Scanning your Gmail for recruitment-related emails
- Matching emails to your tracked job applications using AI
- Updating your timeline with interview invites, offers, rejections, and updates
- Asking for your review when the AI is uncertain
How It Works
The Smart Router Flow
flowchart TD
A[Recruitment email arrives in Gmail] --> B[Smart Router AI analyzes content]
B --> C{How confident is the match?}
C -->|95-100%| D[Auto-linked to job]
D --> E[Timeline updated automatically]
C -->|50-94%| F[Goes to Inbox for review<br/>with suggested job match]
C -->|<50%| G{Is it relevant?}
G -->|Yes| H[Goes to Inbox as orphan<br/>relevant but job unclear]
G -->|No| I[Ignored - not job-related]
F --> J{You review in Inbox}
H --> J
J -->|Approve| K[Linked to selected job<br/>Timeline updated]
J -->|Ignore| L[Marked as not relevant]
What the AI Analyzes
For each email, the Smart Router evaluates:
- Content Relevance: Is this email about a job application lifecycle?
- Job Matching: Which of your "Applied" or "Processing" jobs does this relate to?
- Message Type:
- Interview invitation (phone screen, technical, onsite)
- Offer received
- Rejection/withdrawal
- General update/status change
- Confidence Score: 0-100% certainty of the match
Processing Outcomes
| Confidence | Processing | Your Action Required |
|---|---|---|
| 95-100% | Auto-linked to job | None - appears in timeline automatically |
| 50-94% | Pending review with suggestion | Quick approve/ignore in Inbox |
| <50% (relevant) | Pending review as orphan | Approve with manual job selection |
| <50% (not relevant) | Ignored | None - filtered out |
Setup
Prerequisites
- Gmail account with job application emails
- Google OAuth credentials (see below)
Step 1: Create Google OAuth Credentials
- Go to Google Cloud Console
- Create a new project or select existing
- Enable the Gmail API
- Configure OAuth consent screen:
- User Type: External
- Fill in app name, user support email, developer contact
- Add scope:
https://www.googleapis.com/auth/gmail.readonly - Add test users (your email)
- Create OAuth 2.0 Client ID:
- Application type: Web application
- Authorized redirect URIs:
http://localhost:3005/oauth/gmail/callback(local)https://your-domain.com/oauth/gmail/callback(production)
- Copy the Client ID and Client Secret
Step 2: Configure Environment Variables
Set these in your JobOps environment:
GMAIL_OAUTH_CLIENT_ID=your-client-id.apps.googleusercontent.com
GMAIL_OAUTH_CLIENT_SECRET=your-client-secret
# Optional - defaults to /oauth/gmail/callback on current host
GMAIL_OAUTH_REDIRECT_URI=https://your-domain.com/oauth/gmail/callback
Step 3: Connect Gmail in the UI
- Restart JobOps with the new environment variables
- Navigate to Tracking Inbox in the dashboard
- Click Connect Gmail
- Authorize JobOps to access your Gmail (read-only scope)
- You're connected! The system will now sync emails automatically
Using the Tracking Inbox
Reviewing Pending Items
When emails need your review, they appear in the Inbox:
- Go to Tracking Inbox → Inbox tab
- Each item shows:
- Sender and subject
- AI confidence score
- Suggested job match (if available)
- Message type (interview, offer, etc.)
- Choose an action:
- Approve: Links to the suggested job (or select a different one)
- Ignore: Marks as not relevant
Understanding Confidence Scores
- Green (95-100%): High confidence, auto-processed
- Yellow (50-94%): Moderate confidence, needs review
- Red (<50%): Low confidence or unclear match
Timeline Updates
When you approve an email (or it's auto-approved), the system:
- Creates a timeline event for the job
- Updates the job stage (e.g., "Interview Scheduled", "Offer Received")
- Records the event date from the email
Privacy & Security
What Data is Sent to AI
Only minimal job metadata is sent for matching:
- Company name
- Job title
- Snippets of email content
Gmail Permissions
- Scope:
gmail.readonlyonly - Access: Read-only, cannot send/delete emails
- Data Storage: Email metadata stored locally in your SQLite database
Data Retention
- Sync history retained for debugging
- You can disconnect Gmail at any time
- All email data is local to your instance
Troubleshooting
Common Issues
"No refresh token" error
- Disconnect and reconnect Gmail
- This forces a fresh consent flow
Emails not appearing
- Check sync run history in Tracking Inbox → Runs
- Verify Gmail OAuth credentials are correct
- Ensure email subjects match recruitment keywords
Wrong job matches
- This is expected for low-confidence matches
- Use the Inbox to correct matches
Viewing Sync History
Go to Tracking Inbox → Runs to see:
- When syncs ran
- How many messages were discovered
- How many were auto-linked vs. pending review
- Any errors that occurred
Configuration
Environment Variables
| Variable | Required | Description |
|---|---|---|
GMAIL_OAUTH_CLIENT_ID |
Yes | Google OAuth client ID |
GMAIL_OAUTH_CLIENT_SECRET |
Yes | Google OAuth client secret |
GMAIL_OAUTH_REDIRECT_URI |
No | Custom redirect URI (optional) |
Advanced Settings
Currently, the feature uses sensible defaults:
- Searches last 30 days of emails
- Looks for recruitment-related keywords in subjects
- Processes up to 100 messages per sync
- Runs automatically when you open the Tracking Inbox
API Reference
REST Endpoints
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/post-application/inbox |
List pending messages |
| POST | /api/post-application/inbox/:id/approve |
Approve message |
| POST | /api/post-application/inbox/:id/deny |
Ignore message |
| GET | /api/post-application/runs |
List sync runs |
| POST | /api/post-application/gmail/connect |
Start OAuth flow |
| GET | /api/post-application/gmail/callback |
OAuth callback |
Example: Approve an Inbox Item
curl -X POST http://localhost:3005/api/post-application/inbox/msg_123/approve \
-H "Content-Type: application/json" \
-d '{
"jobId": "job_456",
"note": "Phone screen scheduled"
}'
Best Practices
- Review regularly: Check your Inbox weekly to stay on top of pending matches
- Be decisive: Approve or ignore items quickly to keep your Inbox clean
- Correct mismatches: If the AI suggests the wrong job, select the correct one when approving
- Monitor sync runs: Check the Runs tab occasionally to ensure syncing is working
- Privacy first: Remember only minimal job data is sent to AI - your email content stays private
Future Enhancements
Potential improvements planned:
- Multiple email provider support (Outlook, etc.)
- IMAP support for non-Gmail accounts
- Calendar integration for interview scheduling