Full-Time Equivalent (FTE)

FTE converts hours into a standard unit of staffing.

\[ \text{FTE} = \frac{\text{total hours on the chosen basis}}{\text{standard full-time hours}} \]

The denominator depends on the employer and the measurement purpose. State whether the numerator counts contracted, paid or worked hours, and use a consistent period; the formula applies to whichever basis is chosen.

Contracted hours are not available hours

For this capacity plan, the chosen basis is paid time, so the numerator is paid hours rather than hours worked. Leave, training and other paid activities reduce the hours available for the target queue. The deductions below are illustrative and assumed not to overlap.

At an assumed 40-hour week for 52 weeks, one paid FTE represents 2,080 hours. For an illustrative plan, subtract 72 holiday hours, 200 leave hours, 48 sickness hours, 40 training hours, 156 meeting and administration hours, and 115 break hours. If these categories are mutually exclusive, they total 631 hours and leave 1,449 hours for the target queue. Do not subtract an absence twice, or treat other valuable work as wasted merely because it is outside this queue.

The assumed deductions leave 1,449 of 2,080 paid hours available for the queue. A 12,000-hour workload therefore corresponds to 12,000/1,449 ≈ 8.28 paid FTE under these assumptions, whereas dividing by gross hours gives 5.77. This is an aggregate capacity estimate before scheduling and service-level constraints, not a claim that exactly 8.28 people can be rostered. Ten paid FTE provide 6.97 equivalents of 2,080 productive hours; delivering ten such productive equivalents would require about 14.35 paid FTE, or 4.35 additional paid FTE.

Measure and periodically update the capacity ratio as leave, training and work practices change. It connects a workload in review minutes to paid staffing, but does not eliminate uncertainty in either input.

FTE throws the schedule away

Two people each contracted for 20 hours constitute one FTE under a 40-hour standard, but headcount is two. If both work the same morning hours, their combined hours do not cover an afternoon need. Skills and timing remain relevant after the hours are normalized.

This NumPy example compares four schedules against an explicitly chosen hourly staffing requirement. It counts an eight-hour daily schedule as one daily FTE equivalent, treats workers as interchangeable, and ignores breaks. For each hour, a shortfall is max(required − scheduled, 0); summing gives uncovered person-hours. Surplus hours in another slot cannot cancel that shortfall. The calculation illustrates coverage, not queue waiting time or a legally complete roster.

import numpy as np

hours = np.arange(7, 21)
need = np.array([0, 1, 5, 6, 4, 1, 1, 2, 6, 6, 3, 1, 0, 0])


def cover(shifts):
    c = np.zeros(len(hours))
    for start, count, length in shifts:
        i = int(np.flatnonzero(hours == start)[0])
        c[i:i + length] += count
    return c


def fte(shifts):
    return sum(count * length for _, count, length in shifts) / 8.0


plans = {
    "5 full-timers, all at 09:00": [(9, 5, 8)],
    "5 full-timers, staggered": [(7, 1, 8), (9, 2, 8), (11, 1, 8), (13, 1, 8)],
    "10 half-timers, two waves": [(9, 5, 4), (15, 5, 4)],
    "mixed: 2 full, 6 half": [(9, 2, 8), (9, 3, 4), (15, 3, 4)],
}
print("Demand by hour of day, in people:")
print("   %s" % "  ".join("%02d:%d" % (h, n) for h, n in zip(hours, need)))
print()
print("%-30s %8s %14s %18s %16s"
      % ("plan", "FTE", "hours short", "people-hours short", "idle"))
shorts = {}
for label, sh in plans.items():
    c = cover(sh)
    short = np.maximum(need - c, 0)
    shorts[label] = short.sum()
    print("%-30s %8.2f %14d %18.0f %16.0f"
          % (label, fte(sh), int((short > 0).sum()), short.sum(),
             np.maximum(c - need, 0).sum()))
print()
# Demand by hour of day, in people:
#    07:0  08:1  09:5  10:6  11:4  12:1  13:1  14:2  15:6  16:6  17:3  18:1  19:0  20:0
#
# plan                                FTE    hours short people-hours short             idle
# 5 full-timers, all at 09:00        5.00              6                  8               12
# 5 full-timers, staggered           5.00              5                 10               14
# 10 half-timers, two waves          5.00              6                  7               11
# mixed: 2 full, 6 half              5.00              4                  4                8

Every plan is 5.00 FTE. Payroll is equal only if hourly rates and other employment costs are equal, which this example assumes. Unserved demand ranges from 4 to 10 people-hours a day; the schedules differ even though total hours agree.

Discarding the schedule is what makes FTE addable across different contracts, and it is exactly what makes it the wrong unit for staffing a day. Budget in FTE, staff in shifts, and never let the first number be the only one anyone sees.

The divisor is a convention

The standard full-time week is not a fact about work. It is a choice, it differs by employer and country, and a single statute can use a different one for a different purpose.

For eight people contracted for a total of 219.5 hours per week, a 40-hour denominator gives 219.5/40 = 5.4875 FTE. A 30-hour denominator gives 7.3167 FTE. Nobody has been added and no hours have changed. At an unchanged hourly wage, wage cost is unchanged too; a price quoted per FTE must specify how many hours that unit represents.

These weekly standards are hypothetical, not national legal rules. For US ACA employer-size calculations, the IRS counts full-time employees separately and converts non-full-time monthly hours, capped at 120 per employee, by dividing their total by 120. Dividing every worker’s weekly hours by 30 is not that procedure.

An FTE figure therefore travels badly. For comparison across employers or reports, state its divisor, period, and whether hours are contracted, paid, worked, or available for a particular activity. The same is true of an overtime percentage, which also requires an explicit hours baseline and cannot be inferred from headcount alone.

References


Discover more from Insightful Data Lab

Subscribe to get the latest posts sent to your email.

Similar Posts

Questions, corrections, or additional insights?

This site uses Akismet to reduce spam. Learn how your comment data is processed.