How to Configure Custom Activity Rules
Guide to coding specific activities or roles to a flat multiplier, a rate-tree tier (e.g. travel as Overtime), or a Custom tier with dedicated per-role cost codes
What This Feature Does
Custom Activity Rules let you pay specific activities at a different rate from the rest of a worker's day. Each rule targets activities by name pattern (required to re-rate any hours) and can optionally be restricted to specific worker roles. The matched hours are then paid in one of two ways:
- Flat multiplier — the matched hours are paid at
base rate × multiplier(e.g. a training day at 1.5×). - Use rate tree — the matched hours are coded to a chosen tier from the worker's matched rate-tree node, adopting that tier's rate and cost code. For example, code "travel to and from site" as Overtime so it pays at the worker's overtime rate and is cost-coded as overtime, regardless of where the travel falls in the day.
Custom activity rules are configured within Rule Groups inside a pay rate document.
Key Concepts
How a Rule is Triggered
- Activity Name Patterns (required to apply a rate) — wildcard text patterns matched against timesheet activity names (e.g.
*Travel*,Inclement Weather). The rule re-rates the hours of the matching activities. Without an activity pattern, the rule does not re-rate any hours. - Linked Roles (optional filter) — restrict the rule to workers in specific roles. When set alongside activity patterns, both must match (AND logic). A linked role on its own is only a filter — it never applies a rate to any hours by itself.
Rate Source: Multiplier vs Rate Tree
| Rate source | What the matched hours are paid | When to use |
|---|---|---|
| Multiplier (default) | base rate × multiplier, paid as normal hours with no cost code | Simple premium/discount on matched hours (e.g. training at 1.5×) |
| Use rate tree | The selected tier's rate and cost code from the worker's matched tree node | Code an activity as a specific tier — e.g. travel as Overtime ("Overtime A") |
The two sources differ in how they treat hours the calculation has already classified at a premium (daily/weekly overtime, weekend, public holiday):
- Multiplier rules preserve an already-earned premium. When the rule counts toward overtime (the default), only the matched hours the calculation classified as normal are re-priced to
base × multiplier— matched hours that already landed in overtime, weekend, holiday, or weekly overtime keep that premium rate. A multiplier rule therefore never pays less than the normal calculation would have. (When the rule does not count toward overtime, the matched hours are taken out of the overtime calculation entirely and every matched hour is paid at the flat multiplier.) - Rate-tree rules force-code in both directions — see Force-Override below. The chosen tier's rate applies even when it is lower than what the automatic classification would have paid.
Use rate tree requires at least one activity name pattern — the toggle is disabled until a pattern is added, so the coding is always scoped to specific activities.
The Custom tier is the exception within "Use rate tree": it pays base rate × the rule's multiplier and takes its cost code from a per-role assignment (or the rule's default) rather than from a standard tier — see The "Custom" Tier section below.
Available Rate Tiers
When Use rate tree is on, you choose one tier:
- Regular
- Overtime (commonly referred to as "Overtime A")
- Second Overtime
- Saturday / Sunday
- Public Holiday
- Weekly Overtime / Weekly Second Overtime
- Custom — a dedicated segment with its own cost code (see below)
For the standard tiers, the rate and cost code come from the same rate-tree node the worker matched for the rest of their timesheet.
The "Custom" Tier — a Dedicated Cost Code per Role
The Custom tier is for matched hours that need a cost code that doesn't map to any existing tier — for example, an "RDO - Worked" rule where each role's hours must be coded to a unique cost code. Unlike the standard tiers, it works as follows:
- Rate — paid at
base rate × the rule's multiplier(the multiplier stays editable when the Custom tier is selected). - Cost code — resolved per worker, in this order:
- Per-role assignment — set on each rate-tree node in the Rate Tree tab. Every node shows a tile for each Custom-tier rule where you can link, change, or clear a cost code (with an option to apply to all roles at once).
- Default cost code — set on the rule itself in the rule dialog. Used for any role node without its own assignment.
- Neither set — the hours inherit the node's Regular cost code (the node tile shows "Not linked" so the gap is visible before a pay run).
A node tile with no per-role assignment shows "Default:" with the rule's default code, so you can tell covered-by-default apart from genuinely uncoded.
Heads-up: switching a rule's tier away from Custom clears its default cost code and all per-role assignments — they are not kept hidden in the background. Switching back to Custom starts from a clean slate.
Force-Override
When a rule uses the rate tree, the matched activity hours are coded to the chosen tier regardless of how the normal calculation would otherwise classify them. For example, travel that happens to fall after the daily overtime threshold — or travel in normal hours — is always coded to the selected tier.
This works in both directions — a rate-tree rule can reduce pay. The forced tier wins even when the automatic classification would pay more. For example, if Saturday travel would earn a 2× day-rule rate ($200/h) but a travel rule codes it to Overtime at 1.5× ($150/h), the hours are paid at $150/h. This is the key contrast with multiplier rules: rate tree = force-code (can pay less than the automatic rate); multiplier (counting toward overtime) = premium-preserving (never pays less). If a tier should only apply to hours in a particular situation (e.g. only hours past the weekly threshold), add a condition so the rest of the matched hours keep their calculated rate.
Contributes to Overtime
Each rule has a Contributes to overtime setting that controls whether the matched hours count toward the daily/weekly overtime thresholds for the rest of the day. This is independent of the rate tier the hours are coded to. For example, travel coded as Overtime can still count toward the threshold so that later regular work tips into overtime.
Conditions (Optional Triggers)
By default a rule re-codes every matched hour. You can optionally add conditions so the rule only re-codes the hours that satisfy them — the rest of the matched hours keep whatever the normal calculation produced. This is segment-level: a single activity can be split so that, say, only its weekend or night-time portion is re-coded.
Available conditions:
- Days of week — only re-code hours worked on the selected days (e.g. Saturday/Sunday for "weekend travel").
- Time of day — only re-code the portion of an activity that falls inside a clock window. Windows are overnight-aware (e.g.
22:00–06:00), and a partially-overlapping activity is split at the window boundary so only the in-window hours are re-coded. - After weekly overtime threshold — only re-code hours worked past the rule group's existing weekly threshold. This includes hours that another rule coded differently for pay purposes — e.g. hours a Saturday/Sunday or public-holiday day rule coded as weekend/holiday instead of weekly overtime still count as "past the threshold" when the worker had chronologically exceeded it. This reuses the configured weekly threshold — there's no separate number to set. It only has an effect when Contributes to overtime is on (otherwise the matched hours never accrue weekly overtime). Like the time-of-day condition, an activity that straddles the threshold is split at the crossing point: the head (below the threshold) keeps its calculated rate and only the tail is re-coded.
- During shift-coded time — only re-code hours that a Shift Rule governed (i.e. fell inside a shift-coded / night-shift window).
Match any vs. match all — when more than one condition is set, choose how they combine:
- Match any (OR) (default) — a segment is re-coded if it satisfies any set condition. This lets one rule express "weekends or after the weekly threshold or during a night shift".
- Match all (AND) — a segment is re-coded only if it satisfies every set condition.
A condition that is left empty is ignored either way. Leaving all conditions empty keeps the original behaviour (re-code all matched hours).
Multiple Rules on the Same Activity — Order is Priority
Several custom rules can target the same activity pattern with complementary conditions — for example, one travel rule that codes hours past the weekly threshold to Overtime, and a second that codes travel inside a night-shift window to Regular. Rules are evaluated in the order they are configured: each hour goes to the first rule whose conditions it satisfies, and later rules only see the hours earlier rules declined. No hour is ever re-coded twice.
- Put the rule that should win contested hours first in the list.
- A rule whose conditions fail for every matched hour simply codes nothing — the next matching rule still runs.
- Exception: when the first-matching rule has Contributes to overtime off, its matched activities are separated from the overtime calculation and only that rule applies — any other rule matching the same activities is skipped (the processing reasoning calls this out explicitly). Reorder the rules if a different rule should take priority.
How to Create a Custom Activity Rule
- Open a pay rate document from the Pay Rate Documents tab
- Navigate to the Rule Groups section
- In the Custom Activity Rules area, click "Add"
- Fill in the form:
- Rule Name — descriptive name (e.g. "Travel", "Training Day")
- Activity Name Patterns — wildcard patterns matched against activity names (e.g.
*Travel*) - Use rate tree — turn on to code the matched hours as a rate-tree tier (enabled once at least one activity pattern is added)
- Rate tier — the tier to apply (e.g. Overtime)
- Choosing the Custom tier also shows the Rate Multiplier and a Default cost code picker (you can create a new cost code from the picker)
- Rate Multiplier — shown instead of the tier picker when Use rate tree is off
- Optionally link roles and set Contributes to overtime
- Optionally expand Conditions to restrict which matched hours are re-coded (days of week, time of day, after the weekly overtime threshold, during shift-coded time) and choose Match any/Match all
- Click "Save"
- For a Custom-tier rule, open the Rate Tree tab to assign per-role cost codes: each role node shows a tile for the rule — link the role-specific cost code there (or rely on the rule's default)
How to Edit a Custom Activity Rule
- In the Custom Activity Rules list, click the actions menu (three dots) on the rule
- Select "Edit"
- Toggle Use rate tree / change the tier or multiplier, adjust patterns, roles, or overtime contribution
- Click "Save"
Removing all activity name patterns from a rate-tree rule turns the toggle off and reverts it to a multiplier (rate-tree coding always requires a pattern).
How Matched Hours Are Paid
When rates are applied to a timesheet:
- The worker is matched to a rate-tree node and base rate as usual
- Activities matching the rule's patterns/roles are identified
- Multiplier rules: matched hours the calculation classified as normal are re-priced to
base × multiplier; matched hours that already earned an overtime/weekend/holiday premium keep that premium (the rule never reduces below the calculated rate) - Rate-tree rules: matched hours are coded to the chosen tier's rate and cost code, overriding any other classification for those hours — in either direction, including down from a higher automatic rate
- The matched hours' contribution to overtime thresholds follows the rule's Contributes to overtime setting
The processing reasoning for the timesheet shows a "CUSTOM ACTIVITY RULE" line describing which activities were coded and how. When the rule has conditions, the reasoning also notes the active triggers and that only the qualifying hours were re-coded.
Examples
Travel coded as Overtime A
- Activity Pattern:
*Travel* - Use rate tree: On → Overtime
- Travel activities are paid at the worker's overtime rate and cost-coded as overtime, wherever they fall in the shift.
Travel coded as Overtime A only on weekends, past the weekly threshold, or on night shift
- Activity Pattern:
*Travel* - Use rate tree: On → Overtime
- Contributes to overtime: On
- Conditions (Match any):
- Days of week: Saturday, Sunday
- After weekly overtime threshold: On
- During shift-coded time: On
- Travel is coded to Overtime A only for the hours that fall on a weekend, past the 50-hour weekly threshold, or inside a night-shift window. Weekday travel below the threshold and outside any shift window keeps its normal classification.
Training day at time-and-a-half
- Activity Pattern:
*Training* - Use rate tree: Off
- Rate Multiplier: 1.5
- Training hours are paid at 1.5× the base rate.
RDO worked with a unique cost code per role
- Activity Pattern:
*RDO* - Use rate tree: On → Custom
- Rate Multiplier: 2.5
- Default cost code: a general "RDO Worked" code
- In the Rate Tree tab, each role node's tile for the rule is linked to that role's own RDO cost code.
- RDO hours are paid at 2.5× the worker's base rate and cost-coded to their role's specific code; roles without an assignment fall back to the rule's default.
Recoding Only the Overtime Portion by Activity
Custom activity rules recode the whole matched activity — every hour of it. If you instead need to recode only the overtime portion of an activity — leaving the ordinary (below-threshold) hours at the normal rate — use the Split overtime by activity option on a Daily Overtime Rule (configured in the same Rule Group).
This is for cases where the first part of the day is ordinary regardless of activity, but the overtime that follows should be paid — and cost-coded — differently depending on what the worker was doing. For example, a salaried worker whose first 7.6 hours each day are always ordinary, but whose overtime splits by location: office overtime is absorbed into salary, while overtime on the job site is paid.
How It Works
- Open a Daily Overtime Rule tier (e.g. "Daily OT after 7.6h") and add one or more activity splits under Split overtime by activity.
- Each split targets one or more activities (chosen from your account's activity list and matched by name, case-insensitive) and sets:
- Name — the label shown on the recoded overtime pay line.
- Multiplier — the rate for the matched overtime hours, as
base rate × multiplier(e.g.0for overtime absorbed into salary,1.5for paid time-and-a-half). - Cost code (optional) — the cost code for the recoded overtime hours. Leave it blank to keep the tier's default overtime cost code.
- Only the overtime portion is affected. The ordinary hours below the daily threshold are never changed, even for a matched activity.
- Overtime from activities not listed keeps the tier's default overtime rate.
- Splits are scoped to the tier they are configured on: a split on the first tier (e.g. time-and-a-half) recodes only that tier's overtime hours, and a split on the second tier (double time) recodes only its own — an office split on the first tier will not silently re-rate double-time hours.
Note: Split overtime by activity is hidden when the Daily Overtime Rule uses the Loading application method — loading emits overtime as normal hours plus a separate loading line, so there is no overtime line to recode.
Example: Salaried worker, office vs. job site
- Daily Overtime Rule: overtime after 7.6 hours/day.
- Split 1 — Activities: Office; Multiplier:
0; Cost code: Salary Overtime Inclusive. - Split 2 — Activities: Work on job site; Multiplier:
1.5; Cost code: Overtime Hours. - On a 12-hour day the first 7.6 hours stay ordinary; office overtime is recoded to the salary-inclusive code at
0×(absorbed into salary); job-site overtime is paid at1.5×and cost-coded as paid overtime. Overtime from any other activity stays at the rule's default overtime rate.
Tips
- Use rate tree for cost-coding: choose the rate-tree option when the activity should carry a specific tier's rate and cost code (not just a different dollar amount).
- Recode only the overtime slice: to change how the overtime portion of an activity is paid — without touching the ordinary hours — use Split overtime by activity on a Daily Overtime Rule rather than a custom activity rule (which recodes the whole activity).
- Be specific with patterns: the more specific the activity pattern, the fewer false positives.
- Mind overtime contribution: leave Contributes to overtime on if the coded hours should still push other work into overtime; turn it off for premium hours that shouldn't affect thresholds.
- Test with a sample timesheet: apply rates to a test period and confirm the right activities are coded and the breakdown reconciles.
What's Next
- Return to Rule Groups to configure other rule types
- Set up Allowance Rules for extra payments on top of the base rate
- Configure Shift Rules for time-based rate multipliers
- Learn about Cost Code Linking for accurate project costing

