Skip to main content

Case study · Legacy system modernization

From a 15-year-old Access database to a secure web app

How a mechanical subcontractor replaced the system it had run on for over a decade with a connected, mobile and secure platform, in under six weeks.

Client
Regional mechanical subcontractor
Engagement
Discovery, design and build
Timeline
Under six weeks to a complete Phase 1
Status
In pilot with the client
The new dashboard: jobs needing billing, past-due invoices, bids awaiting a reply and pipeline value

Screenshots use demo data. Names and branding are placeholders.

The challenge

The company ran its whole operation (clients, jobs, crew scheduling, work orders and invoicing) on a Microsoft Access application built around 2010. It still worked, but it had stopped keeping up with the business:

  • No connection between screens. To go from the crew schedule to a job or an invoice, staff had to close one screen and open another. Accepting a bid didn't put the job on the schedule.
  • No visibility. There was no dashboard showing unbilled jobs, invoices more than 30 days past due or the bid pipeline.
  • Billing done twice. Progress billing (AIA payment applications) lived in a separate spreadsheet with no link to the invoices, and change orders didn't roll up against the original contract.
  • Nothing for the field. Crew leads couldn't clock in, submit change orders or attach job-site photos from their phones. Photos were texted to the office and filed by hand.
  • Billing took a full day when the owner felt it should take three to four hours.

There was a further complication: the original database couldn't be copied. The application belonged to its original developer, so there was no backup file to migrate from.

The approach

Discovery without a database. Instead of reverse-engineering a file, I rebuilt the data structure from live walkthroughs, screenshots and conversations with the owners. That covered every screen, field, dropdown value and business rule, such as "the date an invoice was sent drives all past-due tracking".

Design the owners could react to. Before writing code, I produced a design proposal showing the new screens side by side with the old ones. The owner approved it at the first review.

Build to production standard from day one. The pilot version is the production version: real sign-in, real security and automated tests, not a throwaway demo. I use AI-assisted development to move quickly, and every part of the system is designed and reviewed against the same security standards I apply as a CISO.

What was built

  • Live dashboard with each user's own layout: unbilled jobs, past-due invoices, bids awaiting a decision, pipeline value and open change requests.
  • Drag-and-drop crew schedule linked directly to jobs and invoices, with week and month views, multi-day jobs, company holidays and undo.
  • Jobs, estimates, work orders and invoices in one connected flow, with branded PDF invoices and win/loss tracking on estimates, including a required reason for each change.
  • AIA progress billing and change orders tied to the original contract, replacing the separate spreadsheet.
  • Job costing: material receipts plus labor time from the field add up to the true cost of each job.
  • Mobile field app for crews: clock in and out, see the week ahead, fix their own time entries, submit change requests and attach photos to the job.
  • Reports: accounts receivable aging and revenue, with drill-down and PDF export.

Security built in

  • Payment card data removed entirely. The old system stored full card numbers and security codes in ordinary fields, which violates PCI rules. The new system stores no card data at all; payments run through the processor using tokens.
  • Data isolated at the database level. Every record is tied to its company, and the database itself (PostgreSQL row-level security) refuses to return another company's data, even if the application has a bug. Automated tests prove it.
  • Hardened sign-in. Authentication runs on a dedicated identity platform with multi-factor authentication and bot protection, so passwords never touch the application.
  • Full audit trail of who changed what, including a required reason for sensitive changes.
  • Least-privilege access, from user roles in the app down to a restricted database account.
  • Protected hosting: encrypted connections, a web application firewall and DDoS protection in front of the server, and files stored outside the web root behind short-lived signed links.

Results

Goal

Billing from a full day to 3–4 hours

Billing done once

Progress billing connected to the contract, no separate spreadsheet

Field to office

Time, change requests and photos arrive in real time, not by text

PCI exposure

No card data stored in the new system

The system is in pilot with the client. Measured results will be added after the pilot.

"A lot different, but the same."

Co-owner, mechanical subcontractor, on first seeing the new design

Still running your business on an aging Access database or a tangle of spreadsheets?

Let's talk about what a secure, modern replacement would look like.

Start a conversation