When an employee works two or more jobs at different hourly rates for the same employer within a single workweek, the Fair Labor Standards Act (FLSA) requires a specific method for calculating overtime pay. You cannot simply pay overtime based on the lower rate or an arbitrary average. Instead, you must calculate the Weighted Average Regular Rate, often referred to as the "blended rate."
How the Calculation Works
The Department of Labor (DOL) prescribes the following steps to ensure compliance:
Step 1: Calculate Total Straight-Time Earnings. Multiply the hours worked at each specific job by its respective hourly rate. Add any non-discretionary bonuses or commissions attributable to that workweek.
Step 2: Determine Total Hours. Add the total hours worked across all roles.
Step 3: Calculate the Regular Rate. Divide the Total Straight-Time Earnings by the Total Hours Worked. This gives you the weighted average hourly rate.
Step 4: Calculate Overtime Premium. Since the straight-time earnings (Step 1) already include the "base" pay for all hours (including overtime hours), you owe an additional "half-time" premium for hours worked over 40. Multiply the Regular Rate by 0.5, then multiply by the number of overtime hours.
Example Scenario
Imagine an employee, Sarah, works as a server for $15/hr and a shift supervisor for $25/hr in the same week.
Server: 30 hours @ $15 = $450
Supervisor: 20 hours @ $25 = $500
Total Straight-Time Pay = $950
Total Hours = 50 hours
The Regular Rate is $950 / 50 hours = $19.00/hr.
Because Sarah worked 50 hours, she has 10 hours of overtime. Since the $19.00 base rate was already paid in the initial calculation, the employer owes the additional half-time premium:
10 hours × ($19.00 × 0.5) = $95.00.
Manual calculations are prone to errors, especially when non-discretionary bonuses are involved. Underpaying overtime is a common FLSA violation that can lead to costly lawsuits and penalties. Using a dedicated calculator helps payroll administrators and business owners ensure accuracy and compliance with federal labor laws.
function calculateBlendedOvertime() {
// 1. Get Input Values
var rate1 = parseFloat(document.getElementById("rate1").value);
var hours1 = parseFloat(document.getElementById("hours1").value);
var rate2 = parseFloat(document.getElementById("rate2").value);
var hours2 = parseFloat(document.getElementById("hours2").value);
var bonus = parseFloat(document.getElementById("bonus").value);
// 2. Validate and Sanitize Inputs
if (isNaN(rate1)) rate1 = 0;
if (isNaN(hours1)) hours1 = 0;
if (isNaN(rate2)) rate2 = 0;
if (isNaN(hours2)) hours2 = 0;
if (isNaN(bonus)) bonus = 0;
// 3. Perform Calculations
// Total Hours Worked
var totalHours = hours1 + hours2;
if (totalHours === 0) {
alert("Please enter hours worked.");
return;
}
// Total Straight-Time Earnings
// (Rate A * Hours A) + (Rate B * Hours B) + Bonus
var earnings1 = rate1 * hours1;
var earnings2 = rate2 * hours2;
var totalStraightTime = earnings1 + earnings2 + bonus;
// Weighted Average Regular Rate
var regularRate = totalStraightTime / totalHours;
// Calculate Overtime Logic
var otHours = 0;
var otPremiumTotal = 0;
if (totalHours > 40) {
otHours = totalHours – 40;
// The employee has already been paid straight time for all hours in 'totalStraightTime'.
// Therefore, we only owe the extra 0.5 (half-time) premium on the OT hours based on the regular rate.
var halfTimeRate = regularRate * 0.5;
otPremiumTotal = otHours * halfTimeRate;
}
var totalPay = totalStraightTime + otPremiumTotal;
// 4. Update the Display
document.getElementById("displayTotalHours").innerText = totalHours.toFixed(2);
document.getElementById("displayStraightTime").innerText = "$" + totalStraightTime.toFixed(2);
document.getElementById("displayRegularRate").innerText = "$" + regularRate.toFixed(2);
document.getElementById("displayOTHours").innerText = otHours.toFixed(2);
document.getElementById("displayOTPremium").innerText = "$" + otPremiumTotal.toFixed(2);
document.getElementById("displayTotalPay").innerText = "$" + totalPay.toFixed(2);
// Show result area
document.getElementById("result-area").style.display = "block";
}