Working with Multiple Hourly Rates: Overtime, Nights, and Weekends
Overview
Kompass supports projects that charge at different rates depending on when work is performed. For example, a standard day rate, an overtime rate for hours beyond a threshold, a night shift rate, and an elevated weekend rate. This is configured at two levels that work together:
- Proposal item cost options: define the rates and budgets for a piece of work when building a proposal. The
field_fixedandoffice_fixedsettings control whether those rates are locked or adjustable per proposal item. - Diary Config - Hours Paid JSON: controls how employee diary hours are automatically split across rate bands based on the time of day, day of the week, or bank holiday status. This is the engine that makes Kompass calculate the correct number of hours at each rate from a timesheet entry.
These two features are independent: cost options define what you charge the client, and the Hours Paid JSON defines how Kompass counts your employees' hours internally. Both are typically needed to handle overtime and premium rates end-to-end.
Part 1: Flexible Cost Options - Field Fixed and Office Fixed
What are these settings?
Every cost option in the Admin (Admin → Quote Items → Cost Options) has three "fixed" flags:
| Setting | What it controls |
|---|---|
| Name Fixed | If ticked, the cost name cannot be changed when adding it to a proposal item. If unticked, the user can edit the name freely. |
| Field Fixed | If ticked, the Field Days, Field Hours, Field Day Cost, and Field Hour Cost values on the cost are locked after being added to a proposal item — users cannot change them. If unticked, users can enter whatever values they need. |
| Office Fixed | Same as Field Fixed but for the Office Days, Office Hours, Office Day Cost, and Office Hour Cost fields. |
By default all three flags are ticked (locked). This ensures cost templates are applied consistently and no one accidentally changes a rate.
When should you untick Field Fixed or Office Fixed?
Unticking one or both is useful when the rate itself is fixed but the number of days or hours varies per project, or when the client has agreed a custom rate that differs from the template.
For the overtime/multiple rate scenario, the typical approach is:
- Create separate cost options for each rate band — for example:
- "Standard Hours" (field hour cost = $X)
- "Overtime Hours" (field hour cost = $Y)
- "Weekend Hours" (field hour cost = $Z)
- "Night Shift Hours" (field hour cost = $W)
- Set Field Fixed = unticked on each of these options, so the person building the proposal can fill in the number of hours expected at each rate for that specific project.
- When building a proposal item, add all the relevant rate bands as separate cost rows. Each row represents a different charging rate, and the user fills in the estimated hours at each rate.
This gives you a clear breakdown of the planned cost at each rate in the proposal, and the total price reflects the correct blended rate.

The Time Multiplicator
Each cost option also has a Time Multiplicator field. This multiplies the days and hours budget for that cost when calculating the proposal item's hours budget. It does not affect the financial cost calculation.
For example, if a cost option has 10 field hours and a time multiplicator of 1.5, the hours budget contribution for that cost is 15 hours. This is useful when overtime hours need to appear as a larger budget contribution for scheduling purposes.
Part 2: Hours Paid JSON - Automatic Rate Band Splitting in Timesheets
What does it do?
The Hours Paid JSON setting on the Diary Config (Admin → Diary → Configs → Hours Paid JSON) tells Kompass how to split each diary entry's hours across different pay multiplier bands automatically, based on:
- Time of day: for example, hours before 06:00 or after 22:00 attract a night shift multiplier.
- Day of the week: Saturday and Sunday can be assigned different multipliers from weekdays.
- Bank holidays: bank holiday entries can be given their own rate band.
When an employee submits a timesheet entry, Kompass inspects the start and end times against the configured bands and calculates how many hours fall into each band. The resulting hours_paid and hours_paid_by_band fields on each entry reflect this split. These are the values used for payroll exports, cost calculations against user rates, and reporting.
Structure of the Hours Paid JSON
The JSON has the following structure:
{
"breaks": {
"method": "entry",
"multiplier": 1.0
},
"travel": {
"method": "entry",
"multiplier": 1.0
},
"days": {
"default": {
"bands": {
"00:00": 1.0,
"06:00": 1.0,
"22:00": 1.5
}
},
"sat": {
"bands": {
"00:00": 1.5
}
},
"sun": {
"bands": {
"00:00": 2.0
}
},
"hol": {
"bands": {
"00:00": 2.0
}
}
}
}
The days object
The days object defines the rate bands for each day type. The following keys are supported:
| Key | When it applies |
|---|---|
default |
All days not explicitly listed. Required. |
mon |
Mondays |
tue |
Tuesdays |
wed |
Wednesdays |
thu |
Thursdays |
fri |
Fridays |
sat |
Saturdays |
sun |
Sundays |
hol |
Bank holidays (from the user's assigned calendar) |
Each day entry must have a bands object. The bands object maps time-of-day keys (in HH:MM format, 24-hour clock) to multipliers. Each band starts at the specified time and runs until the next band's start time (or midnight). Every bands object must include "00:00" as its first key.
Example: The configuration above defines:
- Standard weekdays: hours from 00:00–06:00 at ×1.0, 06:00–22:00 at ×1.0, 22:00–midnight at ×1.5 (night premium).
- Saturdays: all hours at ×1.5.
- Sundays and bank holidays: all hours at ×2.0.
- If a user works a 10-hour shift starting at 20:00 on a Wednesday, 2 hours fall in the 1.0 band and 2 hours in the 1.5 band, Kompass calculates this automatically.
How breaks and travel are handled
The top-level breaks and travel objects define how break and travel time interacts with the band calculation. Each has a method and optionally a multiplier and threshold:
| Method | What it does |
|---|---|
unpaid |
The break/travel time is unpaid - deducted from hours before the band multipliers are applied. |
entry |
The break/travel time is paid, using the specified multiplier. A threshold (in hours) can be set: any break time below the threshold is unpaid, the rest is paid. |
day_equal |
The total break/travel across all entries for the day is distributed equally across all entries on that day. Useful for organisations where breaks are shared across multiple logged shifts. |
day_proportional |
Same as day_equal but distributed in proportion to each entry's hours. |
You can override breaks or travel at individual day level by adding a breaks or travel key inside a specific day's config. This overrides the top-level default for that day only.
Entries that cross midnight
Kompass handles diary entries that cross midnight correctly. The hours before midnight are calculated against the day the shift started, and the hours after midnight are calculated against the new day's bands. This means a night shift starting at 22:00 on Friday and ending at 06:00 on Saturday will correctly apply Friday's bands to the first 2 hours and Saturday's bands to the remaining 6 hours.
How this appears in the diary
Once the Hours Paid JSON is configured, employees do not need to do anything differently. They log their start time, end time, and breaks as normal. Kompass recalculates hours_paid automatically each time an entry is saved. The diary export includes an hours_paid_by_band column showing the breakdown per multiplier band for each entry — useful for payroll processing.
Note: The Hours Paid JSON configuration is set by your Kompass administrator on the Diary Config for your organisation. It is not something individual users can configure.
Part 3: How the Two Features Work Together
For a project where you charge the client different rates for overtime, nights, and weekends:
On the proposal:
- Create one cost option per rate band (Standard Hours, Overtime Hours, Night Hours, Weekend Hours), each with the appropriate
field_hour_costandfield_fixed = false. - When building the proposal item for this project, add a cost row for each expected rate band and fill in the estimated hours at each rate.
- The proposal total reflects the blended price across all rate bands.
In timesheets:
- Configure the Hours Paid JSON on the Diary Config to match your agreed rate bands (time ranges, day types, and multipliers).
- Employees log their time as normal, single entries covering their full shift.
- Kompass automatically splits each entry into the correct bands and calculates
hours_paidaccordingly. - The payroll export contains the band breakdown per entry for use in payroll processing.
In reporting:
The hours_paid_by_band data on each diary entry lets you reconcile the hours billed to the client (from the proposal cost rows) against the hours paid to employees (from the diary band calculation), giving you a clear view of margin per rate band.
Summary
| Feature | Where to configure | What it does |
|---|---|---|
| Field Fixed / Office Fixed | Admin → Quote Items → Cost Options | Controls whether rate fields on a cost option can be edited when building a proposal. Untick to allow custom rates per project. |
| Time Multiplicator | Admin → Quote Items → Cost Options | Multiplies hours budget contribution for scheduling and reporting. Does not affect costs or price. |
| Hours Paid JSON | Admin → Diary → Configs → Hours Paid JSON | Defines how diary hours are automatically split across rate bands by time of day, day of week, and bank holidays. Powers accurate payroll calculations. |