Penalties & Deductions
Understand how attendance penalties work, configure deduction modes, and manage tiered penalty structures.
Penalties & Deductions
Understand how attendance penalties work, configure deduction modes, and manage tiered penalty structures.
Quick Access
| Role | Navigation | Route |
|---|---|---|
| HR Admin | HR → Shift Schedule Templates | /hr/shift-schedule-templates |
| HR Admin | HR → Timesheets | /hr/time-sheet |
| Employee | HR → My Timesheet | /hr/my-time-sheet |
Overview
Attendance penalties are automatic deductions applied when employees:
- Clock in late (after scheduled shift start)
- Clock out early (before scheduled shift end)
- Take excessive breaks (beyond allowed duration)
Penalties are configured per shift template and calculated automatically during attendance processing.
Penalty Types
The system tracks three types of penalties:
| Penalty Type | Trigger | Property |
|---|---|---|
| Clock In Penalty | Arriving after shift start | ClockInPenalty |
| Clock Out Penalty | Leaving before shift end | ClockOutPenalty |
| Break Penalty | Exceeding allowed break time | BreakPenalty |
Total Penalty = ClockInPenalty + ClockOutPenalty + BreakPenalty
Penalty Deduction Modes
Five deduction modes determine how penalty amounts are calculated:
None
No penalty is applied regardless of attendance deviations.
| Use Case | Organizations with flexible attendance policies |
|---|---|
| Formula | Penalty = 0 |
FixedPerBlock
A fixed amount is deducted for each time block of lateness/early departure.
| Use Case | Consistent, predictable penalty amounts |
|---|---|
| Formula | Penalty = Blocks × DeductionRate |
Configuration:
ClockInDeductionMode: FixedPerBlockClockInDeductionRate: 1.00(amount per block)PenaltyMinuteBlock: 5(block size in minutes)
Example:
- Late by: 17 minutes
- Block size: 5 minutes
- Blocks: Floor(17 / 5) = 3 blocks
- Rate: RM 1.00 per block
- Penalty: 3 × RM 1.00 = RM 3.00
OneTime
A flat penalty amount regardless of how late/early.
| Use Case | Simple "you're late" policy |
|---|---|
| Formula | Penalty = DeductionRate (flat) |
Configuration:
ClockInDeductionMode: OneTimeClockInDeductionRate: 50.00
Example:
- Late by 5 minutes → RM 50.00 penalty
- Late by 60 minutes → RM 50.00 penalty (same amount)
Tiered
Graduated penalties based on lateness severity. More late = higher penalty tier.
| Use Case | Progressive discipline, escalating consequences |
|---|---|
| Formula | Penalty = Tier rate based on minutes late |
Configuration:
ClockInDeductionMode: TieredorOneTimeClockInTieredPenalties: [...](array of tiers)
Example Tiers:
| Tier | Range | Penalty |
|---|---|---|
| 1 | 1-15 minutes | RM 10.00 |
| 2 | 16-45 minutes | RM 30.00 |
| 3 | 46+ minutes | RM 50.00 |
Behavior:
- Late by 10 minutes → Tier 1 → RM 10.00
- Late by 30 minutes → Tier 2 → RM 30.00
- Late by 60 minutes → Tier 3 → RM 50.00
DailyRate
Penalty proportional to the daily wage, based on time missed.
| Use Case | Fair penalty relative to earnings |
|---|---|
| Formula | Penalty = (Late minutes / Working minutes) × Daily Wage |
Configuration:
ClockInDeductionMode: DailyRate
Example:
- Daily wage: RM 100.00
- Working hours: 8 hours (480 minutes)
- Late by: 30 minutes
- Penalty: (30 / 480) × RM 100 = RM 6.25
Tiered Penalties Configuration
Tiered penalties allow graduated consequences for lateness.
Structure
Each tier has:
| Property | Type | Description |
|---|---|---|
Name |
string | Display name (e.g., "Tier 1") |
StartMinutes |
int | Minimum minutes late for this tier |
EndMinutes |
int? | Maximum minutes (null = no upper limit) |
Rate |
decimal | Penalty amount for this tier |
FixedAmount |
decimal? | Alternative fixed amount |
Example Configuration
Kaewta (Thailand) Morning Shift:
{
"ClockInDeductionMode": "OneTime",
"ClockInTieredPenalties": [
{
"Name": "Tier 1",
"StartMinutes": 1,
"EndMinutes": 15,
"Rate": 10.00
},
{
"Name": "Tier 2",
"StartMinutes": 16,
"EndMinutes": 45,
"Rate": 30.00
},
{
"Name": "Tier 3",
"StartMinutes": 46,
"EndMinutes": null,
"Rate": 50.00
}
]
}
Tiered Mode vs OneTime with Tiers
| Mode | Behavior |
|---|---|
Tiered |
Penalty accumulates through each tier |
OneTime with Tiers |
Only highest matching tier is applied |
With OneTime mode:
- 30 minutes late → Tier 2 → RM 30.00 (single tier)
With Tiered mode (accumulating):
- 30 minutes late → Rate accumulated per block through tiers
Buffer Settings
Buffers provide grace periods before penalties apply.
PenaltyClockInBuffer
Grace period for late arrivals.
| Buffer | Behavior |
|---|---|
| 0 or null | Any lateness incurs penalty |
| 5 | Late by < 5 minutes = no penalty |
| 10 | Late by < 10 minutes = no penalty |
Example:
- PenaltyClockInBuffer: 5 minutes
- Shift starts: 09:00
- Clock in: 09:04 → No penalty (within buffer)
- Clock in: 09:06 → Penalty applies (1 minute over buffer)
PenaltyClockOutBuffer
Grace period for early departures.
Example:
- PenaltyClockOutBuffer: 5 minutes
- Shift ends: 18:00
- Clock out: 17:56 → No penalty (within buffer)
- Clock out: 17:50 → Penalty applies (10 minutes early)
PenaltyBreakBuffer
Grace period for break overruns.
Example:
- Allowed break: 60 minutes
- PenaltyBreakBuffer: 5 minutes
- Actual break: 63 minutes → No penalty (3 min over, within buffer)
- Actual break: 70 minutes → Penalty applies (10 min over limit)
Break Penalties
Penalize employees who take longer breaks than allowed.
Configuration
| Property | Description |
|---|---|
BreakDeductionMode |
How to calculate break penalty |
BreakDeductionRate |
Rate for FixedPerBlock or OneTime |
MaxBreakLengthInMinutes |
Allowed break duration |
PenaltyBreakBuffer |
Grace period for break overruns |
Calculation
Break Excess = Actual Break Duration - Allowed Break Duration
If Break Excess > PenaltyBreakBuffer:
Penalty = Calculate based on BreakDeductionMode
Real-World Example: MrPa Configuration
Template: "Shop 3 - A"
{
"MaxBreakLengthInMinutes": 60,
"BreakDeductionMode": "FixedPerBlock",
"BreakDeductionRate": 1.00,
"PenaltyMinuteBlock": 1
}
Scenario:
- Allowed break: 60 minutes
- Actual break: 72 minutes
- Excess: 12 minutes
- Penalty: 12 blocks × RM 1.00 = RM 12.00
Block Modes for Penalties
Penalties can be rounded using Floor or Ceiling modes.
Floor Mode (Default)
Rounds down to favor employees.
| Late By | Block Size | Blocks | Penalty (@ RM 1/block) |
|---|---|---|---|
| 7 min | 5 min | 1 | RM 1.00 |
| 14 min | 5 min | 2 | RM 2.00 |
| 16 min | 5 min | 3 | RM 3.00 |
Ceiling Mode
Rounds up, stricter enforcement.
| Late By | Block Size | Blocks | Penalty (@ RM 1/block) |
|---|---|---|---|
| 7 min | 5 min | 2 | RM 2.00 |
| 14 min | 5 min | 3 | RM 3.00 |
| 16 min | 5 min | 4 | RM 4.00 |
Maximum Penalty Cap
The MaxPenalty setting prevents excessive deductions.
| Property | Type | Description |
|---|---|---|
MaxPenalty |
decimal | Maximum penalty amount per attendance |
Example:
- Calculated penalty: RM 150.00
- MaxPenalty: RM 100.00
- Applied penalty: RM 100.00 (capped)
Penalty Factor
The PenaltyFactor multiplies all penalty calculations.
| Factor | Effect |
|---|---|
| 1.0 | Standard penalty |
| 0.5 | Half penalty (probation?) |
| 1.5 | Increased penalty (repeat offenders?) |
| 2.0 | Double penalty |
Example:
- Base penalty: RM 20.00
- PenaltyFactor: 1.5
- Applied penalty: RM 30.00
Half-Day Leave Adjustments
When employees are on half-day leave, penalties adjust accordingly.
AM Half-Day Leave
Clock-in time is shifted to mid-shift.
Example:
- Shift: 09:00 - 18:00 (8 hours)
- AM Leave: Employee starts at 13:00
- Clock in: 13:15 → 15 minutes late (from adjusted time)
PM Half-Day Leave
Clock-out time is shifted to mid-shift.
Example:
- Shift: 09:00 - 18:00 (8 hours)
- PM Leave: Employee ends at 13:00
- Clock out: 12:50 → 10 minutes early (from adjusted time)
Time-Off Slot Adjustments
Approved time-off slots adjust penalty calculations.
| Slot Type | Adjustment |
|---|---|
Start |
Shifts expected clock-in time |
Middle |
No effect on clock in/out penalties |
End |
Shifts expected clock-out time |
Example:
- Shift: 09:00 - 18:00
- Approved time-off slot: 09:00 - 10:00 (Type: Start)
- Adjusted shift start: 10:00
- Clock in: 10:15 → 15 minutes late (not 1h 15min)
Real-World Examples
Example 1: Simple Late Arrival
Employee: Muhamad Firdaus Date: January 25, 2026 Template: "7.30AM"
| Setting | Value |
|---|---|
| Shift | 07:30 - 16:00 |
| PenaltyClockInBuffer | 5 minutes |
| ClockInDeductionMode | DailyRate |
| NormalHourlyRate | RM 8.75 |
Attendance:
- Clock In: 07:35:07 (5 minutes 7 seconds late)
Calculation:
Late = 5:07 (5 min 7 sec)
Buffer = 5 minutes
Effective late = 7 seconds (over buffer)
Rate = RM 8.75 / 60 = RM 0.146/minute
Penalty = 0.12 minutes × RM 0.146 = RM 0.02
Note: With such small lateness, penalty may round to zero or minimal amount.
Example 2: Tiered Penalty (Kaewta)
Employee: Somchai Template: "Morning" with Tiered Penalties
| Tier | Range | Penalty |
|---|---|---|
| 1 | 1-15 min | RM 10.00 |
| 2 | 16-45 min | RM 30.00 |
| 3 | 46+ min | RM 50.00 |
Scenario 1: Clock in 08:55 (10 min late)
- Falls in Tier 1 (1-15 min)
- Penalty: RM 10.00
Scenario 2: Clock in 09:15 (30 min late)
- Falls in Tier 2 (16-45 min)
- Penalty: RM 30.00
Scenario 3: Clock in 10:00 (75 min late)
- Falls in Tier 3 (46+ min)
- Penalty: RM 50.00
Example 3: Combined Penalties
Employee: Ahmad Date: January 20, 2026
| Penalty Type | Amount |
|---|---|
| Clock In (15 min late) | RM 5.00 |
| Break (10 min excess) | RM 2.50 |
| Clock Out (early by 5 min) | RM 1.25 |
| Total Penalty | RM 8.75 |
Example 4: Penalty with MaxPenalty Cap
Employee: Lee Calculated Penalties:
- Clock In: RM 75.00
- Break: RM 30.00
- Clock Out: RM 45.00
- Total: RM 150.00
MaxPenalty Setting: RM 100.00
Applied Penalty: RM 100.00 (capped)
Configuration Summary
Complete Penalty Configuration
{
"Name": "Standard Shift",
// Clock In Penalty
"ClockInDeductionMode": "FixedPerBlock",
"ClockInDeductionRate": 1.00,
"PenaltyClockInBuffer": 5,
// Clock Out Penalty
"ClockOutDeductionMode": "DailyRate",
"ClockOutDeductionRate": null,
"PenaltyClockOutBuffer": 5,
// Break Penalty
"BreakDeductionMode": "FixedPerBlock",
"BreakDeductionRate": 0.50,
"MaxBreakLengthInMinutes": 60,
"PenaltyBreakBuffer": 5,
// Shared Settings
"PenaltyBlockMode": "Floor",
"PenaltyMinuteBlock": 5,
"MaxPenalty": 100.00,
"PenaltyFactor": 1.0,
// Tiered (optional)
"ClockInTieredPenalties": []
}
For HR Administrators
Viewing Penalties in Timesheet
- Go to HR → Timesheets
- Select employee and date range
- View penalty columns:
- Clock In Penalty
- Clock Out Penalty
- Break Penalty
- Total Penalty
Adjusting Penalty Settings
- Go to HR → Shift Schedule Templates
- Select the template
- Navigate to Penalty Settings
- Configure:
- Deduction mode
- Rates
- Buffers
- Tiered penalties
Penalty Reports
Penalties flow through to payroll as deductions. Review:
- Individual timesheets for penalty details
- Payroll summaries for total deductions
- Attendance reports for patterns
Tips
- Set appropriate buffers - A 5-minute buffer prevents penalties for minor clock variations
- Use tiered penalties wisely - Graduated penalties encourage punctuality without harsh one-time penalties
- Cap maximum penalties - Prevent excessive deductions with
MaxPenaltysetting - Document your policy - Ensure employees understand penalty structure
- Review regularly - Check penalty reports for patterns indicating system issues