EmpRoster

Description

EmpRoster is a self-hosted WordPress plugin for managing staff schedules. Everything is stored in your own database — no external APIs, no SaaS dependencies, no per-seat pricing.

Core features:

  • Visual weekly and monthly roster views
  • Shift creation with direct assignment or open-slot mode
  • Clock in / clock out attendance with break tracking
  • Leave requests with manager approval workflow
  • Weekly availability management per employee
  • Shift swap requests between employees
  • Payroll calculations with optional tax
  • Daily labour budget tracking
  • Email notifications for key events
  • Frontend employee portal via shortcodes
  • Profile Mode to restrict employee WordPress logins

Screenshots

Installation

  1. Upload the plugin folder to /wp-content/plugins/
  2. Activate via Plugins > Installed Plugins
  3. Navigate to EmpRoster > Settings to configure
  4. Assign the Roster Manager role to your scheduling staff

FAQ

Do I need to pay monthly?

No. EmpRoster uses annual licences, not subscriptions. One payment per year.

Is my data stored on your servers?

No. All data stays on your WordPress server. The plugin has no SaaS dependency.

Can employees access without logging into WordPress admin?

Yes. Five frontend shortcode pages let employees view shifts, clock in/out, submit leave, and set availability without accessing WP Admin. Profile Mode can block employee logins entirely.

Reviews

27 Julai 2026
I have tried quite a few rostering apps for my small team, but I always felt they were either too complicated or did not fit our needs and budget. Since we already use WordPress for our website, finding this plugin was a great match for us. To be honest, I never thought a full rostering system could be integrated so nicely into WordPress. The interface is clean and pretty easy to use which is great. Really impressed with this plugin. Recommended 👍
Read all 2 reviews

Contributors & Developers

“EmpRoster” adalah perisian sumber terbuka. Orang-orang berikut telah menyumbang kepada pemalam ini.

Penyumbang

Translate “EmpRoster” into your language.

Berminat dalam pembangunan?

Layari kod, periksa repositori SVN, atau langgani log pembangunan dengan RSS.

Changelog

2.8.35

  • Fixed: overnight shifts (for example 10 PM to 6 AM) were missing from the roster and calendar when they ran past the end of the day, week or month on screen, and never appeared in Day view. Rostering the employee for an overlapping time was correctly refused, but the clashing shift could not be found. Every shift now shows under the day it starts.
  • Fixed: clocking in for an overnight shift that starts today said no shift was scheduled for today. Dashboard counts of today’s and upcoming shifts now include overnight shifts too.
  • Open shifts that start in the selected period but finish after it now appear in the list of shifts available to join.
  • Cancelled shifts no longer count as a clash when rostering. Real overlaps are still blocked, including overnight shifts, and a shift that starts exactly when another ends is still allowed.

2.8.32

  • Fixed: an employee could be refused for a shift with an “already assigned” error even though nothing showed on their roster. A request left behind on an “Open with Approval” shift that was later changed to Direct or Open no longer blocks rostering.
  • Fixed: shift and leave clash messages showed the clashing shift at the wrong time, often on the wrong day, out by the site’s time zone offset. They now show the real time, and the end day for overnight shifts.
  • A clash with a pending open shift request now says so and points to the Requests page, instead of reading like an existing assignment.
  • Fixed: Copy Roster saved copied shifts at the wrong time (10 to 11 hours late on an Australian site, for example). If you copied shifts with an earlier version, check their times.
  • Copy Roster now applies the same clash and approved leave checks as rostering by hand. Staff who would be double-booked or are on leave are left off the copy and listed in the result, and running the same copy twice no longer duplicates shifts.
  • Approving an open shift request, or adding someone to a shift they had requested, now checks they are not already rostered at that time.
  • Fixed: the clock-in limit of three clock-in/out cycles in 30 minutes never took effect.
  • Fixed: the “clocking in early” and “clocking in late” messages showed the wrong shift start time.
  • Fixed: on sites behind UTC, an annual leave request starting on 1 January was checked against the previous year’s balance.
  • Security: pop-up notices now always show their message as plain text, so a name or shift title containing HTML can no longer run code in the browser.
  • Clash warnings when creating or editing a shift now show in amber, like other scheduling conflicts, instead of as red errors.

2.8.28

  • The EmpRoster entry on the Plugins page now shows “View details” and “Changelog” links. Changelog opens the plugin details window straight on the changelog tab, so you can see what changed without leaving your site.
  • The plugin author is now listed as aliflab, linking to https://aliflab.github.io.
  • Filtering shifts, timesheets, attendance, leave, swap requests, open shifts and login logs is stricter about what it accepts. A malformed date or an unknown status is now rejected with a clear error instead of silently returning an empty list, so a bad filter can no longer look like a period with no hours or no requests. The screens in the plugin always send valid values, so nothing changes in normal use.
  • Hardened how the plugin reads values from page addresses and the settings form, following WordPress coding standards.

2.8.25

  • Fixed the approved-leave check refusing the wrong shifts on sites whose timezone is ahead of UTC, such as Australia. A shift on the day before someone’s leave was refused whenever it ended in the afternoon (from 2:00 PM on a Sydney site in winter), even though it did not touch the leave, while a shift starting that late on the last day of the leave was let through.
  • Sites behind UTC, such as the Americas, had the reverse problem: very early shifts on the first day of leave could be saved, and early-morning shifts on the day after the leave were refused.
  • The check now compares the calendar dates exactly as they were entered, so the result no longer depends on the site’s timezone. The fix applies everywhere leave is checked: creating and editing shifts, assigning staff, and approving shift swaps and open-shift requests. Sites set to UTC see no change.

2.8.24

  • Staff members can now be given their own tax rate instead of everyone sharing the one site-wide percentage. Turn on “Allow a per-employee tax rate” under EmpRoster > Settings > Payroll > Taxation, then tick “Use an individual tax rate” on a staff member and enter their percentage. Anyone you do not set a rate for keeps using the flat rate, so existing sites carry on exactly as before.
  • The individual rate is used everywhere earnings are worked out: the timesheet list, an employee’s own timesheet, the per-employee detail view, and all three CSV exports. Where rates can differ between people the timesheet column heading drops its fixed percentage and each row shows the rate it used beside the amount, and the earnings export gains a Tax Rate (%) column so the figures can be checked.
  • Setting someone to 0% is treated as a deliberate tax-exempt rate rather than as “no rate set”, so they are not quietly moved back onto the site-wide percentage.
  • The whole feature is hidden unless you switch it on. With the policy off, no extra fields appear when adding or editing staff, and switching income tax off still removes every tax column as it always did.

2.8.22

  • Casual staff can no longer request annual or sick leave. Casuals do not accrue paid leave, so those two types are now hidden from the leave request form and rejected if submitted, leaving Personal, Unpaid and Other available. This applies on both the admin screens and the front-end leave page, and a manager cannot switch a casual employee’s existing request over to annual or sick either.
  • Full-time and part-time staff are unaffected and can still request every leave type as before. Supervisors with no employment type set on their record are treated as full-time rather than casual, so their leave requests keep working.
  • Removed the “Made with ☕ by thealiflab” credit from the plugin’s admin footer. The Support, Docs and Free Plugin links are unchanged.

2.8.20

  • The Upgrade page now opens with a straightforward “Choose a Plan” action, and the note beneath it explains that you can upgrade or change plans at any time.
  • Plan-status messages no longer quote a fixed promotional period, so they stay accurate as pricing changes.

2.8.19

  • Fixed staff on approved leave disappearing from the Week and Day views of the shift calendar. Anyone on leave was only shown if they also had a shift rostered that week, so leave showed up correctly in the current week but vanished as soon as you navigated to a future week where nothing had been rostered yet — even though the same leave was visible the whole time in Month view. Week and Day view now list everyone who has either a shift or approved leave in the period, matching Month view.

2.8.18

  • The shift calendar now fits the screen you are actually using. Week view previously needed about 1156 pixels for the staff column plus seven days, which is wider than the working area of a 13″ or 14″ laptop once the WordPress menu is open — so the roster scrolled sideways and the last day or two of the week sat off screen. The columns now size themselves to the space available.
  • Day view no longer stretches each shift across the full width of the screen. Shifts are laid out as cards that sit side by side where there is room and stack where there is not, so they stay a readable width on any monitor.
  • Month view fits a portrait tablet without scrolling sideways, and on a shorter laptop screen the day cells are a little more compact so the whole month is visible at once instead of needing to scroll.
  • On smaller screens the shift blocks tighten up rather than truncate: shift titles wrap to a second line instead of being cut off mid-word, and the location line is dropped from the week view where the columns are narrowest.
  • The hourly pay rate in the staff column now sits on its own line under the role, reading “Employee · Full-time” then “$25.00/hr” beneath it. It is easier to scan and it narrows the staff column, which is the change that buys the most room back on a small laptop.

2.8.16

  • Your Brand Colour setting now applies across the whole plugin instead of just the main buttons and links. Set it once under EmpRoster > Settings and it flows through every screen.
  • The “today” highlight in the shift calendar, the weekly roster and the daily budget row now use your brand colour — the day cell, its top accent bar, the highlighted date circle and the TODAY label.
  • Button hover glows, input focus rings and toggle focus outlines now tint to your brand colour rather than staying blue.
  • Soft blue panel borders, the availability panel and the setup wizard rows now follow your brand colour.
  • The printed roster PDF and the public roster shortcode now match your brand colour too. Both render outside the main app, so they previously stayed blue no matter what you set.
  • Shifts and locations you have not given a colour to now fall back to your brand colour instead of the default blue. Colours you picked yourself are unchanged.

2.8.12

  • Any pay rates you already entered stay stored against each staff record, untouched. Nothing is erased, reset, or zeroed, and the figures reappear exactly as they were if the site later moves to a product that includes payroll.
  • Fixed: A staff record could still accept a pay-rate value sent directly to the server even though no screen offered the field. That write is no longer performed here.