YipiiYipii Mobility Docs
Management

Pay Periods

Group approved timesheet entries into named date ranges, lock them for payroll, export a provider-ready CSV.

Pay Periods

A pay period is a named date range — a week, a fortnight, a month — that acts as a container for approved time entries. Locking a period freezes every approved entry inside it so the payroll export is reproducible and the entries can't be retroactively edited.

The page lives at Time & Payroll → Timesheets → Pay Periods. Admins and fleet managers only.

Lifecycle

Every period moves through three states:

StatusWhat it meansWho sets it
OpenJust created. No entries frozen yet. Editable by any admin.Default on creation
LockedEvery approved entry in the date range has been stamped with this period's id and flagged locked. Entries in the range can't be edited or deleted.Admin clicks Lock. Stamps locked_at / locked_by_id.
PaidFinal state. Payroll was run. Can't be reopened.Admin clicks Mark paid from a locked period. Stamps paid_at / paid_by_id.

Creating a period

Click New pay period in the header. The dialog asks for:

  • Name — any label, e.g. 2026-04 Bi-weekly 1. Shown in the list and in the payroll CSV.
  • Starts on / Ends on — inclusive date range. End-of-day on the ends_on date is used when sweeping entries in.
  • Notes — free text, never shown to employees.

The period starts in the Open state.

What locking does

When you click Lock:

  1. Every entry in the tenant where clock_in_at falls within [starts_on 00:00, ends_on 23:59] and approval_status = approved gets updated in a single transaction:
    • pay_period_id → this period's id
    • lockedtrue
  2. The period itself moves to Locked, locked_at = now(), locked_by_id = you.

Pending and Rejected entries in the range are not swept in. Approve them first if they belong in this run. You can reopen, then re-approve the stragglers, then lock again — see below.

Entries not approved by the time you lock are permanently excluded from that pay period's CSV unless you reopen. There's no grace flow.

Reopening

Reopen is available from a locked period (but not a paid one). Clicking it:

  1. Unsets pay_period_id and flips locked = false on every entry previously swept in.
  2. Flips the period back to Open, clears locked_at / locked_by_id.

Those entries are once again editable and can be re-approved or re-rejected. When you're satisfied, lock again.

Paid periods (status = paid) refuse to reopen. If you genuinely need to amend a paid run, contact support — it's intentionally a one-way door.

Summary preview

Click the period's name (or the Summary button) to open an inline dialog showing per-employee aggregates for this period:

ColumnMeaning
EmployeeDisplay name + employee code from pay profile
RegularHours up to the weekly overtime threshold
OvertimeHours between the OT and double-time thresholds, paid at OT multiplier
DoubleHours beyond the double-time threshold (blank column when DT isn't configured)
Total hrsRegular + Overtime + Double
GrossAmount paid, in the employee's pay-profile currency
EntriesCount of approved entries included

The summary is computed live against the locked entries, so the preview and the exported CSV always match.

Payroll CSV

The CSV button on a locked or paid period downloads a file named payroll-YYYY-MM-DD-YYYY-MM-DD.csv. It streams through the server; no intermediate file is written.

Column spec

CSV columnSource
Employeeusers.name of the entry owner
Employee Codeuser_pay_profiles.employee_code (optional)
Currencyuser_pay_profiles.currency, default EUR
Regular HoursSplitting by week, hours up to overtime_threshold_weekly
Overtime HoursHours between OT and DT thresholds
Double-time HoursHours past double_time_threshold_weekly (0.00 if DT not configured)
Break HoursSum of break_minutes / 60 across entries
Total HoursRegular + Overtime + Double
Regular PayRegular Hours × hourly_rate
Overtime PayOvertime Hours × hourly_rate × overtime_multiplier
Double-time PayDouble-time Hours × hourly_rate × double_time_multiplier
Gross PayRegular + Overtime + Double pay
EntriesCount of approved entries aggregated
PeriodThe period's name
Period Starts / Period EndsISO dates

Monetary columns are always plain decimals (800.00, not € 800.00) so they import cleanly into spreadsheets and payroll tools.

Worked example

Setup

  • Pay profile: hourly rate €15.00, OT threshold 40h/wk, OT multiplier 1.5, DT not configured.
  • Week 1 of a two-week period: the employee works 48h (across several approved entries).
  • Week 2: 36h.

What ends up in the CSV row

ColumnValueHow it was computed
Regular Hours76.00Week 1 capped at 40 + Week 2's 36
Overtime Hours8.00Week 1 above 40
Double-time Hours0.00DT threshold not set
Total Hours84.0076 + 8
Regular Pay1140.0076 × 15
Overtime Pay180.008 × 15 × 1.5
Gross Pay1320.001140 + 180

Overtime resets weekly. The service splits entries per ISO week (Monday – Sunday) before applying thresholds, so a period that straddles a week boundary is handled correctly.

Importing into a payroll tool

The column names map directly onto common payroll providers:

  • Gusto — use Regular Hours and Overtime Hours columns on their bulk import template.
  • ADP RUN — map Regular HoursREG, Overtime HoursOT, Double-time HoursOT2.
  • QuickBooks Payroll — import with column mapping; QB handles the arithmetic from hours, so you can ignore the *_Pay columns if you'd rather they re-derive.

For systems that want employee IDs, set Employee Code in each user's pay profile — it lands in the CSV as-is.

Permissions

  • Admin — every action (create, lock, reopen, mark paid, export).
  • Fleet manager — every action above.
  • Everyone else — no access.

On this page