A single platform replacing five HR tools.
A growing UK fashion retail client was running their workforce on a stack of spreadsheets, a leave-tracking SaaS that nobody used, a separate timesheet tool, paper expense forms, and a clipboard at the front door for sign-in. I designed and shipped a custom internal platform that consolidated all of it into one place — with AI-powered receipt scanning, real-time data, automated email workflows, and a kiosk mode that runs on a tablet by the door.
Problem
When the client first reached out, the symptom they described was simple: payroll was painful. Every month somebody on the management team would spend two days reconciling four different sources of truth — an attendance spreadsheet, a leave-tracking SaaS, scanned expense receipts in a shared inbox, and a paper sign-in book. Errors were normal. Disputes were normal. The team had absorbed the pain.
Once we dug in, the real problem was bigger than payroll. Nobody could answer basic questions without a half-hour scavenger hunt. Who is in today? How many days off has Priya got left? What did we actually spend on team lunches this quarter? Did Marcus log his hours for last Tuesday? The data existed somewhere — it was just scattered, stale, and untrustworthy.
Off-the-shelf HR tools had been tried and rejected. Some were too expensive per-seat for a fashion retail team that turns over seasonally. Others assumed a corporate office structure that did not match how a retail floor and a buying team actually work. The client did not want to bend their workflow to fit a tool — they wanted a tool that fit their workflow.
- →Five different systems, none of them talking to each other
- →Manual receipt entry from photographed paper slips, weekly
- →No real-time visibility into who was on shift or off
- →Expense approvals happening over WhatsApp, with no audit trail
- →A kiosk sign-in book that the team kept forgetting to update
Payroll was the symptom. The disease was that the truth about our team lived in five different places, and none of them agreed.
Approach
I scoped the engagement as a single platform with five clearly bounded modules: attendance, leave, expenses, timesheets, and a kiosk sign-in. Each module had to stand on its own — usable from day one — but share a single database, a single auth system, and a single design language. No micro-services, no dashboards-of-dashboards. One Next.js app, one Supabase project, one Vercel deployment.
The architectural decision that shaped everything else was choosing Supabase over a hand-rolled Postgres + auth + storage stack. Row-level security gave me a clean way to enforce role boundaries (staff, manager, director, admin) directly in the database, which meant the API layer could stay thin. Realtime subscriptions gave the kiosk and the manager dashboard live data for free.
The receipt-scanning piece was the only place I introduced any AI complexity. The client wanted a flow where staff could photograph a receipt on their phone, get the merchant, date, and total auto-extracted, and submit it for approval — all in under thirty seconds. I picked Claude Sonnet for the OCR + extraction step because of its accuracy on messy real-world receipts and its low hallucination rate on numeric fields.
- →Single Next.js 16 app, App Router, server components by default
- →Supabase for Postgres, auth, storage, and realtime — one provider, fewer moving parts
- →Row-level security policies as the primary authorisation layer
- →Claude Sonnet via the Anthropic SDK for receipt OCR + structured extraction
- →Resend for transactional email, Vercel cron for scheduled jobs (overdue alerts, monthly summaries)
- →Tailwind + shadcn/ui for a consistent, accessible UI without bikeshedding
Solution
The platform shipped as a single web app with role-aware navigation. Staff see their own attendance, leave balance, payslips, and expenses. Managers see their direct reports. Directors see the company. The kiosk mode runs on a wall-mounted tablet near the entrance, in a dedicated browser session, with a simplified PIN-based sign-in flow.
The expense module is the part the team uses most enthusiastically. A staff member taps the FAB on their phone, snaps a receipt, and within two seconds the merchant name, date, total, currency, and a guess at the category are populated. They confirm or edit, hit submit, and the manager gets an email — with the receipt image inline and an approve/reject link that opens the platform with a single tap.
Attendance and timesheets share a backend but expose two different UIs. Attendance is for the retail floor — clock in, clock out, lunch, done. Timesheets are for buyers and back-office staff who track hours against projects. Both feed the same payroll export. At month end, the admin clicks one button, the system reconciles attendance, leave, and approved expenses, and produces a CSV that drops straight into their accountant’s pipeline.
There is also a quietly powerful analytics layer. Recharts dashboards visualise expense spend by category, staff utilisation, leave patterns, and sign-in punctuality. The directors get a weekly digest email — generated by a Vercel cron job — summarising any anomalies, like a sudden spike in expense claims or a department with three people off on the same day next week.
- →Five integrated modules: attendance, leave, expenses, timesheets, kiosk
- →AI receipt OCR with sub-2-second extraction, 95%+ field accuracy on a 200-receipt sample
- →Role-based access for staff, managers, directors, and admins, enforced at the DB layer
- →Tablet kiosk with PIN sign-in, working offline-tolerantly via service worker caching
- →Automated email workflows: approval requests, weekly digests, overdue reminders
- →One-click monthly payroll export, reconciled across all modules
The first month after launch, payroll took ninety minutes instead of two days. The second month, the manager who used to do it asked if she could go back to merchandising.
What actually changed.
Live in production for over a year. Used every day across multiple sites. Replaced five tools with one, paid for itself in saved admin time inside three months.
The platform replaced four paid SaaS subscriptions outright. The total annual licence cost saved roughly covered the build inside the first year, before counting the time the management team got back. The client’s finance director described it, in the politest possible terms, as the first piece of software he had bought that did exactly what he asked for.
On the staff side, the adoption story was unusual: people actually used it. The kiosk became the default way the floor team signed in within the first week, because it was faster than the paper book. The expense flow had near-100% adoption inside a fortnight because the alternative — typing receipt details into a spreadsheet — was just worse. Adoption was never enforced; it was earned by being the path of least resistance.
The platform has continued to evolve since launch. We have shipped a payslip module, an asset register, and a simple internal directory, all on the same foundations. Each new module took days, not weeks, because the auth, design system, and database conventions were already set.
Tools, picked deliberately.
What I would tell someone building this from scratch.
One database beats five integrations.
Every cross-module feature — payroll export, weekly digest, overdue alerts — was trivial because every module wrote into the same Postgres. The biggest leverage you get on internal platforms is structural: stop integrating, start consolidating.
Row-level security is the cheat code.
Pushing authorisation into the database meant the API layer was almost trivial. New modules inherited the security model for free. If I had hand-rolled access control in route handlers, every new feature would have been a bug-magnet.
AI should disappear into the workflow.
Nobody on the floor knows or cares that Claude reads their receipts. They snap a photo, the form fills in. That is the whole point. When AI is visible, it is in the way.
Adoption is a UX problem, not a training problem.
No formal training was delivered. The platform replaced the old tools because it was faster, not because anyone was forced to switch. If you have to teach people to use your software, your software is too hard.
Build for the boring path.
The unsexy modules — attendance, payroll export — are the ones the client uses every day. The fancy AI bit is the demo. Get the boring path airtight first; the rest is icing.
Need something like this built?
I take one client at a time. If your problem is real and your timeline is honest, let’s talk.
Go deeper.
The engineering record
Architecture, RLS policy design, the OCR pipeline, kiosk PWA design, and the consolidated payroll export.
Inside the platform
Data flow from receipt photo to approved expense, each module on its own, and the cron-driven digests explained.