Meal Allowance
Set one meal allowance policy for the group, override it per company or per employee, choose who's enrolled, and let payroll auto-pay the right amount per shift.
Hopshift Meal Allowance works like the rest of the app: you set one policy for the group, optionally override it for a specific company or employee, then choose who's enrolled. Payroll automatically pays the right amount per employee based on their selected calculation mode, and handles SSO contributions and PND1 withholding tax correctly without any manual math.
Meal Allowance is currently available for Thailand companies only. The policy sets the amount and attendance rules; enrolled employees are paid by attendance or for every clocked day.
Attendance or every clocked day
On Manage staff, enrolled employees default to By attendance. Existing enrollments keep this mode. Choose Every clocked day to pay the daily amount once for every day in the pay period on which the person clocked in, with no roster, minimum hours or lateness rules. A day counts when it has a clock-in that was not rejected: a missing or rejected clock-out still counts, several sessions on one day count once, and leave days have no clock-in, so they pay nothing. A clock-in linked to a shift counts on that shift's date. A recurring meal pay item or scheduled meal payment must be removed before enabling it; the same protection applies when adding those payments later.
Permanent transfers copy enrollment settings and use the destination company's policy; source history stays available. A reversal only retires the enrollment created by that transfer if nobody has edited it.
By attendance keeps the policy's minimum (8h in the current policy), roster requirement and attendance deductions. The No-roster days option permits eligible approved attendance without a shift; minimum duration still applies. Accepted clock-in/out pairs and approved corrections determine attendance, including reviewed long and overnight sessions. Recorded and configured breaks follow the existing break rules and are not deducted twice. A scheduled span alone does not establish qualifying attendance.
Enrollment, amount, mode, no-roster and applicable policy changes automatically queue a refresh of the current open DRAFT/REVIEW cycle. If no run exists, the settings apply when payroll is created. Approvals queue affected dates together with the attendance change. Existing payroll review requirements still apply. The company sheet displays Recalculating, Updated, Override protected or Needs review; review-blocked rows stop polling. Finalized payroll and deliberate paid overrides remain protected.
Current-state exports list each clocked day for Every clocked day staff. Reports include employees whose employment overlaps the period, including leavers and transfers. Saved payroll exports retain the paid amount, engine amount and historical audit. Payroll saved before 23 October 2026 may show the retired Fixed monthly mode, with its configured amount and coverage dates instead of a daily rate. Meal allowance is taxed as paid in the month and is not forecast as fixed pay.
The attendance-specific instructions below apply to By attendance. Every clocked day payments do not depend on shifts, lateness or hours worked.
How It Works at a Glance
| Stage | Who | Where |
|---|---|---|
| Set the policy | HR Admin | Group page: Meal Allowance |
| Choose who's enrolled | HR Admin | Meal Allowance > Manage staff |
| Automatic calculation | Engine | Every payroll recalculation |
| Review and override | HR Admin | Meal Allowance page: the company sheet-tab for the month (or the Meal allowance button on a payroll run) |
| Audit trail | Permanent | Engine value vs paid value visible per line |
Step 1: Set the Policy
Navigate to Meal Allowance in the group sidebar (Payroll section). The page is a monthly workbook: a month picker, a Policies sheet-tab, and one sheet-tab per company that has a payroll run that month. The Policies sheet has two parts: the group default and company overrides.
The cascade (group, then company, then employee)
An enrolled employee's amount and attendance rules are resolved in this order, nearest wins:
- Employee override: a custom amount set for one person on the Staff page (amount only).
- Company override: a policy that replaces the group default for one company.
- Group default: the baseline for everyone enrolled, in every company.
So most groups set one group default and leave it at that. Add a company override only where a company genuinely differs, and an employee override only for a one-off person.
Group default
The group default applies to everyone enrolled, in every company, unless a company overrides it. It is optional: a group can skip it and define only company policies (enrolled staff in a company with no policy simply get nothing until you add one).
Click Set group default (or Edit) and fill in:
| Field | Description |
|---|---|
| Name | Internal label (e.g., "Standard meal allowance") |
| Amount per day (THB) | What to pay per qualifying shift |
| Min / Max hours | The shift-duration window that qualifies (leave Max blank for no upper limit) |
| Taxable | Whether the amount counts toward PND1 income (on by default) |
| Effective from | Optional start date. Shifts before it earn nothing (e.g. "meal allowance starts June 1"). Leave blank to apply to all shifts. Editing the policy does not back-pay earlier periods past this floor. |
| Attendance deductions | See Step 1b below |
Company overrides
Under Company overrides, every Thailand company in the group is listed. A company either:
- Uses the group default (no override), the common case, or
- Has its own policy: click Add policy to give it a different amount or attendance rules.
A company override is a full policy (amount + attendance), edited the same way as the group default. Remove it any time to fall back to the group default.
Step 1b: Attendance-Based Deductions
The policy can shrink or withhold the allowance based on how the employee actually attended their shift. These settings live on each policy (group default and company overrides):
| Setting | Effect |
|---|---|
| Lateness deduction | How lateness reduces the allowance: Pro-rated (lose the same fraction of the allowance as the fraction of the shift missed), Per minute (a fixed amount per late minute), or None. |
| Count early clock-out | When on, leaving before the shift ends counts the same way as arriving late. Late minutes and early minutes add up. |
| Grace (minutes) | Lateness or early departure within this many minutes is forgiven. Set to 0 for no grace. |
| No allowance if no clock-out | When on, an employee who clocked in but forgot to clock out gets no allowance for that day. |
| No allowance on a no-show | When on, a scheduled shift with no clock-in pays nothing (it would anyway if Min hours > 0). |
| Half allowance if they arrive past the shift midpoint | When on, arriving after the midpoint of the shift pays half the allowance (used when Lateness deduction is None). |
Example (Pro-rated, grace 0, early-out on, 500 THB on an 8-hour shift): arriving 24 minutes late pays 475 THB; also leaving 30 minutes early pays 444 THB (54 missed minutes out of 480). Forgetting to clock out pays 0.
Step 1c: Choose Who's Enrolled
Meal allowance is paid only to enrolled staff; there is no automatic role/department/location targeting. Click Manage staff at the top of the Meal Allowance page.
The Meal allowance staff page lists every active employee across the group with a simple on/off switch, and a summary line ("N of M staff get meal allowance"). Search by name or nickname and filter by company; the Meal allowance policy link takes you back.
- Switch on to enrol someone. They receive their company's policy (or the group default).
- Switch off to stop their meal allowance.
- Amount box: for an enrolled person, type a custom daily amount to override the policy for that one employee. Leave it showing the policy amount (the greyed-out placeholder) to use the default. Clear it to remove the override.
- No-roster days: switch on to pay meal allowance on days this person clocks in without a scheduled shift (for office or unrostered staff). Such days must still meet the policy’s minimum duration.
A policy must exist (a group default or that company's override) before you can enrol someone; the page tells you if none does.
This is the only "who gets it" control. To run "everyone in these companies gets it," enrol them all; to run "only these few people," enrol just those.
Step 2: Automatic Payroll Calculation
When a payroll run is created or recalculated, the engine does this for every enrolled employee in the run:
- Resolve the employee's effective policy (employee override, then company override, then group default).
- Look at every clocked-in shift in the pay period.
- For each shift inside the policy's hours window, pay the policy amount less any attendance deduction.
- Roll the result into the employee's Gross Pay, SSO contribution base, and Tax base.
No manual math is required. Employees who aren't enrolled, or who have no qualifying shifts, get no meal allowance for that period.
Step 3: Review and Override Per Employee
On the Meal Allowance page, pick the month and open the company's sheet-tab. Each row is one employee in that company's payroll run for the month:
| Column | Meaning |
|---|---|
| Engine ฿ | What the engine calculated from shifts and clock-ins |
| Paying ฿ | What the employee will actually be paid (after any override) |
| Status | engine (paying what was calculated) or overridden |
| Reason | Why an override was applied |
The header shows the totals Engine computed and Paying, plus how many people have no allowance. Rows where the engine paid nothing are shown in amber as no allowance, so you can decide whether that is right.
The same lines can also be reviewed from a payroll run: the Meal allowance button in the run header opens the Manual Meal Allowance page for that run, with Engine and Paid columns and an Override badge on changed lines. On a finalized run it shows "This run is finalized. Meal-allowance lines are frozen."
Overriding an Amount
On the company sheet, click Override on the row. The dialog asks for the Amount (฿ for the month) and a Reason (shown on the audit trail), which is required. Click Save (recalculates the payslip). Reset on an overridden row goes back to the engine value.
On the per-run Manual Meal Allowance page the same thing is done with Edit: set Paid amount (THB) and a Reason for override. Leaving the reason blank there clears the override and the next recalculation uses the engine value again.
The override survives every future recalculation. The engine keeps refreshing its own calculation in the background (the Engine ฿ column always reflects the current calculated value), but it never overwrites the paid amount once you've set a reason.
Adding a Manual Line
For cases the engine missed (e.g., an enrolled employee with no shift records, a special one-off payout), click Add on an amber no-allowance row of the company sheet and enter an amount and reason. On the per-run page, Add allowance opens a dialog with a Rule picker (the company's effective policy is pre-selected), Paid amount (THB) and Reason.
Removing a Line
On the per-run page, open the line with Edit and click Remove line.
This is a soft delete: the paid amount is set to 0 and "Deleted by admin" is recorded as the reason. The line stays in the history for audit purposes.
What HR Should Know
Permissions
| Action | Admin | Supervisor | Employee |
|---|---|---|---|
| View the policy and amounts | ✓ | - | - |
| Edit the policy / enrolment | ✓ | - | - |
| Override per-employee lines | ✓ | - | - |
| Publish payroll | ✓ | - | - |
The Meal Allowance page (like Pay items and Incentives) appears in the sidebar for group admins only.
Mid-Period Changes
Applicable configuration changes automatically queue the current open DRAFT/REVIEW cycle. Historical finalized payroll is unchanged.
Finalized runs are frozen and will not reflect changes; if a finalized run needs adjustment, make it in a subsequent run.
Sick Days, Leave, and Absences
Attendance-based meal allowance is tied to actual clock-ins. If an enrolled employee was sick or on leave for a shift, they get no allowance for that shift, even if it was scheduled. No clock-in = no allowance. A day of full-day leave pays nothing even if clock records exist for it.
A day of half-day leave pays half the daily amount when the employee works the other half of the rostered shift and clocks both in and out. Lateness and early clock-out count only against the half they work: the shift is split at its midpoint, rounded to the nearest half hour, the same split the leave uses, so the half on leave is never treated as late or early. A shift recorded as only the hours being worked is not split again. A missing clock-out or no clock-in still pays nothing for that day. The policy's minimum hours still apply to the hours worked that day. Half-day leave counts as half a day in the day count, for example Meal Allowance (20.5 days).
SSO and Tax Treatment
Meal allowance is treated as part of gross income and is included in:
- The SSO contribution base (subject to the standard 5% rate and ceiling)
- The PND1 withholding tax calculation
The engine handles both correctly. You do not need to add anything manually.
Audit Trail
The engine value (Engine ฿) is never lost. Every line keeps both what the engine calculated and what was actually paid, so you can always reconcile "what the system thinks" vs "what we paid" for any historical run.
Common Questions
Can one company pay a different amount from the rest of the group? Yes. Add a company override for that company; everyone else keeps using the group default.
Can one person get a different amount? Yes. On the Manage staff page, type a custom amount in that employee's box. Their attendance rules still come from the company/group policy; only the amount changes.
Does everyone get meal allowance automatically? No. Only enrolled staff do. Set the policy first, then enrol the specific people on the Staff page.
What if an employee works a partial shift just over the threshold? The threshold is checked against the actual clocked-in hours, not the scheduled duration. An employee who clocks in for 6 hours and 2 minutes qualifies for a 6-hour minimum.
Can I see what was paid vs what the engine calculated for a previous payroll run? Yes, even after finalization. Pick that month on the Meal Allowance page and open the company sheet, or open the finalized run and click Meal allowance; both columns are preserved.
Why is meal allowance TH-only? The SSO and PND1 handling is specific to Thai payroll. The feature is gated to Thailand companies for now.
Pay Items
Every earning and deduction on top of salary, set up once for the whole group. Where to create one, lock one, and see who gets what each month.
Travel Allowance
Pay staff, such as technicians, a rate per kilometre on approved travel. Set the rate, enrol who is paid, record their km, approve, and payroll adds a Travel Allowance line.