Free AI Readiness Assessment — we map your automation opportunities in 60 minutes, no obligation.
📊 LARAVEL 🏭 SAAS PLATFORM 🇺🇸 United Kingdom
Clients served — 7-Eleven Walmart + Goodwill Network & others

Building a Multi-Tenant SaaS Platform in Laravel
for a UK Field Service Company

How a former plumber turned founder went from a spreadsheet-managed pilot to a live product with 14 paying customers — in eight months.

FIELD SERVICE SAAS · PLATFORM DASHBOARD
● Live
ACTIVE TENANTS
14
Paying customers at launch
SLA COMPLIANCE
94.2%
Rolling 4-week average
JOBS COMPLETED
96%
vs target this week
LIVE JOB STATUS
Boiler Service — SW London
Done
HVAC Fault — Birmingham
Delayed
Gas Safety Check — Bristol
En Route
PLATFORM PERFORMANCE TREND
Emergency Jobs — SLA Breach Rate
▲ 11%
Avg Booking-to-Completion Time
▲ 4%
Self-Service Onboarding Rate
▼ 6%
📊
MANAGEMENT INSIGHT Emergency job SLA breach rate has risen for 3 consecutive weeks, concentrated in the Leeds–Sheffield corridor. Root cause points to routing gaps. Offline PWA sync resolved report delays for low-signal sites — zero engineer-reported failures at launch.
8 mo
Concept to live product
14
Paying customers at launch
PWA
Engineer mobile interface
Laravel 11
Core framework
— THE BACKGROUND

The client had run a plumbing business for nine years. He knew every small field service business had the same problem.

Client managed his own heating and plumbing business in Bristol using WhatsApp, a shared Google Calendar, and a spreadsheet. Every other small field service business owner he knew was doing the same thing. The enterprise platforms — ServiceMax, Simpro, FieldAware — were too expensive and too complicated for businesses with 5 to 20 engineers. Nobody had built something that felt like it was designed for a business owner rather than an enterprise IT department.

He came to us with a detailed product spec, a clear target customer, and a realistic budget. Two UK agencies had already quoted timelines that would have burned through his runway before launch. A third had started the project, billed for three months, and delivered a prototype that didn't match what had been discussed.

We scoped the project together over three calls and agreed on a phased approach: get to a launchable product with his first 10 customers as the milestone, then build from there.


— THE CORE TECHNICAL DECISION

Multi-tenancy sounds simple until you're actually designing it.

The architecture question that drives every SaaS build: how do you store data from multiple customers in a way that's secure, performant, and maintainable as the product grows?

🗄️

Option 1 — Shared database, tenant ID on every table

Simplest to build. Biggest risk: one missed WHERE clause in a query returns another customer's data. Fine for simple products. Not right for a platform managing operational data for field service businesses.

🏗️

Option 2 — Separate schema per tenant (our recommendation)

Each customer gets their own PostgreSQL schema for operational data — jobs, engineers, clients, invoices. The central database handles accounts, billing, and authentication. Proper data isolation without the operational weight of separate databases.

💽

Option 3 — Separate database per tenant

Maximum isolation. Operationally heavy — every new customer means a new database, every migration runs N times. Right for very high-value enterprise customers. Too heavy for a startup targeting SMEs.

We went with Option 2 — central database for account management and billing, separate PostgreSQL schemas for all operational data. We used stancl/tenancy for the Laravel implementation, customised to handle the scheduled job dispatch system's edge cases.


“Three agencies had quoted me into their own timelines. Infomaze were the first to scope it around what I actually needed to launch — not what would generate the most work for them.”
— Founder
— Six modules. One coherent product. Eight months.

We told them their data was messy. They didn't love hearing it.

The first thing we do on any data project is spend time with the actual data before agreeing to a scope. In this case, that meant two days on-site in the West Midlands — one day with the production team, one day with finance.

SAP Business One had solid transaction data going back several years. But the way it was being used meant that several key fields were inconsistently populated. Some production orders had completion timestamps. Some didn't. The quality tracking sheet, maintained on a shared drive, had been through three different formats in four years and had columns that meant different things depending on when the row was entered.

We came back with an honest assessment: a clean Power BI dashboard was achievable, but the data quality issues in SAP needed to be addressed first — otherwise we'd be visualising unreliable numbers more attractively. That conversation took some back and forth. Nobody likes being told their data is messy. But they agreed, and the project was better for it.


— WHAT WE BUILT

Six modules. One coherent product. Eight months.

Month 1–4 · Core Platform

The job management system was the heart of the product. A dispatcher creates a job in the web interface, assigns it to an engineer, and the engineer receives it on their phone. The engineer logs arrival, completes the job report — photos, completion notes, customer signature — and the job status updates live on the office dashboard via Pusher WebSocket connections.

Why a PWA instead of native iOS and Android apps

The client had originally wanted native apps. The budget and the 8-month timeline made that difficult for v1. The case for a PWA: engineers access it from their phone's browser, it can be added to the home screen, it works offline for job forms and syncs when connectivity returns, and it behaves correctly on both iOS and Android without two codebases to maintain. We recommended testing it with the first 10 customers before deciding whether native apps were worth the investment. Every one of the 14 launch customers had engineers using the PWA without reported issues.

Month 3 · Billing Integration

Three subscription plans, managed through Stripe. The billing system handles plan changes, failed payment retries, and automatic account suspension after a grace period. Stripe's webhook handling was the most time-consuming part — testing every failure scenario, ensuring the platform stayed in sync with Stripe's state even when webhooks arrived out of order or were delayed.

Month 4–5 · Reports and Invoicing

📄

Auto-generated job completion reports

PDFs branded with the tenant's logo, generated automatically when a job is marked complete. Sent directly to the end customer from within the platform. No manual export, no file management.
🧾

Invoicing from completed jobs

Draft invoices generated from job data — the office reviews and sends. Reduces the gap between job completion and invoice from days to minutes.
📊

Basic reporting layer

Jobs completed per engineer per week, revenue by job type, average booking-to-completion time. The numbers a business owner actually uses, without a BI layer the product wasn't ready for yet.
💰

Finance bridge

Actuals vs budget by cost centre, updated daily. Replaced the manually maintained Friday spreadsheet entirely.

Month 6 · Self-Service Onboarding

Client had been onboarding customers manually over video calls. As the number grew, that wasn't scalable. We built a self-service flow: account creation, company setup, adding engineers, configuring job types, and a test job walkthrough. New customers can be fully operational without involving client or his team.


— WHAT HAPPENED AT LAUNCH

14 paying customers on day one. All of them churned from larger platforms.

The client launched to his waitlist in month 8. Fourteen paying customers within the first month — all of them had moved from Simpro or a similar platform that felt too complicated for a business of their size. The feedback client consistently heard: it felt like it was built by someone who understood how a small field service business works. Which, of course, it had been.

One customer — a solar panel installation company in Cardiff — had engineers working in locations with poor signal. The offline sync feature meant they could complete job reports in a basement or a loft and have everything upload when they were back in the van. Client hadn't explicitly asked for offline sync in the scope. We'd included it because we knew field service engineers work in awkward environments.

“I spent nine years frustrated with tools built for companies ten times my size. This felt like the first time someone actually listened to what a small field service business needs.”
— Founder
— SIX MONTHS AFTER LAUNCH

Customer portal. Xero integration. Third-party API in scoping.

We continue working with client on a monthly retainer. Six months post-launch: a customer portal — read-only view for end customers to see job history, download past reports, and raise service requests — is live. Xero two-way invoice sync is live. A third-party integrations API is in scoping, which will allow larger field service businesses to connect the platform to their existing systems.

The native app question came up at month 3 of live operation. The PWA had performed well enough that client chose to stay with it for v1 and revisit native apps when he reaches 100 customers and has a clearer picture of exactly where the PWA falls short.

SIX MONTHS AFTER LAUNCH

Customer portal. Xero integration. Third-party API in scoping.

01
SAP Business One → Azure SQL (via Service Layer API)
+
SAP Business One exposes a REST-based Service Layer API. We used this to pull production orders, goods receipts, and job completions on a 2-hour schedule into a staging schema in Azure SQL. The transformation layer here handled the inconsistent timestamp data we'd found in discovery — null completion timestamps were flagged and tracked separately rather than silently dropped.
02
Quality tracking sheet → Azure SQL (via Power Automate)
+
The quality sheet lived on a shared OneDrive drive and was updated by the shop floor team daily. A Power Automate flow monitored for file changes, extracted the new rows, ran a basic validation check (column count, date format, rejection code lookup), and appended clean rows to the staging table. Invalid rows went to a separate review table where the quality manager could correct and resubmit.
03
Finance spreadsheet → Azure SQL (automated Friday close)
+
The finance team's Friday update was the most manual part of the old process. A Power Automate flow now triggers at 5:30pm on Fridays, reads the Excel file from SharePoint, validates the structure against a known schema, and writes the period close figures to the staging database. The manual step is gone. If the file hasn't been updated by 5:30pm, the flow sends an alert to the finance lead.
04
Azure SQL → Power BI (scheduled refresh)
+
Power BI connects to Azure SQL via a published dataset with a 2-hour refresh schedule during business hours. Role-based row-level security means the executive dashboard and the production operations dashboard share the same dataset but each user sees only the data relevant to their role. A senior manager sees the full business. A line supervisor sees their line.

Building a SaaS platform or field service product?

We've built multi-tenant SaaS platforms in Laravel for B2B products across field service, logistics, and professional services. ISO 27001. NDA from day one. Let's scope your build.

Explore Laravel Development Services
🔧
Laravel Development
APIs, SaaS, portals, integrations
🏗️
SaaS Product Development
We've built 15+ SaaS products
🗄️
Field Service Industry
Software built for dispatch and field ops
Back to top
📊 BI Practice
Free Assessment
We find out why your dashboards aren't being used — and fix it.

🔒 ISO 27001 · No spam · Honest assessment