Skip to content
CASE STUDY

Maintaining and extending a lone worker safety SaaS platform

A subscription safety platform for lone field workers needed continuous, always-on monitoring: check-ins, GPS, SOS alerts and automatic escalation across many client companies on shared infrastructure. We inherited the live production codebase and have maintained and extended it since, including finding and fixing a structural flaw in how tenant data was isolated.

CLIENT
A US lone worker safety SaaS platform
INDUSTRY
Workforce safety SaaS
ENGAGEMENT
SaaS platform maintenance and extension, ongoing, on an inherited live production codebase
STACK
ASP.NET Core (.NET 8), PostgreSQL, EF Core, Dapper, Vue 3, Quartz.NET, Chargify, SignalWire, Bandwidth, Firebase Cloud Messaging
THE PROBLEM

A safety-critical product already live on real customer data when we took it over.

  • Multiple tenant companies sharing one platform, where tenant data separation had to be verified and kept correct
  • Real-time monitoring of employee check-ins, GPS locations and SOS alerts had to keep running without interruption
  • Missed-checkout detection needed to run continuously, with no user action required to trigger it
  • Escalation had to reach the right person through more than one channel when something went wrong
  • Recurring subscription billing had to run correctly across every tenant company on the platform
WHAT WE BUILT

One system, built around how the work actually happens.

01Found and fixed a structural multi-tenant flaw
02Automated missed-checkout detection
03Added an automated phone check-out flow
04Subscription billing kept self-correcting
TENANT FIX

Found and fixed a structural multi-tenant flaw

Identified a structural issue in how the inherited codebase isolated data between tenant companies, and corrected the isolation model so each company's safety and account data stays properly separated on shared infrastructure.

ESCALATION

Automated missed-checkout detection

A background process continuously watches for missed checkouts with no manual oversight, triggering escalation in near real time rather than waiting for someone to notice.

IVR

Added an automated phone check-out flow

Built a phone-based IVR flow through SignalWire: the system calls the worker, plays safety prompts, and confirms safety through a keypress, alongside the existing push and SMS channels.

BILLING

Subscription billing kept self-correcting

Chargify handles recurring billing with card capture fully delegated to its hosted pages, and a scheduled job syncs subscription state daily, deactivating employees at expired companies automatically.

BACKGROUND CHECK

Added a background-check integration

Layered in PeopleConnect background-check lookups with per-user monthly usage caps, extending the platform's screening capability without disrupting the core monitoring engine.

TECHNOLOGIES

What it runs on.

ASP.NET Core (.NET 8)PostgreSQLEF CoreDapperVue 3Quartz.NETChargifySignalWireBandwidthFirebase Cloud Messaging
OUTCOME

What changed.

  • A structural tenant-isolation flaw identified and fixed on a live, safety-critical platform
  • Automated, always-on safety monitoring with no manual oversight required to detect missed checkouts
  • Multi-channel escalation through push notifications, SMS and automated calls, so alerts reach the right people
  • Recurring subscription billing fully automated across every tenant company
  • New capability layered onto the inherited architecture without disrupting what was already running

This page shows no percentages or figures because none have been confirmed by the client for publication. Where a number is not verified, it is left out rather than estimated.

ONGOING VALUE

After go-live.

The platform runs live with real safety-critical data and continues to evolve. Recent work added the phone-based IVR check-out flow and the background-check integration on top of the core monitoring engine.

LET'S TALK

Running into something similar?

Describe what you are dealing with and we will tell you honestly whether this is a pattern we have solved before.

Start a project