Time-to-Fill Calculator
ANA›Life Services Authority›National 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 '
- ''
- 'MetricValue'
- 'Time-to-Fill (this requisition)' + fmt(singleTTF, 1) + ' days'
- 'Average Time-to-Fill (' + numPositions + ' positions)' + fmt(avgTTF, 1) + ' days'
- 'vs. Industry Benchmark (SHRM ~42 days)' + benchmarkLabel + ''
- (dailyCost > 0 ? 'Cost of Vacancy (this requisition)' + fmtMoney(totalCost) + ''
-
- 'Total Cost of Vacancy (all ' + numPositions + ' positions)' + fmtMoney(totalCostAll) + ''
- '')
-
''
-
(stageSum > 0 ? '#### Stage Breakdown '
- stageBar
- ''
- 'StageDays% of TTF'
- (sourcingDays > 0 ? 'Sourcing' + fmt(sourcingDays,1) + '' + fmt(sourcingPct,1) + '%' : '')
- (screeningDays > 0 ? 'Screening' + fmt(screeningDays,1) + '' + fmt(screeningPct,1) + '%' : '')
- (interviewDays > 0 ? 'Interviews' + fmt(interviewDays,1) + '' + fmt(interviewPct,1) + '%' : '')
- (offerDays > 0 ? 'Offer' + fmt(offerDays,1) + '' + fmt(offerPct,1) + '%' : '')
- (otherDays > 0 ? 'Other / Admin' + fmt(otherDays,1) + '' + fmt(otherPct,1) + '%' : '')
- 'Total' + fmt(singleTTF,1) + '100%'
-
- ''
- '')
-
''
- 'Industry benchmark: ~42 days average time-to-fill (SHRM, 2023). '
- 'Cost of vacancy varies by role seniority and industry.'
- '
'; }
#### 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
- Industry benchmark of 42 days is based on SHRM's Talent Acquisition Benchmarking Report (2023).
More Calculators
- Countertop Material Cost Comparison Calculator
- Tile Countertop Layout and Grout Calculator
- Cyber Risk Score Calculator
- Countertop Edge Profile Cost Estimator
- Bail Amount Estimator
- Training ROI Calculator
- Spaced Repetition Interval Calculator
- Learning Retention Rate Calculator
- Course Completion Rate Analyzer
- Confusion Matrix Metrics Calculator
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:...