Time-to-Fill Calculator

ANALife Services AuthorityNational Calculator Authority›Time-to-Fill Calculator

.calc-container { max-width: 640px; margin: 2rem 0; padding: 1.5rem; background: #fff; border: 1px solid #ddd; border-radius: 8px; box-shadow: 0 1px 3px rgba(0,0,0,0.06); font-family: system-ui, -apple-system, sans-serif; } .calc-container h3 { font-family: Georgia, serif; font-size: 1.15rem; color: #1a1a1a; margin-bottom: 1rem; padding-bottom: 0.5rem; border-bottom: 2px solid var(--ac, #3d5a80); } .calc-row { display: flex; align-items: center; gap: 0.75rem; margin-bottom: 0.75rem; flex-wrap: wrap; } .calc-row label { min-width: 160px; font-size: 0.9rem; color: #333; font-weight: 500; } .calc-row input[type="number"], .calc-row select { flex: 1; min-width: 120px; max-width: 200px; padding: 0.5rem 0.6rem; border: 1px solid #ccc; border-radius: 4px; font-size: 0.9rem; font-family: system-ui, sans-serif; color: #1a1a1a; background: #fafaf8; } .calc-row input:focus, .calc-row select:focus { outline: none; border-color: var(--ac, #3d5a80); box-shadow: 0 0 0 2px rgba(26,74,138,0.12); } .calc-row .unit { font-size: 0.82rem; color: #888; min-width: 30px; } .calc-btn { display: inline-block; margin-top: 0.5rem; padding: 0.55rem 1.5rem; background: var(--ac, #3d5a80); color: #fff; border: none; border-radius: 4px; font-size: 0.9rem; font-weight: 600; cursor: pointer; font-family: system-ui, sans-serif; } .calc-btn:hover { opacity: 0.9; } .calc-result { margin-top: 1.25rem; padding: 1rem 1.25rem; background: #f0f6fc; border-left: 3px solid var(--ac, #3d5a80); border-radius: 0 6px 6px 0; display: none; } .calc-result.visible { display: block; } .calc-result-label { font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.06em; color: #666; margin-bottom: 0.25rem; } .calc-result-value { font-size: 1.6rem; font-weight: 700; color: var(--ac, #3d5a80); } .calc-result-detail { font-size: 0.85rem; color: #555; margin-top: 0.5rem; line-height: 1.5; } .calc-note { margin-top: 1rem; font-size: 0.8rem; color: #888; font-style: italic; } .calc-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 0.75rem; margin-top: 0.75rem; } .calc-grid-item { padding: 0.6rem 0.8rem; background: #f8f9fa; border-radius: 4px; border: 1px solid #eee; } .calc-grid-item .label { font-size: 0.75rem; color: #888; text-transform: uppercase; letter-spacing: 0.04em; } .calc-grid-item .value { font-size: 1.1rem; font-weight: 600; color: #1a1a1a; } @media (max-width: 720px) { .calc-row { flex-direction: column; align-items: flex-start; gap: 0.3rem; } .calc-row label { min-width: auto; } .calc-row input[type="number"], .calc-row select { max-width: 100%; width: 100%; } .calc-grid { grid-template-columns: 1fr; } } .calc-chart { margin: 1rem 0; text-align: center; } .calc-chart svg { max-width: 100%; height: auto; } .calc-chart-legend { display: flex; flex-wrap: wrap; justify-content: center; gap: 0.6rem 1.2rem; margin-top: 0.6rem; font-size: 0.8rem; color: #555; } .calc-chart-legend span { display: inline-flex; align-items: center; gap: 0.3rem; } .calc-chart-legend i { display: inline-block; width: 10px; height: 10px; border-radius: 2px; font-style: normal; } .calc-related { max-width: 640px; margin: 2rem 0 1rem; padding: 1.25rem 1.5rem; background: #f8f9fa; border: 1px solid #e8e8e8; border-radius: 8px; } .calc-related h3 { font-family: Georgia, serif; font-size: 1rem; color: #1a1a1a; margin: 0 0 0.75rem; padding-bottom: 0.4rem; border-bottom: 2px solid var(--ac, #3d5a80); } .calc-related-list { list-style: none; padding: 0; margin: 0 0 0.75rem; display: grid; grid-template-columns: 1fr 1fr; gap: 0.4rem 1.5rem; } .calc-related-list li a { font-size: 0.88rem; color: var(--ac, #3d5a80); text-decoration: none; } .calc-related-list li a:hover { text-decoration: underline; } .calc-browse-all { margin: 0.5rem 0 0; font-size: 0.9rem; font-weight: 600; } .calc-browse-all a { color: var(--ac, #3d5a80); text-decoration: none; } .calc-browse-all a:hover { text-decoration: underline; } @media (max-width: 720px) { .calc-related-list { grid-template-columns: 1fr; } }

Time-to-Fill Calculator

Calculate the average time-to-fill for open positions across all hiring stages, and estimate total recruiting cost impact.

Job Opening Date (or Days Since Opening)

Number of calendar days since the position was opened

Sourcing Stage Duration (days)

Days spent actively sourcing candidates

Screening Stage Duration (days)

Days spent on resume review and phone screens

Interview Stage Duration (days)

Days spent on interviews (all rounds)

Offer & Acceptance Stage Duration (days)

Days from offer extension to signed acceptance

Number of Positions Filled (for average)

Total positions used to compute average time-to-fill

Total Days Across All Positions (sum)

Sum of individual time-to-fill days for all positions (used for average calculation)

Daily Cost of Vacancy ($/day)

Estimated productivity/revenue loss per day the role is unfilled

Calculate

function timCalc() { var resultDiv = document.getElementById('tim-result');

var openDays = parseFloat(document.getElementById('tim-open-days').value); var sourcingDays = parseFloat(document.getElementById('tim-sourcing-days').value); var screeningDays = parseFloat(document.getElementById('tim-screening-days').value); var interviewDays = parseFloat(document.getElementById('tim-interview-days').value); var offerDays = parseFloat(document.getElementById('tim-offer-days').value); var numPositions = parseFloat(document.getElementById('tim-num-positions').value); var totalDaysAll = parseFloat(document.getElementById('tim-total-days-all').value); var dailyCost = parseFloat(document.getElementById('tim-daily-cost').value);

// Validation var errors = [];

if (isNaN(openDays) || openDays openDays && openDays > 0) { errors.push("Sum of stage durations (" + stageSum + " days) exceeds total days since opening (" + openDays + " days). Please review your inputs."); }

if (errors.length > 0) { resultDiv.innerHTML = 'Please fix the following:' + errors.map(function(e){ return ''; }).join('') + ''; return; }

// ── Core Calculations ──────────────────────────────────────────────────────

// 1. Time-to-Fill for this single requisition (sum of all stages) // If openDays is provided and stages are provided, use openDays as authoritative var singleTTF = openDays > 0 ? openDays : stageSum;

// 2. Average Time-to-Fill across all positions // Avg TTF = Total Days Across All Positions / Number of Positions var avgTTF = totalDaysAll > 0 ? (totalDaysAll / numPositions) : singleTTF;

// 3. Stage breakdown percentages (relative to singleTTF) var sourcingPct = singleTTF > 0 ? (sourcingDays / singleTTF * 100) : 0; var screeningPct = singleTTF > 0 ? (screeningDays / singleTTF * 100) : 0; var interviewPct = singleTTF > 0 ? (interviewDays / singleTTF * 100) : 0; var offerPct = singleTTF > 0 ? (offerDays / singleTTF * 100) : 0; var otherDays = singleTTF - stageSum; var otherPct = singleTTF > 0 ? (otherDays / singleTTF * 100) : 0;

// 4. Total Cost of Vacancy for this requisition // Cost = Time-to-Fill (days) × Daily Cost of Vacancy var totalCost = singleTTF * dailyCost;

// 5. Total Cost across all positions var totalCostAll = avgTTF * numPositions * dailyCost;

// 6. Benchmark comparison (industry average ~42 days per SHRM)
var benchmark = 42;
var vsAvgBenchmark = avgTTF - benchmark;
var benchmarkLabel = vsAvgBenchmark > 0
? (vsAvgBenchmark.toFixed(1) + " days ABOVE industry average (42 days)")
(Math.abs(vsAvgBenchmark).toFixed(1) + " days BELOW industry average (42 days)");

// ── Format helpers ───────────────────────────────────────────────────────── function fmt(n, dec) { return n.toFixed(dec !== undefined ? dec : 1); } function fmtMoney(n) { return '$' + n.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2}); }

// ── Build stage bar ──────────────────────────────────────────────────────── function barSegment(label, days, pct, color) { if (days ' + ''; }

var stageBar = ''; if (stageSum > 0) { stageBar = '' + barSegment('Sourcing', sourcingDays, sourcingPct, '#4e79a7') + barSegment('Screening', screeningDays, screeningPct, '#f28e2b') + barSegment('Interviews', interviewDays, interviewPct, '#59a14f') + barSegment('Offer', offerDays, offerPct, '#e15759') + barSegment('Other', otherDays > 0 ? otherDays : 0, otherPct > 0 ? otherPct : 0, '#bab0ac') + '' + '' + '■ Sourcing  ' + '■ Screening  ' + '■ Interviews  ' + '■ Offer' + (otherDays > 0 ? '  ■ Other' : '') + ''; }

// ── Output ───────────────────────────────────────────────────────────────── resultDiv.innerHTML = '### Results '

'; }

#### Formulas Used

Time-to-Fill (single requisition): TTF = Days from job opening to signed offer acceptance TTF = Sourcing Days + Screening Days + Interview Days + Offer Days + Other Days

Average Time-to-Fill: Avg TTF = Σ(Individual TTF for each position) ÷ Number of Positions Filled

Cost of Vacancy: Cost = TTF (days) × Daily Cost of Vacancy ($) Total Cost (all positions) = Avg TTF × Number of Positions × Daily Cost of Vacancy

Stage Percentage: Stage % = (Stage Duration ÷ Total TTF) × 100

#### Assumptions & References

More Calculators

Read Next

Course Completion Rate Analyzer ANA › Life Services Authority › National Calculator Authority › Course Completion Rate Analyzer .calc-container { max-width:...

Study Time Planner ANA › Life Services Authority › National Calculator Authority › Study Time Planner .calc-container { max-width: 640px; margin:...

References