One record per building, fed automatically by every incoming request.
The challenge
This roofing and building envelope maintenance company handles roof leaks, waterproofing repairs and building envelope maintenance for property managers. Every day, the admin team received more than 10 incoming emails, damage reports and quote requests on top of recurring maintenance contracts, and had to re-enter each one by hand, call site contacts to schedule access, correct field reports before invoicing, and update the property manager at every step. Technical history per building was never capitalized, so recurring maintenance opportunities kept getting lost behind reactive, one-off interventions. At the time, more than 90% of incoming demand was reactive (leaks, emergencies) against 2% from maintenance contracts, exactly the ratio the business wanted to invert. The existing no-code tool had hit its functional ceiling and offered a weak field experience for rope-access technicians.
The solution
We rebuilt it as a custom platform: Next.js, PostgreSQL, Prisma, Better Auth.
- An email parser reads incoming requests and matches them automatically to the right client, contact and building, queuing them for triage instead of manual re-entry
- A data model centered on the building and its technical history (roof zones, facades, prior interventions) rather than on the quote, so preventive maintenance opportunities surface naturally over time
- A dedicated mobile app for field team leads: hours, written reports and photos logged on site, feeding directly into the same building history
- Milestone billing (deposit, progress, balance) for multi-day projects, a single invoice for one-off interventions, both under continuous legal numbering
- Full migration of the legacy platform's data: buildings, contacts and intervention history
The result
The team now triages incoming requests automatically, keeps one technical history per building, and bills multi-day projects and one-off interventions under the same continuous legal numbering.