Context & Problem
Roofing contractors were running their entire business — leads, estimates, scheduling, and invoicing — across paper, spreadsheets, and text messages. Generic CRMs didn't fit their field-heavy workflow, and enterprise field-service software was priced out of reach for independent contractors. The client needed a purpose-built mobile tool that worked on job sites, including areas with no cellular signal.
Roofing contractors relied on paper-based tracking and generic CRMs that didn't fit their field-heavy workflow. Job data was scattered across clipboards, spreadsheets, and text messages, leading to lost estimates and delayed invoicing. They needed a mobile-first solution designed specifically for the roofing trade that could handle the entire job lifecycle from lead capture to final payment. Critically, the app had to function fully offline on remote job sites where cellular coverage is often unreliable.
Design Constraints
- teamInherited constraints from legacy project format.
Architecture Overview
Employed a domain-driven design methodology, conducting on-site ride-alongs with roofing contractors to map their real-world workflows before writing any code. Built the mobile client in React Native with an offline-first SQLite layer that queues all mutations and syncs via a conflict-resolution algorithm when connectivity returns. Integrated Stripe for in-app payment processing and invoice generation directly from job line items, and connected a hyperlocal weather API to the scheduling module so crews can plan around rain days. Backed the system with a Node.js API on PostgreSQL, storing geotagged photos in AWS S3 with pre-signed URLs for fast, secure retrieval.
Outcomes & Lessons Learned
Invoicing Time
Reduced invoicing time by 60%
Tracking Accuracy
Improved job tracking accuracy by 80%
Retrospective
- Ride-alongs with contractors before writing code revealed that photo documentation was more critical than any workflow feature — contractors used photos as liability protection, not just progress tracking. This completely reordered our feature priorities.
- The offline-first sync conflict resolution strategy required more edge case handling than expected. The most common failure mode was a contractor editing a job estimate on both their phone and tablet simultaneously, which required a merge strategy rather than last-write-wins.
