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
| Stripe | rails | Customer and vendor payments in the portal, replacing manual invoice chasing |
| LMN | operations | Cost codes and labour hours in by webhook, driving schedule generation |
| QuickBooks Online | ledger | Bidirectional contact and accounting sync |
| Microsoft Dataverse | operations | Project records written from the platform |
| Microsoft Planner | operations | Crew schedules generated from a master template |
| Microsoft Graph | operations | Mail and directory |
| CallRail | operations | Call tracking attributed to leads and contacts |
| Google Business Profile | operations | Automated posting behind four duplicate-prevention layers |
| Google Ads | operations | Qualified offline conversions uploaded for closed-loop attribution |
| Google Search Console | analytics | Search performance ingestion |
| Power BI | analytics | Operations and sales semantic model |
| Azure OpenAI | operations | Content generation and dynamic translation, behind deterministic gates |
| Azure Entra ID | identity | Staff SSO across five roles |
| WebAuthn / passkeys | identity | Passwordless 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