Skip to content

Scoring Methodology

When you scan your resume, ATS Screener evaluates it against 6 platform profiles independently. Each profile is a mathematical model with its own weights, parsing strictness, keyword matching strategy, and platform-specific quirks.

The final score for each platform comes down to three steps:

  1. Score each of the 6 dimensions individually (0-100 each)
  2. Compute a weighted sum using that platform’s specific weight vector
  3. Apply quirk adjustments for platform-specific edge cases

Here’s the formal definition.

For a given platform pp, the overall score is:

Sp=clamp ⁣(0,  100,  i=16wi(p)di  +  Qp)S_p = \text{clamp}\!\left(0,\;100,\;\sum_{i=1}^{6} w_i^{(p)} \cdot d_i \;+\; Q_p\right)

where:

  • di[0,100]d_i \in [0, 100] is the score for dimension ii
  • wi(p)w_i^{(p)} is the weight assigned to dimension ii by platform pp
  • QpQ_p is the total quirk adjustment for platform pp (always 0\leq 0)
  • clamp(a,b,x)=max(a,min(b,x))\text{clamp}(a, b, x) = \max(a, \min(b, x))

The six dimensions d1d_1 through d6d_6 are:

IndexDimensionWhat It Measures
d1d_1FormattingParser compatibility, layout cleanliness
d2d_2Keyword MatchTerm overlap with JD or industry standards
d3d_3Section CompletenessPresence of required resume sections
d4d_4Experience RelevanceBullet quality, action verbs, recency
d5d_5Education MatchDegree presence, field, date formatting
d6d_6QuantificationRatio of quantified achievement bullets

All platform weight vectors are normalized:

i=16wi(p)=1.0  p\sum_{i=1}^{6} w_i^{(p)} = 1.0 \quad \forall\; p

This means the weighted sum wi(p)di\sum w_i^{(p)} \cdot d_i produces a value in [0,100][0, 100] before quirk adjustments. I verified this for all 6 profiles in the codebase.

Each platform weighs the 6 dimensions differently. These weights come from researching how each platform actually behaves: strict keyword matchers like Taleo weight keywords heavily, while modern platforms like Lever care more about experience quality.

Platformw1w_1 (fmt)w2w_2 (kw)w3w_3 (sec)w4w_4 (exp)w5w_5 (edu)w6w_6 (quant)σ\sigmaStrategy
Workday0.250.300.150.150.100.050.90exact
Taleo0.200.350.150.150.100.050.85exact
iCIMS0.150.300.150.200.100.100.60fuzzy
Greenhouse0.100.250.100.250.100.200.40semantic
Lever0.080.220.100.300.100.200.35semantic
SuccessFactors0.250.250.200.150.100.050.85exact

σ\sigma is the parsing strictness parameter, which I’ll explain below. Bold values highlight the highest weight in that column.

A few things jump out from this table:

  • Taleo has the highest keyword weight (0.35). This tracks with reality: Taleo’s base configuration does literal boolean keyword matching.
  • Lever has the highest experience weight (0.30). Lever is designed around structured interview feedback, so experience quality matters more than keyword stuffing.
  • Greenhouse and Lever weight quantification at 0.20 while legacy systems barely care (0.05). Modern platforms value measurable impact.
  • Formatting ranges from 0.08 (Lever) to 0.25 (Workday/SuccessFactors). Makes sense: Lever uses a modern parser that handles most formats, while Workday’s parser is notoriously strict.

Say your resume scores: d=[85,70,90,75,80,60]d = [85, 70, 90, 75, 80, 60] across the six dimensions.

Workday:

S=(0.25)(85)+(0.30)(70)+(0.15)(90)+(0.15)(75)+(0.10)(80)+(0.05)(60)=21.25+21.0+13.5+11.25+8.0+3.0=78.00\begin{aligned} S &= (0.25)(85) + (0.30)(70) + (0.15)(90) \\ &\quad + (0.15)(75) + (0.10)(80) + (0.05)(60) \\ &= 21.25 + 21.0 + 13.5 + 11.25 + 8.0 + 3.0 \\ &= 78.00 \end{aligned}

Lever:

S=(0.08)(85)+(0.22)(70)+(0.10)(90)+(0.30)(75)+(0.10)(80)+(0.20)(60)=6.80+15.40+9.0+22.50+8.0+12.0=73.70\begin{aligned} S &= (0.08)(85) + (0.22)(70) + (0.10)(90) \\ &\quad + (0.30)(75) + (0.10)(80) + (0.20)(60) \\ &= 6.80 + 15.40 + 9.0 + 22.50 + 8.0 + 12.0 \\ &= 73.70 \end{aligned}

Same resume, different scores. The spread between the highest (SuccessFactors at 79.0) and lowest (Lever at 73.7) is 5.3 points, and it comes entirely from how each platform prioritizes different qualities. This is realistic since most ATS platforms care about broadly similar things but weight them differently.

Format scoring uses a deduction model: you start at 100 and lose points for each formatting issue. The penalty for each issue is scaled by the platform’s parsing strictness σ\sigma.

F=max ⁣(0,  min ⁣(100,  100kpkσ))F = \max\!\left(0,\;\min\!\left(100,\;100 - \sum_{k} p_k \cdot \sigma\right)\right)

where pkp_k is the base penalty for formatting issue kk and σ[0,1]\sigma \in [0, 1] is the platform’s parsing strictness.

IssueBase Penalty (pkp_k)Rationale
Multi-column layout15Parser reads text out of order
Tables detected12Content inside tables may be skipped
Images/graphics8Text in images is invisible to parsers
Pages > 25May be truncated
Word count < 15010Likely a parsing failure or empty resume
Word count > 15003Minor; consider trimming
Special char ratio > 5%8Encoding issues or bad PDF extraction
All-caps lines > 33Can confuse section detection
Inconsistent bullets (> 2 styles)2Minor formatting inconsistency

The key insight is that the same formatting issue hurts you differently depending on the platform. A multi-column layout on Workday (σ=0.90\sigma = 0.90) costs you 15×0.90=13.515 \times 0.90 = 13.5 points, but on Lever (σ=0.35\sigma = 0.35) it only costs 15×0.35=5.2515 \times 0.35 = 5.25 points.

Worst case (every issue present at once):

Total base penalty=15+12+8+5+10+3+8+3+2=66\begin{aligned} \text{Total base penalty} &= 15 + 12 + 8 + 5 + 10 \\ &\quad + 3 + 8 + 3 + 2 \\ &= 66 \end{aligned}
Platformσ\sigmaTotal DeductionFormat Score
Workday0.9059.440.6
Taleo0.8556.143.9
SuccessFactors0.8556.143.9
iCIMS0.6039.660.4
Greenhouse0.4026.473.6
Lever0.3523.176.9

Even the absolute worst-case resume doesn’t hit 0 on any platform, because σ0.90\sigma \leq 0.90 and the max penalty sum is 66, so the floor is 100(66×0.90)=40.6100 - (66 \times 0.90) = 40.6. The format score can only reach 0 if σ100/661.52\sigma \geq 100/66 \approx 1.52, which is impossible since σ[0,1]\sigma \in [0, 1].

This is probably the most important scoring dimension for job seekers, especially in targeted mode. Each platform uses one of three keyword matching strategies.

K=min ⁣(100,  M+0.8SJ×100)K = \min\!\left(100,\;\frac{|M| + 0.8 \cdot |S|}{|J|} \times 100\right)

where:

  • MM = set of exact keyword matches between resume and JD
  • SS = set of synonym/partial matches (strategy-dependent)
  • JJ = set of distinct keywords extracted from the job description
  • If J=0|J| = 0 (no JD provided), K=100K = 100 by convention

The 0.8 coefficient on synonym matches is intentional. A synonym match is close but not as strong as an exact match. If the JD says “Project Manager” and your resume says “PM”, that’s a synonym match, worth 80% of a direct hit.

Exact (Workday, Taleo, SuccessFactors): Only populates MM. Synonym set S=S = \emptyset. You need the literal terms from the JD.

Kexact=min ⁣(100,  MJ×100)K_{\text{exact}} = \min\!\left(100,\;\frac{|M|}{|J|} \times 100\right)

Fuzzy (iCIMS): Populates both MM and SS using a synonym database and canonical form mapping.

Kfuzzy=min ⁣(100,  M+0.8SJ×100)K_{\text{fuzzy}} = \min\!\left(100,\;\frac{|M| + 0.8 \cdot |S|}{|J|} \times 100\right)

Semantic (Greenhouse, Lever): Same formula as fuzzy, but SS additionally includes partial string matches (substring containment where both terms are 3\geq 3 characters).

With M=15|M| = 15, S=5|S| = 5, and J=30|J| = 30:

  • Exact: 1530×100=50.0\frac{15}{30} \times 100 = 50.0
  • Fuzzy: 15+(0.8)(5)30×100=1930×10063.3\frac{15 + (0.8)(5)}{30} \times 100 = \frac{19}{30} \times 100 \approx 63.3

That 13-point difference from synonym matching is significant. It’s one of the reasons a resume might pass on Greenhouse but fail on Taleo.

The sixth dimension, quantification, is derived from the experience analysis:

d6={bqbt×100if bt>00if bt=0d_6 = \begin{cases} \left\lfloor\dfrac{b_q}{b_t} \times 100\right\rfloor & \text{if } b_t > 0 \\[6pt] 0 & \text{if } b_t = 0 \end{cases}

where bqb_q is the number of experience bullets containing quantified achievements (numbers, percentages, dollar amounts) and btb_t is the total number of experience bullets.

A resume with 3 out of 10 bullets containing numbers scores 30=30\lfloor 30 \rfloor = 30. A resume with 8 out of 10 scores 80=80\lfloor 80 \rfloor = 80.

This dimension matters a lot more on modern platforms. Greenhouse and Lever weight it at 0.20 (one-fifth of your total score), while legacy systems like Workday and Taleo only weight it at 0.05. The reasoning: modern platforms with structured scorecards surface quantified achievements to reviewers, so they carry more signal.

Every platform has quirks: specific behaviors that don’t fit neatly into the six dimensions. These are modeled as conditional penalty checks that fire after the weighted sum.

Qp=jqj(p)1 ⁣[conditionj]Q_p = -\sum_{j} q_j^{(p)} \cdot \mathbb{1}\!\left[\text{condition}_j\right]

where qj(p)q_j^{(p)} is the penalty value for quirk jj on platform pp, and 1[]\mathbb{1}[\cdot] is the indicator function (1 if the condition is true, 0 otherwise). The negative sign means quirks always reduce the score.

PlatformQuirkConditionPenalty
WorkdayNon-standard headers> 2 unrecognized section headers5
WorkdayPage limit> 2 pages8
TaleoLow keyword density< 5 skills detected (with JD)10
TaleoMissing standard sections> 1 required section missing8

Putting it all together for a Workday example:

Given d=[85,70,90,75,80,60]d = [85, 70, 90, 75, 80, 60] and one triggered quirk (non-standard headers):

Sweighted=i=16widi=78.00S_{\text{weighted}} = \sum_{i=1}^{6} w_i \cdot d_i = 78.00 Q=(5)1[true]=5Q = -(5) \cdot \mathbb{1}[\text{true}] = -5 SWorkday=clamp(0,100,78.00+(5))=73.00S_{\text{Workday}} = \text{clamp}(0, 100, 78.00 + (-5)) = 73.00

Each platform has a threshold that determines whether your resume “passes” the initial filter. These are set based on research into typical auto-reject cutoffs:

PlatformPassing ScoreReasoning
Workday70Strict Fortune 500 systems tend to filter aggressively
Taleo65Legacy boolean matching has some tolerance
iCIMS60ALEX parser is more forgiving
Greenhouse55Designed for human review, lower auto-filter bar
Lever50Minimal auto-filtering by design
SuccessFactors65Enterprise standard, moderate strictness

The pass/fail determination is simply:

passesp={trueif Spτpfalseotherwise\text{passes}_p = \begin{cases} \text{true} & \text{if } S_p \geq \tau_p \\ \text{false} & \text{otherwise} \end{cases}

where τp\tau_p is the passing threshold for platform pp.

One of the things I wanted to demonstrate with this tool is that the same resume genuinely scores differently across platforms. It’s not just the thresholds that differ; the weights create real separation.

For d=[80,65,85,70,75,55]d = [80, 65, 85, 70, 75, 55]:

PlatformScoreThresholdResult
Workday73.0070Pass
Taleo72.2565Pass
iCIMS71.2560Pass
SuccessFactors74.0065Pass
Greenhouse68.7555Pass
Lever68.7050Pass

The spread here is 5.30 points from highest to lowest. All pass in this example, but tweak the keyword score down to 45 and Taleo (weight 0.35) drops 7 points while Lever (weight 0.22) only drops 4.4. That differential is the whole point: your optimization strategy should depend on where you’re applying.

Everything above describes the rule-based fallback engine. When AI scoring is available (Gemma 3 27B via Google’s Generative Language API), the LLM evaluates each dimension using the same platform profiles as context. The AI can pick up on nuances that rule-based scoring can’t, things like contextual relevance, phrasing quality, and role-specific terminology.

The rule-based engine exists as a fallback for when the AI is unavailable (rate limits, timeouts, etc.). It produces serviceable scores using the exact formulas on this page, but AI scoring is generally more nuanced and accurate for real-world resume evaluation.