Workforce Planning Templates and Frameworks
Workforce Planning Templates and Frameworks provides column-by-column specifications for the core templates that WFM teams use in daily operations. Each template includes its purpose, structure, build instructions, and stakeholder presentation guidance.
Annual Capacity Plan Template

Purpose: Translate 12-month demand forecast into FTE requirements, hiring needs, and budget.
Update frequency: Monthly refresh, quarterly deep review.
Structure
| Column | Data Type | Description | Source |
|---|---|---|---|
| Month | Date | Calendar month (Jan-Dec) | Static |
| Forecast_Volume | Integer | Monthly contact volume by channel | Forecasting team |
| AHT_Seconds | Float | Average handle time in seconds | Historical data / trend model |
| Workload_Hours | Float | (Forecast_Volume × AHT_Seconds) / 3600 | Calculated |
| Shrinkage_Pct | Float | Planned shrinkage (PTO, training, meetings, aux) | HR + WFM actuals |
| Occupancy_Target | Float | Target occupancy rate (0.82–0.88 typical) | Service strategy |
| SL_Target | String | Service level target (e.g., "80/20") | Service strategy |
| Required_FTE | Float | From Erlang C or simulation: staff needed at target SL | Erlang model |
| Gross_FTE | Float | Required_FTE / (1 - Shrinkage_Pct) | Calculated |
| Current_Headcount | Integer | Productive headcount at start of month | HR system |
| Attrition_Forecast | Integer | Projected terminations/departures | Attrition model |
| End_Headcount | Integer | Current - Attrition + New Hires completing ramp | Calculated |
| Gap_Surplus | Float | End_Headcount - Gross_FTE (negative = gap) | Calculated |
| New_Hire_Need | Integer | Hires needed to close gap, accounting for ramp | Calculated |
| Class_Size | Integer | Planned training class size | Recruiting/training capacity |
| Class_Start_Date | Date | When class begins training | Recruiting pipeline |
| Ramp_Complete_Date | Date | When new hires reach productive status | Training timeline |
| Cost_Per_FTE | Currency | Fully loaded monthly cost per FTE | Finance |
| Total_Staffing_Cost | Currency | Gross_FTE × Cost_Per_FTE | Calculated |
| Overtime_Budget | Currency | Planned OT spend for gap coverage | Finance |
| Vendor_FTE | Float | BPO/vendor FTE allocated | Vendor management |
Build Instructions
- Start with the demand forecast (volume × AHT = workload hours)
- Apply Erlang C at each monthly level to derive base staff requirements (use average daily volume / operating days for the Erlang input, then multiply back to FTE)
- Divide by (1 - shrinkage) to get gross FTE
- Layer in current headcount, subtract projected attrition (use trailing 3-month annualized rate as default)
- Calculate gap; size hiring classes to close gap with lead time for training ramp
- Apply cost rates from finance for budget build
Stakeholder Presentation
For operations leadership: Emphasize gap/surplus by month, hiring class schedule, risk scenarios (what if attrition increases 20%?).
For finance: Emphasize total cost, cost per contact trending, overtime vs straight-time ratio, vendor cost allocation.
For HR/recruiting: Emphasize hiring dates, class sizes, lead time requirements, skill-specific needs.
Monthly Staffing Requirements Template
Purpose: Convert interval-level demand into daily staffing requirements.
Structure
| Column | Data Type | Description |
|---|---|---|
| Date | Date | Each day of the month |
| Day_of_Week | String | Mon-Sun |
| Interval | Time | 15- or 30-minute interval start time |
| Forecast_Volume | Integer | Contacts forecasted for this interval |
| Forecast_AHT | Float | AHT in seconds for this interval |
| Workload_Erlang | Float | (Volume × AHT) / Interval_Seconds |
| SL_Target | Float | Service level target for this interval |
| ASA_Target | Float | Average speed of answer target (seconds) |
| Base_Staff_Required | Float | Erlang C output: minimum staff for SL target |
| Shrinkage_Pct | Float | Interval-level shrinkage (varies by time of day) |
| Scheduled_Staff_Required | Integer | Ceiling(Base_Staff / (1 - Shrinkage)) |
| Scheduled_Staff_Actual | Integer | Agents actually scheduled (from schedule) |
| Coverage_Delta | Integer | Actual - Required (positive = overstaffed) |
Key detail: Shrinkage varies by time of day. Morning shrinkage (training, team meetings) is typically 5-8% higher than afternoon shrinkage. Use interval-level shrinkage rates, not a flat daily rate.
Schedule Efficiency Scorecard Template
Purpose: Measure how well the published schedule matches staffing requirements.
Metrics
| Metric | Formula | Target | Frequency |
|---|---|---|---|
| Coverage Index | Σ min(scheduled, required) / Σ required | > 0.95 | Weekly |
| Overstaffing Index | Σ max(scheduled - required, 0) / Σ required | < 0.08 | Weekly |
| Understaffing Index | Σ max(required - scheduled, 0) / Σ required | < 0.05 | Weekly |
| Schedule Efficiency | Productive hours / total paid hours | > 0.85 | Weekly |
| FTE Utilization | Required FTE / Scheduled FTE | > 0.90 | Weekly |
| Preference Fulfillment | Granted requests / total requests | > 0.70 | Monthly |
| Overtime Ratio | OT hours / total hours | < 0.05 | Weekly |
| Weekend Equity Variance | Std dev of weekend shifts per agent | < 1.5 | Monthly |
Scorecard Layout
Rows: One row per week (or per day for detailed view)
Columns: Metric name | Target | Actual | Variance | Trend (4-week sparkline) | Status (R/Y/G)
RAG thresholds:
- Green: Within 2% of target
- Yellow: 2-5% off target
- Red: > 5% off target
Attrition Forecasting Model Template
Purpose: Project monthly attrition to feed capacity planning.
Structure
| Column | Description | Source |
|---|---|---|
| Month | Forecast month | Static |
| Tenure_Cohort | Grouping by tenure (0-90 days, 91-180, 181-365, 1-2 yrs, 2+ yrs) | HR system |
| Starting_Headcount | Headcount at start of month for this cohort | HR data |
| Historical_Attrition_Rate | Trailing 12-month annualized rate for this cohort | Calculated |
| Seasonal_Factor | Monthly adjustment (e.g., January = 1.15 due to New Year departures) | Historical analysis |
| Adjusted_Monthly_Rate | (Historical_Annual_Rate / 12) × Seasonal_Factor | Calculated |
| Projected_Departures | Starting_Headcount × Adjusted_Monthly_Rate | Calculated |
| Voluntary_Pct | Estimated % that are voluntary | Historical split |
| Involuntary_Pct | Estimated % that are involuntary | Historical split |
| Regrettable_Pct | Estimated % of voluntary that are regrettable | Quality data |
Critical insight: Attrition is not uniform across tenure. New hires (0-90 days) typically attrit at 2-3x the rate of tenured agents (2+ years). Model by tenure cohort, not as a blended average.
Build Steps
- Extract termination data by month for trailing 24 months
- Segment by tenure cohort at time of termination
- Calculate annualized attrition rate per cohort per month
- Identify seasonal pattern (decompose or calculate monthly indices)
- Project forward using cohort rates × current headcount distribution × seasonal factors
- Validate against HR's planned involuntary actions (PIPs, restructuring)
New Hire Pipeline Tracker
Purpose: Track recruiting-to-production pipeline with timing and yield assumptions.
Structure
| Column | Description |
|---|---|
| Class_ID | Unique identifier for training class |
| Skill_Group | Queue or skill this class is training for |
| Requisition_Open_Date | When recruiting opened the req |
| Target_Class_Size | Planned number of trainees |
| Offer_Target | Offers needed (class size / offer acceptance rate) |
| Interview_Target | Interviews needed (offers / interview-to-offer rate) |
| Application_Target | Applications needed (interviews / screen-to-interview rate) |
| Class_Start_Date | First day of training |
| Training_Duration_Weeks | Length of training program |
| Nesting_Duration_Weeks | Post-training supervised production period |
| Full_Production_Date | Date agents reach full productivity |
| Actual_Start_Count | How many actually started training |
| Training_Attrition | Trainees lost during training |
| Nesting_Attrition | Agents lost during nesting |
| Surviving_FTE | Agents reaching full production |
| Yield_Pct | Surviving / Actual_Start_Count |
| Ramp_Productivity_Week_1 | Expected productivity in week 1 of nesting (e.g., 0.50) |
| Ramp_Productivity_Week_4 | Expected productivity in week 4 (e.g., 0.75) |
| Ramp_Productivity_Week_8 | Expected productivity in week 8 (e.g., 0.90) |
| Full_Productivity_Week | Week at which agent reaches 1.0 productivity |
Typical yield assumptions (contact center):
- Offer acceptance rate: 80-85%
- Training completion rate: 85-90%
- Nesting completion rate: 90-95%
- End-to-end yield (offer to production): 60-75%
Shrinkage Budget Worksheet
Purpose: Plan and track all categories of non-productive time.
Structure
| Category | Sub-Category | Planned % | Actual % | Variance | Notes |
|---|---|---|---|---|---|
| Paid leave | PTO/vacation | 6.0% | Based on accrual rates and usage patterns | ||
| Sick leave | 2.5% | Seasonal: higher in winter months | |||
| FMLA/medical | 1.0% | ||||
| Bereavement/jury | 0.3% | ||||
| Training | New hire training | 2.0% | Varies with hiring volume | ||
| Continuing education | 1.5% | Product updates, compliance | |||
| System training | 0.5% | New tool rollouts | |||
| Meetings | Team huddles | 1.0% | Daily 10-min standup | ||
| 1:1 coaching | 1.5% | Weekly 30-min sessions | |||
| All-hands/town halls | 0.3% | Monthly | |||
| System/admin | System downtime | 0.5% | Unplanned outages | ||
| Admin tasks | 0.5% | Timekeeping, compliance | |||
| Unplanned | Unexcused absence | 1.0% | |||
| Tardiness | 0.5% | ||||
| Extended breaks | 0.5% | ||||
| TOTAL | 19.6% |
Build guidance:
- Start with 12 months of actual data from adherence reports
- Calculate each category as % of total scheduled hours
- Compare against industry benchmarks (total shrinkage: 25-35% is typical; 20% is aggressive, 35%+ indicates management issues)
- Set planned rates based on trailing actuals adjusted for known changes (policy updates, hiring plan)
- Review monthly; investigate any category trending > 1% above plan
Presenting Templates to Stakeholders
Rule 1: Never show the raw template. Always present a summary dashboard with the template as backup.
Rule 2: Lead with the story, not the numbers.
- "We need 3 training classes of 20 to close the Q3 gap" (not "the template shows a -47 FTE delta in July")
- "Attrition is running 22% annualized against a 18% plan" (not "see row 14 column G")
Rule 3: Include scenarios.
- Base case (plan assumptions)
- Optimistic case (attrition -20%, volume -5%)
- Pessimistic case (attrition +20%, volume +10%)
Rule 4: Make the ask explicit. Every presentation should end with a decision needed: approve hiring plan, authorize overtime budget, confirm vendor ramp.
Scenario Modeling Framework
Every capacity plan should include at least three scenarios. Without scenarios, stakeholders treat the single-point forecast as certain — and are shocked when reality diverges.
Scenario Definition
| Scenario | Volume Assumption | Attrition Assumption | AHT Assumption | Use Case |
|---|---|---|---|---|
| Optimistic | Plan -10% | Plan -20% | Plan -5% | Best case for budget; shows potential savings |
| Base | Plan (as forecasted) | Plan (as modeled) | Plan (as trended) | Primary operating plan; default for hiring |
| Pessimistic | Plan +15% | Plan +30% | Plan +10% | Worst case; triggers contingency planning |
| Black swan | Plan +30% | Plan +50% | Plan +15% | Crisis scenario; identifies breaking points |
Scenario Impact Template
For each scenario, compute:
| Metric | Optimistic | Base | Pessimistic | Black Swan |
|---|---|---|---|---|
| Monthly volume | ||||
| Required FTE (Erlang) | ||||
| Gross FTE (with shrinkage) | ||||
| Gap vs current headcount | ||||
| Hiring classes needed | ||||
| Monthly staffing cost | ||||
| Overtime required (hours) | ||||
| Vendor FTE needed | ||||
| Projected service level |
Trigger-Based Decision Framework
Rather than choosing one scenario, define triggers that activate contingency plans:
| Trigger | Threshold | Action | Owner | Lead Time |
|---|---|---|---|---|
| Volume trending above plan | +10% for 3 consecutive weeks | Authorize additional hiring class | VP Operations | 8-12 weeks to productive |
| Attrition spike | > 1.5x plan for 2 consecutive months | Activate vendor overflow | WFM Director | 4-6 weeks to ramp |
| AHT sustained increase | +10% for 4 consecutive weeks | Investigate root cause; request training budget | WFM Manager | 2-4 weeks to impact |
| Volume trending below plan | -15% for 4 consecutive weeks | Defer planned hiring class | VP Operations | Immediate |
Worked Example: Building an Annual Capacity Plan
Scenario: 300-seat contact center, single skill group, planning for January-June.
Step 1: Demand forecast
| Month | Forecast Volume | AHT (sec) | Workload Hours | Operating Days |
|---|---|---|---|---|
| January | 185,000 | 420 | 21,583 | 22 |
| February | 175,000 | 415 | 20,174 | 20 |
| March | 195,000 | 425 | 23,021 | 22 |
| April | 190,000 | 420 | 22,167 | 22 |
| May | 200,000 | 430 | 23,889 | 21 |
| June | 210,000 | 435 | 25,375 | 22 |
Step 2: Convert to daily requirements (March example)
- Daily volume: 195,000 / 22 = 8,864 contacts/day
- Workload per day: 8,864 × 425 / 3600 = 1,046 hours
- Apply Erlang C at 80/20 SL, 420 sec AHT, across 30-min intervals → peak requirement: 145 agents, average requirement: 118 agents
Step 3: Apply shrinkage (March)
- March shrinkage plan: 28% (lower than summer months)
- Gross FTE needed: 145 peak / (1 - 0.28) = 201 FTE (peak), 118 / (1 - 0.28) = 164 FTE (average)
- Use: 164 FTE for hiring plan (schedule optimizer handles peak distribution)
Step 4: Gap analysis
- Current headcount (March 1): 175 productive FTE
- March attrition forecast: 7 (annualized 48%, monthly ~4%)
- Projected March end headcount (no hiring): 168
- Gap: 168 - 164 = +4 (slight surplus in March)
- But June requirement is 186 FTE (25,375 workload hours × higher shrinkage of 32% in summer). Need hiring to fill gap by June.
Step 5: Hiring plan
- June gap: 186 required - (175 - 7×4 months attrition) = 186 - 147 = 39 FTE needed by June 1
- Training + nesting duration: 8 weeks
- End-to-end yield: 70%
- Class size needed: 39 / 0.70 = 56 trainees across two classes
- Class 1: 28 trainees starting April 1 (productive by June 1)
- Class 2: 28 trainees starting April 15 (productive by June 15)
Step 6: Budget
- Average cost per FTE: $4,200/month (fully loaded)
- Incremental cost of 39 additional FTE for June: $163,800/month
- Training cost: 56 trainees × 8 weeks × $1,050/week = $470,400 one-time
- Alternative: overtime to cover gap costs $62/hour × 2,400 hours = $148,800/month (more expensive than hiring if gap persists > 3 months)
Common Template Mistakes
- Using annual averages for monthly planning. Demand varies by month. An annual average hides seasonal peaks where you are critically understaffed.
- Ignoring ramp productivity. A new hire who starts in January is not a full FTE until March-April. The capacity plan must apply the speed-to-proficiency curve to each class.
- Static shrinkage rates. Using 30% shrinkage year-round when actual shrinkage is 25% in January and 38% in August (summer PTO). Use monthly shrinkage rates.
- Not accounting for lead time. If it takes 10 weeks from requisition to productive agent, the hiring decision for a July need must happen in April. Build lead times into the template.
- Single-point forecasts without confidence intervals. A "forecast of 50,000 contacts" is less useful than "forecast of 50,000 contacts with 80% confidence interval of 46,000-54,000." The interval drives scenario planning.
See Also
- Capacity Planning Methods
- Long-Run Workforce Sizing
- Workforce Cost Modeling
- Annual Attrition
- Speed to Proficiency Curve
