Overtime pay calculator
A rate of 20 with 40 regular hours and 5 overtime hours at 1.5 times gives 800 regular, 150 overtime and 950 gross. Check a timesheet or a contractor invoice before deductions. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Hourly rate
- 20
- Regular hours
- 40
- Overtime hours
- 5
- Overtime multiplier
- 1.5
- Ot hourly rate
- 30
- Regular pay
- 800
- Overtime pay
- 150
- Gross pay
- 950
Figuring weekly take-home before deductions should not require a spreadsheet template or a napkin full of rate times hours arithmetic. This overtime pay calculator takes four everyday payroll inputs—the base hourly rate, the number of regular (straight-time) hours, the number of overtime hours, and the overtime multiplier such as one point five for time-and-a-half—and returns the regular pay line, the overtime pay line, the effective overtime hourly rate, and the gross pay for that period, all rounded cleanly to two decimal places. A negative hourly rate is rejected with a clear invalid input error, because a negative wage does not describe a valid gross-pay calculation.
How regular pay, overtime pay, and gross pay are computed
The core formulas are the ones people already use by hand on a timesheet. Regular pay equals hourly rate times regular hours. Overtime pay equals hourly rate times overtime multiplier times overtime hours.
Gross pay is the sum of those two lines. Intermediate products use ordinary floating-point arithmetic, then every money field is rounded half-up to two decimal places so results look like currency on a payslip rather than long binary fractions. Example: a rate of twenty, forty regular hours, five overtime hours, and a multiplier of one point five yields eight hundred in regular pay, one hundred fifty in overtime pay, an effective OT rate of thirty, and a gross of nine hundred fifty after rounding.
Equal math for every jurisdiction is intentional product scope: daily overtime thresholds, seventh-day rules, and tax withholding would be different search intents and different contracts.
What you can do with it
Weekly employee pay estimates
Workers and managers enter base rate, straight-time hours, OT hours, and the company multiplier to see regular, overtime, and gross pay before deductions.
Freelance and contractor invoices
Contractors who bill premium hours at a stated multiple of their base rate compute a transparent gross line for invoices and client estimates.
FAQ
What happens if the hourly rate is negative?
Negative wages are not a valid gross-pay input and are not charged.
Does this decide which hours count as overtime?
No. You supply the regular versus overtime hour split under your local rules. The calculator multiplies the hours you send by the rate and multiplier.
Is the overtime pay calculator free?
The browser tool runs free on your device.
How do I calculate time and a half?
Multiply the base rate by 1.5 to get the overtime rate, then multiply that by the overtime hours. A base rate of 20 becomes 30 per overtime hour, so 5 overtime hours add 150.
Should I enter the overtime premium as a percentage?
No. Enter it as a multiple of the base rate: 1.5 for time and a half and 2 for double time. A percentage figure would be read as a multiple and inflate the result.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/life/overtime-pay \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"hourly_rate":20,"regular_hours":40,"overtime_hours":5,"overtime_multiplier":1.5}'const res = await fetch("https://api.kit.forhosting.com/life/overtime-pay", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"hourly_rate": 20,
"regular_hours": 40,
"overtime_hours": 5,
"overtime_multiplier": 1.5
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/life/overtime-pay",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"hourly_rate": 20,
"regular_hours": 40,
"overtime_hours": 5,
"overtime_multiplier": 1.5
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/life/overtime-pay", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"hourly_rate":20,"regular_hours":40,"overtime_hours":5,"overtime_multiplier":1.5}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"hourly_rate":20,"regular_hours":40,"overtime_hours":5,"overtime_multiplier":1.5}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/life/overtime-pay", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"hourly_rate": 20,
"regular_hours": 40,
"overtime_hours": 5,
"overtime_multiplier": 1.5
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "life.overtime_pay",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
Inputs: hourly rate, regular hours, overtime hours, and multiplier
Negative hour counts and negative multipliers are also rejected so accidental sign flips fail loudly instead of inventing absurd negatives on a payslip. All validation happens before any money math, so bad requests never produce half-filled pay rows. You already decide which hours are regular versus overtime under your local rules; this calculator multiplies what you send rather than inventing a forty-hour week policy. Send a JSON body with four required fields. Hourly rate is the base wage per hour as a non-negative finite number or numeric string; aliases rate, wage, hourly, and pay_rate are accepted when your client already names the field differently. Regular hours are the straight-time hours paid at that base rate; aliases hours, straight_hours, regular, and straight_time map to the same value so form builders can keep familiar labels. Overtime hours are the premium hours for the same pay period; aliases ot_hours, overtime, and ot are supported. Overtime multiplier is the premium expressed as a multiple of the base rate—for example one point five means time-and-a-half and two means double time—not a percentage of the wage; aliases multiplier, ot_multiplier, ot_rate, and premium map to the same field. Negative hourly rates fail validation with invalid_input because they do not describe a normal paycheck. Extremely large rates, hour totals, or multipliers are capped so Worker isolate math stays bounded. Missing any of the four fields fails with invalid_input naming the missing key.
How regular pay, overtime pay, and gross pay are computed
The response also returns ot_hourly_rate as hourly rate times the multiplier so UIs can show the effective overtime wage next to the base rate. The response echoes the normalized hourly rate, regular hours, overtime hours, and overtime multiplier, then returns ot_hourly_rate, regular_pay, overtime_pay, and gross_pay, plus currency_decimals equal to two and method equal to overtime_gross for stable client branching. Use regular_pay alone when you only need the straight-time line; use overtime_pay when a report needs the premium line; use gross_pay when a contractor invoice or weekly estimate needs the combined amount. Identical inputs always produce identical JSON because the path is pure arithmetic with no network, no random seed, and no wall clock.
API usage, pricing, workflows, and practical limits
Call the free in-browser overtime pay calculator for weekly estimates, side-gig invoices, classroom payroll exercises, and quick manager checks without installing another app. Keep rates and hours within ordinary commercial ranges; extreme values are rejected so isolate math stays bounded. The product promise is gross pay from a base rate, a regular and overtime hour split you already chose, and an explicit multiplier—not automatic legal classification of overtime, multi-rate shift differentials, or local statutory OT tables. Those belong in specialized tools with different SEO intent. Use the prepaid API when an HR bot, freelancing dashboard, staffing portal, or timesheet helper needs a stable KIT contract at $0.002 per successful item; validation failures never consume balance after the engine rejects the request. Pair this endpoint with tax or deduction tools only if you already know net-pay rules separately—this capability does not withhold taxes, apply benefits, or convert currencies. Authors shipping SDKs can map regular_pay, overtime_pay, and gross_pay directly into payslip UIs and estimate messages. When you cite the API price in product copy, use the catalog placeholder $0.002 so published pages stay aligned with the live price floor.
Integration use cases
HR bots and timesheet apps
Bots and mini-apps call a stable prepaid endpoint instead of reimplementing OT gross math and negative-rate guards in every language.
Technical questions
How do I calculate overtime pay and gross pay?
Send JSON with hourly_rate, regular_hours, overtime_hours, and overtime_multiplier (for example 1.5). The response includes regular_pay, overtime_pay, ot_hourly_rate, and gross_pay rounded to two decimals.
Is overtime_multiplier a percentage or a multiple of the wage?
It is a multiple of the base hourly rate. Use 1.5 for time-and-a-half and 2 for double time, not 150 or 50 percent.