DutyPay
Track shifts. Project pay.
Free · Designed for iPad
Traded half a shift? Log just the hours you covered, from 7 AM to 7 PM or 2 AM to 6 AM, and DutyPay keeps count of what's owed.
DutyPay is the shift calendar and paycheck projection tool built for public safety workers — firefighters, EMS, police, and corrections officers — by firefighters.
Track your rotation. Pick up extra shifts and trade with coworkers. See how every shift, trade, and overtime hour affects your paycheck before it lands. DutyPay shows you exactly what your next check will be, what you've earned year-to-date, and what your year-end income is on pace to be.
Built for the schedules that don't fit into normal apps:
• 24/48, 48/96, Pitman, 4/10, and other public safety rotations
• Kelly days, work period overtime (FLSA §7(k)), holiday pay, and shift differentials
• Time trades with coworkers, with both legs tracked end to end
• Picked-up shifts, PTO, sick time, and other deviations from your normal schedule
What DutyPay does that a regular calendar can't:
• Projects your paycheck before it arrives, using your real rate and overtime rules
• Flags when an extra shift will tip you into overtime
• Shows your effective hourly rate after OT and differentials
• Year-end income projection with federal tax bracket awareness
• Notifications the day before any shift outside your normal rotation
Free, forever. No ads. No upsell. No selling your data.
Built by Florida firefighters on the principle that the people who keep cities safe deserve tools that actually understand their work.
From the team behind PensionForge, the FRS retirement planning tool.
more Crazy convenient for tracking pay and shifts. Good for those of us with kids in the service too.
Crazy convenient for tracking pay and shifts. Good for those of us with kids in the service too.
Trade part of a shift
A user wrote in: "I can't enter a partial trade, it seems to be all or nothing." They were right: a trade always meant a whole shift. Now it doesn't have to.
When you add a trade, choose "Part of it" and enter when the cover started and ended. DutyPay works out the hours, including covers that run past midnight, and keeps them with the trade: your ledger reads "Smith owes me 12h" instead of "a shift", and the trade's details show the exact window. The payback can be partial too, and it starts from the same hours as the original, since that's usually what gets paid back. Change them if it isn't.
Partial trades show up everywhere a trade does:
- On the calendar, a day where someone covers part of your shift still reads as a work day, split between the hours you work and the hours they cover. Hours you pick up for someone on one of your own work days sit alongside your shift instead of replacing it.
- Reminders arrive for the hours you're covering, and a partial cover says "Partly off tomorrow" rather than "Off tomorrow".
- Share a partial trade and the link carries the hours, so your coworker's copy matches yours.
- Your shared calendar shows a partial cover as a work day, so family planning around your schedule sees the hours you're actually on.
Whole-shift trades work exactly as before.
1.4.1 7h ago
See the pay periods ahead
A user wrote in: "I have a financial goal every pay period, and since I basically choose my schedule, it would be nice to see how much I'm expected to make several pay periods ahead." The strip under the calendar only ever showed the period you were in. Now you can decide which pay period to view.
Tap › and the strip moves to the next pay period: its dates, the gross it's projected to pay, the hours, the overtime. The figure comes from the shifts on your rotation plus anything you've added or taken off, so a pickup you log for three weeks out shows up in that period's number right away. Keep tapping, up to a year out. The strip says how far ahead you are ("2 periods ahead"), the calendar dims every day outside that period so you can see exactly which shifts the number covers, and when a period starts in a month you aren't looking at, the calendar turns the page for you. ‹ goes back the same way. Today puts everything back where it was.
The number is the same one Earnings would show for that period, worked out the same way, so what you plan against on the calendar is what you'll see when the period arrives.
A strip that explains its number
The strip is redrawn around one figure: the period's gross, large, on the right. Tap it and the strip opens into the breakdown behind it: regular hours, overtime, your effective hourly rate, any incentives, and, for the period you're in, what you've earned so far. On the current period or any past one, "Full breakdown on Earnings" opens Earnings on that same period. A thin bar along the strip's bottom edge shows how far through the current period you are.
Also in this release
- On iPhone, the strip could slip partly behind the tab bar and hide its figures. It now stays fully above it.
- The ⋯ button in the corner is quieter, and it rises out of the way instead of sitting on top of the strip's figure.
- Earnings shows hours exactly: 8.25 hours no longer reads as 8.3, and a period with no hours shows a dash for its rate instead of $0.00/hr.
- Updated for iOS 27.
1.4.0 Oct 14
Rotating day and night shifts
A user wrote in: "I flip flop my schedule. I work one week days and the following week nights." There was only ever room for one start time. Now there's room for the flip.
In setup, and in Settings > Work > Schedule, there's a new question under your start time: Do you flip between days and nights?
- Yes, every other rotation. A week of days, then a week of nights.
- Yes, within the rotation. Two days, then two nights. Tap which days of your cycle are the nights.
Set the night window once and DutyPay stores the real clock times for every day of your cycle. That's worth more than a tidy calendar: night differentials are worked out from a shift's actual hours, so if your nights were being stored as a 07:00 start, you were quietly losing the premium on half of them. They're paid now.
The built-in EMS pattern labeled "2 days / 2 nights / 4 off" is fixed too. It was named right and stored one start time for all four on-days.
Every day says what kind of shift it is
On-shift days in the month grid now carry a mark: a sun for a day shift, a moon for a night, a sunset for an evening start, and a clock for a full 24 — a 24 covers days and nights both, so calling it a day shift would be a claim your schedule never made. Time off, trades, holidays and overtime pickups each get their own glyph.
On a phone this fixes something older than the rotation work. The small dots under each date could only be told apart by color, which meant checking the legend at the top of the page to read your own month. Now the shape carries the meaning and the color just backs it up. Shared calendar links follow the same rule, so a link you send can't disagree with what you see in the app.
Landing your rotation on the right day
Setup used to ask "are you on or off today?" and take today as the first day of your stretch. For a 24/48 that's exact. For a Pitman, or 5-on/2-off, or anything with a multi-day stretch, it could put your whole schedule days out of step — and nothing in the app could correct it.
Now the question comes with the actual dates it produces, laid out underneath. Tap any day we got wrong and the whole schedule moves to match. Keep tapping; every correction sticks, and the schedule settles on the answer that changes the fewest of your days.
If you set your schedule up before this existed, and its shape is one where the old question could have missed, you'll see a one-time "Check your days" note on your calendar. Most people it asks are already correct — tap Looks right and it won't ask again, or Fix it to go set it straight.
Also in this release
- The utility button gets out of the way when you scroll down a long page and comes back when you scroll up.
- The + Add menu now unfurls in line with the button it belongs to.
- The overtime figure on Earnings keeps its label on one line.
1.3.0 Sep 1
A new look, and a lot less tapping to log a shift.
A REFRESHED DESIGN
DutyPay has been redrawn from the ground up to match PensionForge, its sister app: raised cards with softer corners, a consistent set of buttons and fields on every screen, and a calmer header. Same app, same data — just easier to read on a long shift.
BUILT FOR IPAD AND DESKTOP
DutyPay used to hand every screen wider than a phone the same stripped-down layout. Now it adapts properly:
• In landscape on iPad and on the web, a sidebar replaces the bottom bar and gives the calendar the full height of the screen.
• Tap a day on a wide screen and its details open in a panel beside the month instead of covering it — you can page through the month and keep reading.
• Portrait on any size keeps the thumb-friendly bottom tab bar and the + button where it has always been.
• On a keyboard: ← and → step through months, T jumps back to today.
QUICK-FILL SHIFT PRESETS
Save the shifts you actually work — "Day 0700–1900", "Night 1900–0700", "24 on" — under Settings › Work › Shift entry. Then a single tap fills clock in, clock out, and break when you log a worked shift or add an extra one. Overnight and 24-hour windows are handled correctly.
A DEFAULT BREAK YOU CONTROL
Break minutes no longer default to a hard-coded 30. Set your own default once in Settings, and every new shift starts there. If your crew has no unpaid lunch, set it to 0 and stop clearing that field on every entry.
SETTINGS THAT MAKE SENSE
Settings is now grouped as Work, Account, and App, and the things people were hunting for have been pulled into the open:
• Pay period — its type, §7(k) length, and anchor date — is now its own card on Work, instead of being buried inside the Overtime sheet.
• Time off & trades moved to Work, alongside the rest of your pay setup, and now includes "Do trades affect my pay?"
• App keeps just the preferences: week start and theme.
• On a tablet or desktop, the sections sit in a list beside the panel instead of as tabs above it.
CALENDAR AND EARNINGS HEADERS
The month and the pay-period range now share one control: a stepper with the label centered between fixed arrows. Long month names no longer clip, the arrows stop shifting as you page, and Earnings gained a "Current" button to match the calendar's "Today."
FIXES
• Restored mobile shift detail pop-up on iPhones while preserving "always visible" version on iPads.
• The theme picker no longer gets clipped by the Feedback button when opened from the floating action button.
As always: DutyPay does the FLSA math for you — 7(k) work periods, overtime, differentials, and leave — so you can check your paycheck before it lands. Questions or a bug to report? Tap Feedback anywhere in the app.
1.2.1 Aug 30
A new look, and a lot less tapping to log a shift.
A REFRESHED DESIGN
DutyPay has been redrawn from the ground up to match PensionForge, its sister app: raised cards with softer corners, a consistent set of buttons and fields on every screen, and a calmer header. Same app, same data — just easier to read on a long shift.
BUILT FOR IPAD AND DESKTOP
DutyPay used to hand every screen wider than a phone the same stripped-down layout. Now it adapts properly:
• In landscape on iPad and on the web, a sidebar replaces the bottom bar and gives the calendar the full height of the screen.
• Tap a day on a wide screen and its details open in a panel beside the month instead of covering it — you can page through the month and keep reading.
• Portrait on any size keeps the thumb-friendly bottom tab bar and the + button where it has always been.
• On a keyboard: ← and → step through months, T jumps back to today.
QUICK-FILL SHIFT PRESETS
Save the shifts you actually work — "Day 0700–1900", "Night 1900–0700", "24 on" — under Settings › Work › Shift entry. Then a single tap fills clock in, clock out, and break when you log a worked shift or add an extra one. Overnight and 24-hour windows are handled correctly.
A DEFAULT BREAK YOU CONTROL
Break minutes no longer default to a hard-coded 30. Set your own default once in Settings, and every new shift starts there. If your crew has no unpaid lunch, set it to 0 and stop clearing that field on every entry.
SETTINGS THAT MAKE SENSE
Settings is now grouped as Work, Account, and App, and the things people were hunting for have been pulled into the open:
• Pay period — its type, §7(k) length, and anchor date — is now its own card on Work, instead of being buried inside the Overtime sheet.
• Time off & trades moved to Work, alongside the rest of your pay setup, and now includes "Do trades affect my pay?"
• App keeps just the preferences: week start and theme.
• On a tablet or desktop, the sections sit in a list beside the panel instead of as tabs above it.
CALENDAR AND EARNINGS HEADERS
The month and the pay-period range now share one control: a stepper with the label centered between fixed arrows. Long month names no longer clip, the arrows stop shifting as you page, and Earnings gained a "Current" button to match the calendar's "Today."
FIXES
• The theme picker no longer gets clipped by the Feedback button when opened from the floating action button.
As always: DutyPay does the FLSA math for you — 7(k) work periods, overtime, differentials, and leave — so you can check your paycheck before it lands. Questions or a bug to report? Tap Feedback anywhere in the app.
1.2.0 Aug 29
What's New in 1.1.3
- Sign in from setup — Already have a DutyPay account? New phone, reinstall, whatever — you can now sign in straight from the first setup screen (or the Sign in link in the corner on any step) instead of walking through setup all over again.
- Smoother recovery after downtime — Fixed a rare hiccup where opening the app after it sat in the background a long while could show an error. The app now quietly retries and recovers on its own — and if something genuinely does go wrong, you'll get a plain-English message instead of technical gibberish.
1.1.3 Jul 21
Bug fix: Stuck loading screen
Fixed an issue where reopening DutyPay after it had been in the background for a while could leave your calendar and earnings stuck on a loading screen until you force-closed the app. The app now refreshes your session automatically when it returns to the foreground, and if loading ever does fail (for example, on a spotty connection), you'll see a Try Again option instead of an endless spinner.
1.1.2 Jul 19
Your overtime rate just got more accurate.
If you earn bonuses or incentives tied to your role — acting up, preceptor, FTO,
bilingual, longevity, court time — your overtime rate should reflect that extra
pay, not just your base hourly. DutyPay now folds those dollars into your
overtime calculation the same way your department's payroll does.
Each bonus and incentive has a new "Counts toward overtime" setting, on by
default. If you have a truly one-time discretionary gift or surprise bonus that
shouldn't affect your OT rate, turn it off for that item — your overtime stays
the same and the dollars still count in your gross.
No action needed. Your existing bonuses and incentives are already set correctly.
If something looks off, check the toggle in the bonus or incentive and adjust.
1.1.1 Jul 1
Overtime, your department's way.
DutyPay now asks how your department handles overtime the first time you log a
sick or vacation day. Some departments protect the overtime built into your
schedule when you take leave; others make you work it back at straight time.
Set it once — or change it anytime in Settings — and your pay projections stay
accurate.
Share your schedule with a scan.
Pull up a schedule share link and you'll now get a scannable code. Hand your
phone to a crewmate or drop the code in a group chat and they can open your
shared schedule instantly — no typing, no link to copy.
1.1.0 Jun 26
Trade part of a shift
A user wrote in: "I can't enter a partial trade, it seems to be all or nothing." They were right: a trade always meant a whole shift. Now it doesn't have to.
When you add a trade, choose "Part of it" and enter when the cover started and ended. DutyPay works out the hours, including covers that run past midnight, and keeps them with the trade: your ledger reads "Smith owes me 12h" instead of "a shift", and the trade's details show the exact window. The payback can be partial too, and it starts from the same hours as the original, since that's usually what gets paid back. Change them if it isn't.
Partial trades show up everywhere a trade does:
- On the calendar, a day where someone covers part of your shift still reads as a work day, split between the hours you work and the hours they cover. Hours you pick up for someone on one of your own work days sit alongside your shift instead of replacing it.
- Reminders arrive for the hours you're covering, and a partial cover says "Partly off tomorrow" rather than "Off tomorrow".
- Share a partial trade and the link carries the hours, so your coworker's copy matches yours.
- Your shared calendar shows a partial cover as a work day, so family planning around your schedule sees the hours you're actually on.
Whole-shift trades work exactly as before.
more Version 1.4.1 7h ago
Data Linked to You The following data may be collected and linked to your identity:
Financial Info Contact Info User Content Identifiers Data Not Linked to You The following data may be collected but it is not linked to your identity: