Owner Cockpit
Meridian Field Services, Inc.
Commercial mechanical & facilities services · Greenville, Charlotte, Augusta · 68 employees. Nine systems, one screen, refreshed before you wake up.
Revenue against plan
Trailing twelve months against the board plan. Seven of twelve months landed at or above.
Show the numbers
| Month | Actual | Plan | Variance |
|---|
Needs you today
Ranked by dollars at risk, not by system.
MFS-2611 is tracking 5.9 pts under bid margin at 68% complete — $33.8K of the $55.8K total overrun across six active jobs sits on this one. Labor hours are 14% ahead of the cost curve.
$387K past 60 days, 12.1% of the book. Both slow payers have open jobs still being invoiced — you are financing work you are still performing.
71.3% against a 78% target while backlog holds at 14.2 weeks. The work exists; dispatch isn't reaching it. 1,684 available hours went unbilled in August.
Where the margin is
August gross margin by service line. Blended 32.4%.
Pipeline by stage
$7.85M open · $2.19M stage-weighted · 31% win rate over 90 days.
AR aging
$3.20M outstanding across 94 open invoices.
Active jobs — bid margin vs. where it will land
Projected margin at completion is actual cost to date divided by percent complete, run against the contract value — the number the weekly job meeting is actually about.
| Job | Contract | % comp. | Budget cost to date |
Actual cost to date |
Variance | Bid GM | Proj. GM | Status |
|---|---|---|---|---|---|---|---|---|
| Six active jobs | $3,438,900 | — | $1,807,500 | $1,863,300 | −$55,800 | 27.7% | 25.1% | — |
Cockpit module · Fleet
41 vehicles, and where each one is
A truck that isn't rolling is a technician who isn't billing. This module exists because 18 vehicle-days went missing in August — roughly 144 tech-hours with nowhere to ride — and nobody could say why without calling the shop.
Down right now — and why
Reason and expected return come from the driver who parked it and the shop that has it. Nobody re-keys this anywhere.
Where the downtime went
Vehicle-days out, August. Collision is one incident with a long tail, not a pattern.
Fleet roster
Ten of forty-one shown. Status and odometer are whatever the driver last submitted; PM due is computed against the interval on the unit.
| Unit | Vehicle | Branch | Assigned driver | Odometer | Next PM | Last check-in | Status |
|---|
Incidents & insurance
Every report carries the driver's narrative, the photographs taken at the scene, and whatever official paper followed. The packet is assembled by the driver on their phone, not reconstructed by an office manager a week later.
The driver portal
One link, no app store, no password to forget — a six-digit code to the driver's phone and they're in. This is the whole data-entry layer for everything above.
Odometer, a four-item pre-trip check, and one of three status buttons. Thirty seconds in the yard. Nine seconds if nothing changed.
The driver picks what and how bad. Do not drive takes the unit out of service immediately, notifies dispatch, and the truck stops appearing on tomorrow's schedule — before anyone has assigned work to it.
Photographs while the scene still exists, the narrative while it's fresh, the other party's insurance card, and the police report number the moment the officer hands it over. The claim opens itself.
A text to the shop foreman, a photo in someone's camera roll, and a call to the insurance agent eleven days later where nobody can remember whether it was raining.
Downtime stops being an anecdote and becomes a number with a price on it. Unit 207 sitting at the body shop for seven days is roughly 40 unbillable technician hours — which is why this module reports up to the utilization tile on the cockpit rather than living in the shop's own spreadsheet.
Demo only — photographs you attach here stay in your browser and are never uploaded anywhere.
Cockpit module · Marketing
What a lead costs, and what a customer costs
Meta will tell you what a click costs. It cannot tell you what a customer costs, because it does not know which of those leads signed a contract. That answer needs three systems at once — which is the entire reason this tab exists.
What each stage actually costs
Trailing 90 days of paid social — $37,180 spent — divided by how many survived to each stage. This is the ladder Meta cannot build on its own: it stops knowing anything after the form fill.
Where the leads came from
306 marketing-qualified leads in August, by source of record.
HubSpot knows those came from Google Ads. Without the Google Ads connector we cannot tell you what they cost, so they sit outside every cost-per-lead figure on this page. One connector closes it.
Meta campaigns — August
Straight off the Insights endpoint, joined to HubSpot for the lead counts. Budget is the campaign object; spend is the insight — two different calls, which is why most tools show one and not the other.
| Campaign | Daily budget |
Spend | Pacing | Impressions | Clicks | CTR | CPC | Leads | CPL |
|---|---|---|---|---|---|---|---|---|---|
| 4 active campaigns | $425 | $12,260 | 93.1% | 461,400 | 8,990 | 1.95% | $1.36 | 208 | $58.94 |
Brand retargeting delivered 63% of its budget and returned the worst cost per lead on the account at $107.27. An ad set that cannot spend its budget is usually one that never exited learning — worth a look before September's budget reloads.
How these numbers are built
Four decisions that determine whether this page agrees with what your marketing agency shows you. All four are set deliberately, not by default.
Pinned to 7-day click, 1-day view and stated on every card. Meta's UI can be set to something else per user; when the windows differ the conversion counts differ, and whoever is holding the phone wins the argument. We pin it so there is nothing to argue about.
Meta returns a cost for every action type — landing page view, add to cart, lead, purchase. We count the lead form completion only. Counting the cheapest available action is how agencies produce a $4 CPA on a business that has never acquired a customer for less than a thousand.
Meta revises the last 72 hours continuously and conversions can move for up to 28 days. Anything inside that window is shown as provisional and excluded from the closed-month figures. The number does not silently change under you.
Deals closing in August came from June and July leads. Dividing August spend by August closings is the most common way a marketing dashboard lies. Cost per closed deal is calculated on a trailing 90-day cohort, matching each close to the spend that produced it.
What we ask Meta for
The connector is scoped ads_read — it can see the account and nothing else. Meta's own MCP server also ships budget and campaign write tools; we do not enable them, because a dashboard that can spend money is not a dashboard.
How the cockpit gets fed
Nine systems, five methods
Nothing on the cockpit is typed in. Every figure traces back to a system of record, a collection method, and a timestamp — and when a feed goes stale, the cockpit says so instead of quietly showing you Friday's number.
MCP connector
The system exposes a native connector, so Claude reads it directly — no middleware, no export, and permissions stay the vendor's own. First choice wherever it exists.
API
An OAuth or key-based pull on a schedule you set. The standard path when the vendor publishes an API and your tier includes it.
Browser agent
For systems with no API on your tier, or reports that only exist inside the UI: a headless Chrome session signs in on a schedule, runs your saved reports and takes the export. The same clicks a person would make — at 2:15 every morning, without being asked.
File & watched folder
The spreadsheets your team already keeps. Drop the file in SharePoint or email it in; the pipeline notices the change, parses it, and reconciles it against the systems of record.
We build the front door
When the data doesn't exist anywhere yet because nobody has a good way to enter it, we build that surface — like the driver portal your fleet uses. It writes straight to the warehouse, so there is no import step at all.
Last 24 hours
The overnight cycle, as the pipeline recorded it. The 2:15 block is the browser agent working a system with no API.