Limited Reality

Construction & field services

Pitt Landscape

A field-service ERP for a general contractor, with the bank and ledger integration the category leaders leave out.

Compares to Aspire, ServiceTitan

The problem

Specialty contractors get quoted $500–$2,000 a month for field-service software that still can't tell them what a job actually earned. Estimates run on gut feel, crew scheduling lives in a spreadsheet, and the accounting system finds out about the work weeks later.

The approach

  • Estimator that converts area to material volume at real coverage depths, then applies minimum orders and supplier increments — so a bid reflects what actually gets delivered rather than a round number.
  • Schedule generation for Microsoft Planner: a master template in Dataverse is pruned by the cost codes a job actually sold, then cloned into a new project with real dependencies and assignments.
  • QuickBooks sync covering customers, invoices, payments, accounts, employees and WIP / job-draw general ledger lines — construction work-in-progress accounting, not just invoice mirroring.
  • Closed-loop paid attribution: CallRail calls matched to leads by phone, enriched with GCLID, and uploaded back to Google Ads as qualified offline conversions.
  • Ten scheduled jobs and a Power BI semantic model reading the operational database directly, rather than a separate export.

Details that matter

  • Service-line revenue can never be summed across projects — each carries three to four services, so naive aggregation overcounts revenue three to four times. This is the single most common reason operators stop trusting their own dashboards.
  • Microsoft Project is deprecated and Planner's own "Copy Plan" silently drops dependencies and assignments. So the platform owns the planning layer and Planner owns execution. The first real generation produced 275 tasks across five levels, 178 dependencies and 181 assignments for an eight-week schedule.
  • Cron authentication requires both Vercel's `x-vercel-cron` header and a bearer secret. The header alone is trivially spoofable from outside Vercel's network, and treating it as proof of origin is a common way to leave scheduled routes publicly callable.
  • The technician portal defaults to Spanish rather than offering it. Crew adoption is a language problem before it is a software problem, and a default is a stronger signal than a toggle.

Models in production, on a leash

  • The Google Business Profile writer was rebuilt after measurement showed 298 of 780 published post pairs were near-duplicates of each other — a static template library where only the city name changed.
  • A model never chooses what to post about, only how to write it. Candidate selection is deterministic scoring, claimable numbers come from verified database facts, and the argument is picked by least-recently-used rotation.
  • Generated copy passes blocking deterministic validation, then an independent critic model, before entering the queue.
  • Four independent duplicate-prevention layers, cheapest to strongest: a 60-day service × city cooldown, live reconciliation against what is actually on Google, a similarity gate that catches the same argument reworded, and a UNIQUE content hash that makes double-publishing physically impossible under races, retries or double cron fires.

Systems integrated

StriperailsCustomer and vendor payments in the portal, replacing manual invoice chasing
LMNoperationsCost codes and labour hours in by webhook, driving schedule generation
QuickBooks OnlineledgerBidirectional contact and accounting sync
Microsoft DataverseoperationsProject records written from the platform
Microsoft PlanneroperationsCrew schedules generated from a master template
Microsoft GraphoperationsMail and directory
CallRailoperationsCall tracking attributed to leads and contacts
Google Business ProfileoperationsAutomated posting behind four duplicate-prevention layers
Google AdsoperationsQualified offline conversions uploaded for closed-loop attribution
Google Search ConsoleanalyticsSearch performance ingestion
Power BIanalyticsOperations and sales semantic model
Azure OpenAIoperationsContent generation and dynamic translation, behind deterministic gates
Azure Entra IDidentityStaff SSO across five roles
WebAuthn / passkeysidentityPasswordless authentication

Scale

  • ~104 portal routes and ~198 API routes
  • Fourteen scheduled jobs running unattended
  • ~450 completed projects tracked across three business lines
  • Top ten projects average $248,216 each — whole-property builds combining construction and landscape scope
  • Runs a one-crew operation with a project manager and a salesperson. The platform is the leverage that makes that headcount viable.

Built with

Next.js 16Neon PostgresDrizzleVercelAzure Entra IDPower BI