Calculating overtime becomes complex when an employee works two or more different jobs at different hourly rates within the same workweek. According to the Fair Labor Standards Act (FLSA), you cannot simply pay overtime based on the lowest rate or an arbitrary rate. Instead, you must calculate the Weighted Average Rate (also known as the Blended Rate).
This calculator determines the correct gross pay by blending the rates of all jobs performed to establish the regular rate of pay for that specific week.
The Weighted Average Formula
The FLSA standard method for calculating overtime for multiple pay rates involves these specific steps:
Step 1: Calculate Total Straight-Time Earnings
Multiply the hours worked in each job by its specific hourly rate. Add these together to get the total straight-time earnings.
Step 2: Determine the Regular Rate
Divide the Total Straight-Time Earnings by the Total Hours Worked (including overtime hours). This gives you the Weighted Average Rate.
Step 3: Calculate Overtime Premium
Since the straight-time for all hours (including overtime hours) was already calculated in Step 1, the employee is still owed the "half-time" premium for hours over 40. Multiply the Overtime Hours by 0.5 times the Weighted Average Rate.
Example Calculation
Let's look at a realistic scenario for an employee working two roles:
While employers are legally allowed to pay overtime based on the highest rate earned or the rate associated with the specific overtime hours worked (if agreed upon in advance), the Weighted Average method is the standard requirement absent such agreements. It ensures fairness by averaging the value of labor provided across the entire workweek.
function calculateMultipleRates() {
// Retrieve inputs using var
var h1 = parseFloat(document.getElementById("hours1").value) || 0;
var r1 = parseFloat(document.getElementById("rate1").value) || 0;
var h2 = parseFloat(document.getElementById("hours2").value) || 0;
var r2 = parseFloat(document.getElementById("rate2").value) || 0;
var h3 = parseFloat(document.getElementById("hours3").value) || 0;
var r3 = parseFloat(document.getElementById("rate3").value) || 0;
var threshold = parseFloat(document.getElementById("otThreshold").value) || 40;
// Step 1: Total Straight Earnings (Base Pay for ALL hours)
var earnings1 = h1 * r1;
var earnings2 = h2 * r2;
var earnings3 = h3 * r3;
var totalStraightEarnings = earnings1 + earnings2 + earnings3;
// Step 2: Total Hours
var totalHours = h1 + h2 + h3;
// Initializing result variables
var weightedRate = 0;
var otHours = 0;
var otPremiumRate = 0;
var otPay = 0;
var totalGrossPay = 0;
if (totalHours > 0) {
// Step 3: Weighted Average Rate (Regular Rate)
weightedRate = totalStraightEarnings / totalHours;
// Step 4: Calculate Overtime
if (totalHours > threshold) {
otHours = totalHours – threshold;
// The employee has already been paid straight time for these hours in Step 1.
// We owe them the "half" of the time-and-a-half based on the weighted rate.
otPremiumRate = weightedRate * 0.5;
otPay = otHours * otPremiumRate;
}
totalGrossPay = totalStraightEarnings + otPay;
}
// Display Results with formatting
document.getElementById("displayTotalHours").innerText = totalHours.toFixed(2);
document.getElementById("displayStraightEarnings").innerText = "$" + totalStraightEarnings.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById("displayWeightedRate").innerText = "$" + weightedRate.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2}) + " / hr";
document.getElementById("displayOTHours").innerText = otHours.toFixed(2);
document.getElementById("displayOTPremiumRate").innerText = "$" + otPremiumRate.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2}) + " / hr";
document.getElementById("displayOTPay").innerText = "$" + otPay.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById("displayTotalPay").innerText = "$" + totalGrossPay.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2});
// Show result container
document.getElementById("resultContainer").style.display = "block";
}