Payroll Calculators

Important: These tool does not constitute legal or tax advice.

Regular Rate of Pay Calculator

For any pay period with multiple pay rates, non-discretionary bonuses, or commissions. Calculates the FLSA regular rate and half-time premium rate. Use the Half Time Premium Rate to calculate overtime payment & federally tax free portion

01Hourly Pay Rates — Enter rate and hours for each rate used in this pay period
Rate ($/hr)HoursPay
Rate 1—
Rate 2—
Rate 3—
Rate 4—
Rate 5—
Rate 6—
Rate 7—
02Non-Discretionary Bonuses & Commissions — Fixed amounts included in this period
Non-Disc. Bonus 1—
Non-Disc. Bonus 2—
Commission—
Totals——
⚠ Total hours must be greater than 0 to calculate.
Regular Rate of Pay
—
Total pay ÷ total hours
Half-Time Premium Rate
—
RRP × 0.5 — use this to calculate OT owed
Formula:RRP = Total Pay ÷ Total Hours  |  Half-Time Premium = RRP × 0.5
(function() { var rates = ['r1','r2','r3','r4','r5','r6','r7']; var fixed = ['f1','f2','f3']; function get(id) { return document.getElementById(id); } function fmt(v) { return '$' + v.toFixed(2).replace(/\B(?=(\d{3})+(?!\d))/g, ','); } function calc() { var totalHours = 0, totalPay = 0; for (var i = 0; i < rates.length; i++) { var r = parseFloat(get(rates[i]+'r').value) || 0; var h = parseFloat(get(rates[i]+'h').value) || 0; var p = r * h; get(rates[i]+'p').textContent = (r > 0 || h > 0) ? fmt(p) : '\u2014'; totalHours += h; totalPay += p; } for (var j = 0; j < fixed.length; j++) { var a = parseFloat(get(fixed[j]).value) || 0; get(fixed[j]+'p').textContent = a > 0 ? fmt(a) : '\u2014'; totalPay += a; } get('tot-hrs').textContent = totalHours > 0 ? totalHours.toFixed(2) + ' hrs' : '\u2014'; get('tot-pay').textContent = totalPay > 0 ? fmt(totalPay) : '\u2014'; if (totalHours <= 0) { get('out-rrp').textContent = '\u2014'; get('out-prem').textContent = '\u2014'; get('rrp-err').style.display = totalPay > 0 ? 'block' : 'none'; return; } get('rrp-err').style.display = 'none'; var rrp = totalPay / totalHours; var prem = rrp * 0.5; get('out-rrp').textContent = fmt(rrp); get('out-prem').textContent = fmt(prem); get('out-formula').textContent = 'RRP = ' + fmt(totalPay) + ' \u00f7 ' + totalHours.toFixed(2) + ' hrs = ' + fmt(rrp) + ' | Half-Time Premium = ' + fmt(rrp) + ' \u00d7 0.5 = ' + fmt(prem) + ' /hr'; } function clearAll() { var ins = ['r1r','r1h','r2r','r2h','r3r','r3h','r4r','r4h','r5r','r5h','r6r','r6h','r7r','r7h','f1','f2','f3']; for (var i = 0; i < ins.length; i++) { get(ins[i]).value = ''; } var pays = ['r1p','r2p','r3p','r4p','r5p','r6p','r7p','f1p','f2p','f3p']; for (var j = 0; j < pays.length; j++) { get(pays[j]).textContent = '\u2014'; } get('tot-hrs').textContent = '\u2014'; get('tot-pay').textContent = '\u2014'; get('out-rrp').textContent = '\u2014'; get('out-prem').textContent = '\u2014'; get('rrp-err').style.display = 'none'; get('out-formula').textContent = 'RRP = Total Pay \u00f7 Total Hours | Half-Time Premium = RRP \u00d7 0.5'; } var allIns = ['r1r','r1h','r2r','r2h','r3r','r3h','r4r','r4h','r5r','r5h','r6r','r6h','r7r','r7h','f1','f2','f3']; for (var k = 0; k < allIns.length; k++) { get(allIns[k]).addEventListener('input', calc); } get('rrp-clear').addEventListener('click', clearAll); })();

Important: This calculator uses the FLSA weighted-average method to determine the regular rate of pay and the half-time premium rate across any pay period. It does not calculate total gross pay or total overtime owed — those calculations depend on your specific pay period structure, OT hours, and any multi-period bonus allocations. For retroactive commission scenarios, piece-rate situations, or state-specific overtime rules (e.g., California daily OT), consult a payroll compliance professional. This tool does not constitute legal or tax advice.

Tip Overtime Calculator

01Applicable Minimum Wage — Enter the minimum wage for your state or locality
Enter the applicable minimum wage for your state or locality. Some cities and counties have rates higher than the state minimum — always use the highest applicable rate.
Not sure of your rate? Look it up here →
02Hourly Pay Rates — Enter tipped and non-tipped rates and hours worked
Rate ($/hr)HoursPay
Rate 1—
Rate 2—
Rate 3—
Rate 4—
03Tips & Other Amounts Received This Period
Amount
Tips Received 1—
Tips Received 2—
Other Amount—

Include all tips actually received by the employee this period (cash tips, credit card tips, tip pool distributions). “Other Amount” can be used for service charges or other compensation included in total pay.

Totals——
Total Pay Received
—
Wages + tips + other
Minimum Wage Floor
—
Total hrs × min wage
Makeup Pay Owed
—
Shortfall vs. min floor
Formula:(Total Hrs × Min Wage) − Total Pay = Makeup Owed (if positive)
(function() { var rateIds = ['tr1','tr2','tr3','tr4']; var fixedIds = ['tf1','tf2','tf3']; function get(id) { return document.getElementById(id); } function fmt(v) { return '$' + v.toFixed(2).replace(/\B(?=(\d{3})+(?!\d))/g, ','); } function calc() { var minWage = parseFloat(get('tmw').value) || 0; var totalHours = 0, totalWages = 0, totalFixed = 0; for (var i = 0; i < rateIds.length; i++) { var r = parseFloat(get(rateIds[i]+'r').value) || 0; var h = parseFloat(get(rateIds[i]+'h').value) || 0; var p = r * h; get(rateIds[i]+'p').textContent = (r > 0 || h > 0) ? fmt(p) : '\u2014'; totalHours += h; totalWages += p; } for (var j = 0; j < fixedIds.length; j++) { var a = parseFloat(get(fixedIds[j]).value) || 0; get(fixedIds[j]+'p').textContent = a > 0 ? fmt(a) : '\u2014'; totalFixed += a; } var totalPay = totalWages + totalFixed; get('tt-hrs').textContent = totalHours > 0 ? totalHours.toFixed(2) + ' hrs' : '\u2014'; get('tt-pay').textContent = totalPay > 0 ? fmt(totalPay) : '\u2014'; if (totalHours <= 0 || minWage <= 0) { get('to-pay').textContent = totalPay > 0 ? fmt(totalPay) : '\u2014'; get('to-floor').textContent = '\u2014'; get('to-makeup').textContent = '\u2014'; get('tv-box').style.display = 'none'; get('to-formula').textContent = '(Total Hrs \u00d7 Min Wage) \u2212 Total Pay = Makeup Owed (if positive)'; return; } var floor = totalHours * minWage; var shortfall = floor - totalPay; var makeup = shortfall > 0 ? shortfall : 0; get('to-pay').textContent = fmt(totalPay); get('to-floor').textContent = fmt(floor); get('to-makeup').textContent = fmt(makeup); var vbox = get('tv-box'); vbox.style.display = 'block'; if (makeup > 0) { vbox.className = 'tip-verdict owed'; get('tv-title').textContent = '\u26a0 Minimum Wage Makeup Required'; get('tv-body').innerHTML = 'Total compensation of ' + fmt(totalPay) + ' falls short of the ' + fmt(floor) + ' minimum wage floor. The employer must pay an additional ' + fmt(makeup) + ' to bring the employee to minimum wage for this period.'; } else { vbox.className = 'tip-verdict ok'; get('tv-title').textContent = '\u2713 Minimum Wage Met'; get('tv-body').textContent = 'Total compensation of ' + fmt(totalPay) + ' meets or exceeds the ' + fmt(floor) + ' minimum wage floor. No makeup pay is required for this period.'; } get('to-formula').textContent = '(' + totalHours.toFixed(2) + ' hrs \u00d7 ' + fmt(minWage) + ') \u2212 ' + fmt(totalPay) + ' = ' + fmt(makeup) + ' makeup owed'; } var allIns = ['tmw','tr1r','tr1h','tr2r','tr2h','tr3r','tr3h','tr4r','tr4h','tf1','tf2','tf3']; for (var k = 0; k < allIns.length; k++) { get(allIns[k]).addEventListener('input', calc); } })();