Case Study - AI-Powered Job Application Pipeline: Scrape, Score, Tailor, Submit

An automated system that scrapes job listings, scores them against candidate profiles, tailors applications with AI, and submits them across multiple ATS platforms.

Client
A Leading US Job Platform
Timeline
6 weeks
Impact
10x throughput, 3x response rate

Why most job application automation fails

The idea of automating job applications is not new. Dozens of browser extensions and bots promise to "apply to 500 jobs while you sleep." The problem is that spray and pray does not work.

Generic automation tools suffer from three fundamental flaws. First, they apply to everything. Without a scoring layer, every listing gets the same treatment, flooding recruiters with irrelevant applications and tanking the sender's reputation. Second, they send the same CV and cover letter everywhere. No tailoring means no signal to recruiters that this candidate actually read the job description. Third, they offer no feedback loop. There is no way to know which applications were submitted, what documents were attached, or whether the submission even succeeded.

The result? Response rates below 2%. Worse, some ATS platforms flag accounts that submit dozens of identical applications, effectively blacklisting the candidate.

Key Insight

The bottleneck in job searching is not volume. It is relevance. A system that sends 50 highly tailored applications will outperform one that sends 500 generic ones every single time.

We set out to build the opposite: a pipeline where every application is scored, tailored, tracked, and auditable.

Stage 1: Multi-source scraping with deduplication

The first stage collects listings from multiple sources on a scheduled basis. Job boards, company career pages, and aggregator APIs all feed into a single normalized data model.

┌──────────────┐   ┌──────────────┐   ┌──────────────┐
│  Job Board A │   │  Career Pages│   │ Aggregator API│
└──────┬───────┘   └──────┬───────┘   └──────┬───────┘
       │                  │                   │
       └──────────────────┼───────────────────┘
                          ▼
                 ┌────────────────┐
                 │  Normalization │
                 │  + Enrichment  │
                 └───────┬────────┘
                         ▼
                 ┌────────────────┐
                 │ Deduplication  │
                 │ (title+company │
                 │  +location)    │
                 └───────┬────────┘
                         ▼
                 ┌────────────────┐
                 │ Excluded Co.   │
                 │ Filter         │
                 └───────┬────────┘
                         ▼
                 ┌────────────────┐
                 │ Listings DB    │
                 └────────────────┘

Deduplication is critical. The same role posted on LinkedIn, the company website, and three aggregators should appear exactly once. We deduplicate by normalizing the job title, company name, and location into a composite key. This prevents scoring the same listing multiple times and avoids duplicate submissions.

An excluded company filter runs at import time, removing listings from companies the candidate has blacklisted (previous bad experiences, known culture mismatches, or companies already in the pipeline). The entire stage is cron driven and fully deterministic: no LLM calls, no randomness, just reliable data collection.

Stage 2: LLM-powered scoring against candidate profiles

Raw listings enter the scoring stage, where each one is evaluated against a documented candidate profile. The key word here is "documented." Scoring based on vibes or gut feeling is not scoring. Every criterion must be explicit, weighted, and version controlled.

The LLM evaluates each listing across multiple dimensions and assigns a composite score. Based on configurable thresholds, listings are sorted into three tiers:

  • Tier 1 (auto apply): Strong match across all dimensions. These enter the tailoring stage automatically.
  • Tier 2 (human review): Partial match or ambiguous signals. A human reviews the scoring rationale and decides.
  • Tier 3 (skip): Poor match. Archived with the scoring output for later analysis.
What Works

Store every scoring decision with the full rationale. When you revisit your criteria in three months, you want to understand why a listing was rejected, not just that it was.

This tiered approach keeps humans in the loop for edge cases while automating the clear wins and clear passes.

Stage 3: Tailoring each application with AI

Listings that pass scoring enter the tailoring stage. This is where the system diverges most sharply from "one click apply" tools.

For each listing, the system generates a tailored application package. The CV is reordered to place the most relevant experience first. Skill descriptions are adjusted to mirror the language in the job posting. Projects are selected and emphasized based on relevance to the role.

A cover letter is generated with job specific content: why this company, why this role, what the candidate brings to this particular team. The LLM has access to the scoring output, so it knows exactly which dimensions matched and can articulate that fit clearly.

Every generated document is stored alongside the original listing as a snapshot. This is non negotiable. If a recruiter calls about a role you applied to three weeks ago, you need to know exactly what CV and letter they received.

application_record = {
    "listing_id": "abc-123",
    "score": 87,
    "tier": 1,
    "cv_snapshot": "cv_abc123_v2.pdf",
    "cover_letter": "cl_abc123.pdf",
    "submitted_at": "2026-02-14T09:32:00Z",
    "platform": "greenhouse",
    "confirmation_id": "GH-98712"
}

Stage 4: Automated submission across ATS platforms

The final stage handles the actual submission. This is where things get messy in practice.

For well known ATS platforms like Greenhouse and Lever, we built dedicated handlers. These interact with the form structure directly, filling fields deterministically. No guessing, no AI interpretation of form labels. Just structured mapping from the application record to the form fields.

For unknown or custom application portals, the system falls back to AI guided browser automation. A headless browser navigates the form, and an LLM interprets field labels, upload prompts, and confirmation pages in real time. Every action is logged with timestamps.

Common Mistake

Even "standard" ATS platforms are not standard. Greenhouse forms vary significantly between companies. Custom fields, different required attachments, conditional sections. Every handler needs graceful fallback logic.

After submission, the system verifies confirmation: checking for success pages, confirmation emails, or status changes in the applicant portal. Failed submissions are flagged for manual retry.

The scoring criteria that actually matter

Getting the scoring weights right is the difference between a useful system and an expensive spam machine. Here are the dimensions we found most predictive of positive recruiter response:

Dimension               Weight    Signal
─────────────────────────────────────────────────────
Skill match             30%       Required skills vs. candidate profile
Role seniority fit      20%       Avoiding over/under qualification
Location compatibility  15%       Remote, hybrid, relocation feasibility
Salary range overlap    15%       Listed range vs. candidate expectations
Company stage/size      10%       Startup vs. enterprise preference
Tech stack alignment    10%       Beyond required skills: ecosystem fit

Skill match carries the highest weight, but seniority fit is a close second. Applying for roles two levels below your experience triggers rejection just as reliably as applying two levels above. Location and salary act as hard filters in practice, even when technically weighted. A role with zero location overlap scores near zero regardless of other dimensions.

Results and what surprised us

The pipeline increased application throughput by 10x compared to manual effort. More importantly, tailored applications achieved a 3x improvement in recruiter response rates. That second number matters far more. Volume without response is just noise.

The biggest surprise was ATS inconsistency. We expected that building handlers for Greenhouse and Lever would cover the majority of applications cleanly. In reality, even companies using the same ATS configure their forms differently. Custom questions, different file upload requirements, conditional fields based on location or visa status. Each "standard" form turned out to be semi custom, requiring the handlers to be far more flexible than initially planned.

The second surprise was that tailoring quality mattered more than we expected. Early versions of the system focused on throughput. When we shifted resources from submission speed to tailoring depth (better CV reordering, more specific cover letters), the response rate improved more than any other single change.

If you are building automation for high stakes, high volume workflows and want to get the architecture right, reach out. We have done this before.

What we did

  • Multi-Source Scraping
  • LLM Scoring
  • CV Tailoring
  • ATS Integration
  • Playwright Automation
  • Application Tracking

More case studies

AI Research Platform with ETL, RAG, and Natural Language Data Access

We built a platform that ingests data from 15+ sources into a unified database, then lets researchers chat with their data using RAG and MCP-powered tools.

Read more

AI-Powered Development: Setting Up Teams from Engineers to Business Users

We configured AI coding tools for a 30-person engineering team and built a separate AI-assisted environment for business users to contribute to internal tools.

Read more

Tell us about your project

Contact

  • Location
    Switzerland
  • Working
    Remote & On-site