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_fixed  and office_fixed  settings 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:


  1. 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)
  2. 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.
  3. 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:


  1. Create one cost option per rate band (Standard Hours, Overtime Hours, Night Hours, Weekend Hours), each with the appropriate field_hour_cost  and field_fixed = false .
  2. 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.
  3. The proposal total reflects the blended price across all rate bands.

In timesheets:


  1. Configure the Hours Paid JSON on the Diary Config to match your agreed rate bands (time ranges, day types, and multipliers).
  2. Employees log their time as normal, single entries covering their full shift.
  3. Kompass automatically splits each entry into the correct bands and calculates hours_paid  accordingly.
  4. 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.
Did this answer your question? Thanks for the feedback There was a problem submitting your feedback. Please try again later.

Still need help? Contact Us Contact Us