Work · Client engagement · a commercial property-inspection firm

A multi-tenant inspection and work-order SaaS, built solo on Grails 6

For a commercial property-inspection firm, I built a multi-tenant inspection, work-order and contractor platform from scratch, solo, on Grails 6.2.3 and Java 17.

A B2B SaaS that runs property inspections, work orders and contractor management across many client accounts.

The problem

Property-management and industrial firms have to run inspections, turn findings into work orders, assign and track contractors, keep an audit trail, and report on all of it. They do this across many accounts with different access levels.

The client needed the whole platform built from scratch, with a clear, contract-backed delivery process.

What I built

  • Multi-tenant accounts with feature-gated subscription tiers, kept separate from role-based access. What a plan can do and what a user can do are independent decisions.
  • An inspection workflow: inspection → work order → contractor assignment → result.
  • A complete audit trail for compliance.
  • Reporting and export to CSV, Excel and PDF.
  • Stripe self-service billing.
  • A marketing and SEO surface: database-driven catalog pages with JSON-LD structured data.
  • CI/CD on GitHub Actions: automatic deploys to QA, a manual approval gate for production, and health checks.

Results

  • Built from scratch, solo, in about 13 months (~766 commits) on Grails 6.2.3 / Java 17.
  • Scale: 55 domain classes, 114 controllers and 55 services; about 230K lines of Groovy/GSP; 327 test files (~68K lines).
  • Access control that stays easy to change: subscription tier and user role are separate concerns, so plans and permissions can change independently.
  • Delivered under a SOW: scope changes went through formal addenda, and the owner got regular progress reports.

My role

End to end: architecture, domain model, workflow engine, security and access control, billing, reporting, the SEO surface and CI/CD. I also ran the client side: scoping the SOW, writing addenda, and reporting progress to the owner.

Tell me what version you're on and what's breaking.

I'll tell you what the path looks like.