Work Time HeroTime tracking for teams paid by the hour

Work Time Hero lets hourly staff clock in from a phone or a desktop, and gives their employer the team's live status, correction requests to decide and hours to mark as paid. We built its back end, develop the web application and run the platform in production.

The Work Time Hero employee dashboard with a live clock card on the Work code, the stamp codes and coworker status, beside a phone with coworker status and the hours worked, paid and unpaid
Client
Private client
Sector
Workforce management
Year
2024 to 2026
Platforms
Web app, Mobile web
Services
Web development

A time-tracking service for companies that pay staff by the hour. Employees clock in and out against stamp codes such as Work, Break, Sick or Vacation, and employers turn those records into approved, reconciled hours they can pay.

Built for

  • Employees, who clock in from whatever device is at hand.
  • Employers and managers, who need to know who is working and what to pay.
  • Platform administrators, who manage companies, plans, discount codes and translations.

The problem

Hourly pay depends on records made in a hurry. People forget to clock out, start on the wrong code or work past the end of a shift, and the mistake often surfaces only when someone checks a payslip.

The same hour can be worth different amounts. Weekend, holiday and overtime hours follow their own rules, and for a team spread across timezones each person's hours have to be split in their own local time.

Paying people is a step of its own. An employer needs to see how much of each person's month is already paid, pay the rest and hand an export to payroll, without recalculating anything by hand.

Goals

  1. 01Make clocking in and switching codes quick, with the current code always visible.
  2. 02Let employees fix their own mistakes through a request the employer approves or rejects.
  3. 03Split hours into regular, overtime, weekend and holiday time by each employer's own rules.
  4. 04Reconcile worked hours against paid hours every month, with an export for payroll.
  5. 05Run as a paid subscription service in eight languages.

Our role

We built the back end from its first commit, have developed the web application since 2025, and run the platform in production.

What we delivered

  • Express and Prisma back end on the Bun runtime, with PostgreSQL and Redis
  • React web application for employees, employers and administrators
  • Clocking, stamp codes, work types, holidays and time-keeping schemes
  • Correction requests, overtime confirmation and automatic clock-out
  • Paid-hours reconciliation with CSV export
  • Subscription plans, Stripe payments, discount codes and PDF invoices
  • Two-factor sign-in and scoped API tokens
  • Telavox telephony integration for live call status
  • Translation system for eight languages, managed from the admin area
  • Deployment pipeline, nightly backups and error monitoring

How we worked

  1. 01

    One module per part of the domain

    The back end is 24 feature modules: clocking, corrections, overtime, paid hours, subscriptions, translations, Telavox and the rest, each with its own routes and controller.

  2. 02

    Move the data layer to Prisma

    In March 2026 the queries moved from a hand-written connection pool to Prisma 7, with the schema split by module and migrations applied as a deploy step.

  3. 03

    Test on staging, then release

    Every change deploys to a staging environment where the client tests it before it reaches production.

  4. 04

    Release in a way that can be undone

    Each deploy is a new release directory. Migrations run, the health check is called up to five times, and a failed check rolls the server back to the previous release.

  5. 05

    Prove the backups

    All three databases are backed up every night, encrypted, to S3. Every Sunday a job restores the latest backup into a temporary database and checks it.

Screens and features

  • A clock that says what you are on

    The clock card shows the current stamp code, when it started and for how long. Tapping another code asks once to confirm, then switches.

  • Corrections as requests

    Employees propose new times for a record, and the employer approves or rejects each request with the original times beside it.

  • Time-keeping schemes

    Each employer sets regular hours or day-by-day hours, and switches on overtime, weekend and holiday rules with their own limits and rates.

  • Overtime needs a yes

    Fifteen minutes before a scheduled day ends, an overtime request is raised for confirmation, and a daily maximum caps what counts.

  • Automatic clock-out

    An hourly job clocks out anyone who has passed the hours their scheme allows, and files the time as regular, overtime, weekend or holiday.

  • Paid hours, reconciled

    For each person and month: hours worked, hours paid, hours to pay now and hours remaining. Mark people paid one at a time or all at once, then export to CSV.

  • Eight languages, edited without a release

    English, Danish, German, Faroese, French, Icelandic, Norwegian and Swedish. The wording is held in the database and managed from the admin area, with import and export.

Technical choices

What the product is built with, and why.

Prisma 7 on PostgreSQL
The schema is split into one file per module, and migrations run as a step of the deploy, so each release carries its own database changes.
Stored in UTC, calculated in local time
Every timestamp is stored in UTC, and hour calculations run in the employee's own timezone. An hour split at the server's midnight would be paid as the wrong kind of hour.
Deadlock retry with jitter
Only true deadlocks are retried, with a randomised backoff so two colliding writes do not collide again. Every other error surfaces, so real bugs are not hidden.
Redis for cache and locks
Dashboards and coworker lists are cached, and the clock event that changes them clears exactly those entries. Billing changes run under a Redis lock, so two server instances cannot apply the same change twice.
Socket.IO rooms per employer
Telavox call status is pushed live into a room for each employer, over sockets that authenticate with the same token as the API.
Shared query hooks in React
Requests from the web application go through one HTTP service and shared hooks over TanStack Query, so loading, errors and token refresh behave the same on every screen.

Tracking hours that turn into pay?

Time rules, corrections and payroll exports are detail we like getting right. Tell us how your team works.