Hopshift
Payroll

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 actual shifts, 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; payouts are calculated per enrolled employee per shift.


How It Works at a Glance

StageWhoWhere
Set the policyHR AdminGroup page: Meal Allowance
Choose who's enrolledHR AdminMeal Allowance → Manage staff
Automatic calculationEngineEvery payroll recalculation
Review and overrideHR AdminPayroll run: Meal allowance tab
Audit trailPermanentEngine value vs paid value visible per line

Step 1: Set the Policy

Navigate to Meal Allowance in the group-level sidebar. The page has two parts: the group default and company overrides.

The cascade (group → company → employee)

An enrolled employee's amount and attendance rules are resolved in this order, nearest wins:

  1. Employee override — a custom amount set for one person on the Staff page (amount only).
  2. Company override — a policy that replaces the group default for one company.
  3. 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:

FieldDescription
NameInternal label (e.g., "Standard meal allowance")
Amount per day (THB)What to pay per qualifying shift
Min / Max hoursThe shift-duration window that qualifies (leave Max blank for no upper limit)
TaxableWhether the amount counts toward PND1 income (on by default)
Effective fromOptional 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 deductionsSee 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):

SettingEffect
Lateness deductionHow 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-outWhen 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-outWhen on, an employee who clocked in but forgot to clock out gets no allowance for that day.
No allowance on a no-showWhen on, a scheduled shift with no clock-in pays nothing (it would anyway if Min hours > 0).

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 Staff page lists every active employee across the group with a simple on/off switch. Search by name or nickname and filter by company.

  • 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.

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:

  1. Resolve the employee's effective policy (employee override → company override → group default).
  2. Look at every clocked-in shift in the pay period.
  3. For each shift inside the policy's hours window, pay the policy amount less any attendance deduction.
  4. 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

Open any payroll run in DRAFT status. Click the Meal allowance button in the header to open the per-line review page.

For each employee you'll see the meal-allowance line the engine emitted. Each line displays:

ColumnMeaning
Engine ฿What the engine calculated based on shifts
Paid ฿What the employee will actually be paid (after any override)
ReasonWhy an override was applied (only visible on overridden lines)

If the engine value and paid value differ, an Engine / Paid diff badge is shown.

Overriding an Amount

Click Edit on the line. Set the new paid amount and a short reason ("Employee was traveling," "Approved bonus," etc.). Save.

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 allowance at the top of the employee's section. The company's effective policy is pre-selected; set an amount and a reason.

Removing a Line

Click Delete on the 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

ActionAdminSupervisorEmployee
View the policy and amounts
Edit the policy / enrolment
Override per-employee lines
Finalize payroll

Mid-Period Changes

If you edit the policy or change who's enrolled mid-period, the next payroll recalculation picks up the change for any DRAFT runs. 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

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.

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. Open the finalized run and view the Meal allowance tab; 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.

On this page