Your stack keeps two sets of books.
We build one warehouse you own, where every number has a source.
The same year, two records
- CRM ledger
- $1.20M
- Web analytics
- $847K
- Unexplained
- $353K
The problem
Nothing is broken. The numbers still don't agree.
Analytics counts visits. The CRM counts revenue. Nobody's responsible for reconciling them, so the budget review turns into an argument about whose screen is wrong.
| Measure | Web analytics | CRM | Unexplained |
|---|---|---|---|
| Top of funnel | 42,318 sessions | 38,612 leads | 3,706 |
| Qualified | 1,204 conversions | 2,890 MQLs | 1,686 |
| Revenue | $847K | $1.2M | $353K |
15 hrs
every week
Stitching exports by hand because the two systems describe the same customer differently.
Q1
budget review
The channel that opened the deal gets no credit, so the spend that created it gets cut.
1 of 6
touches counted
The deal passes through six channels, but only the last click gets the credit.
Method
Scope and price come before the build.
-
01
The audit
1 to 2 weeks
We inventory every system you use and test what each one actually shares. Where there's enough history, we run the numbers on a snapshot of your own data. You get a map of where your numbers diverge, plus a build list at a fixed price, approved before anything is built.
-
02
The build
3 to 4 weeks
The scoped sources load into your own Postgres database, then get cleaned and joined for reporting. Every deal traces back to the first touch, and the numbers rebuild nightly so restated days correct themselves. Dashboards ship on the modelled tables, never on raw exports.
-
03
The retainer
Ongoing, cancel anytime
A build that stops being true is worse than no build. So the retainer watches it: failed checks block the release, a daily check catches drifting metrics, a missed run raises the alarm, and restore drills prove the backup works.
Machinery
Five stops. No black boxes.
Here's exactly what happens to your data every night, in plain words.
-
01
Extract
Every system holding sales and marketing data gets pulled into one place, automatically, every night. Logins and API keys stay in a vault you control.
-
02
Land
Everything lands in a database you own before anything is cleaned or joined. If you ever leave, the full raw history leaves with you.
-
03
Model
Messy exports get typed, named consistently, and joined so every deal traces back to the touch that started it. When a platform restates a day’s numbers, the warehouse corrects itself instead of drifting.
-
04
Prove
Checks run before any number reaches a dashboard: data arrived today, traffic didn’t flatline, every channel has a name, every case type is known. A failed check blocks the release and pages a human.
-
05
Serve
Reports read the checked tables, never raw exports. Cancel anytime. The database and its history are already yours.
Ad spend, converted once
Google bills in millionths of a dollar. That conversion happens in exactly one place, so every report agrees.
One channel vocabulary
Calls, visits and ad clicks all file under the same channel names. “Unknown” never sneaks into the board pack.
Evidence
The tables your dashboards read.
Demand
- fct_hubspot_deals
- fct_legal_intake_funnel
- fct_pipeline_by_channel
Spend
- fct_google_ads_campaign_performance
- fct_google_ads_keyword_performance
Traffic
- fct_web_sessions_daily
- fct_web_traffic_sources
- fct_search_performance
Voice and mail
- fct_callrail_calls
- fct_email_campaigns
Checked before it reaches you.
If a check fails, nothing ships. The dashboard never serves an unchecked number.
-
Fresh data, or a human gets paged
assert_recent_load
If nothing new landed today, the release stops and a human hears about it.
-
Traffic flatline alarm
assert_ga4_traffic_nonzero
Three days of zero visitors usually means broken tracking, flagged before your dashboard can lie to you.
-
No mystery channels
assert_channels_mapped
Every visit, call and click lands in a named bucket. Nothing slips through unlabelled.
-
Every case type accounted for
assert_legal_case_types_mapped
Clio, Filevine and Litify matters all file under one list, so pipeline by practice area always adds up.
Connectors
Every source, on the record.
CRM and case management
- HubSpot stg_hubspot__deals
- Clio stg_clio__matters
- Filevine stg_filevine__projects
- Litify stg_litify__intakes
- Pipedrive scoped in the audit
- Attio scoped in the audit
Ads, search and SEO
- Google Ads stg_google_ads__campaign_performance
- Search Console stg_gsc__search_performance
- Google Business stg_gbp__insights
- Ahrefs scoped in the audit
- Meta Ads scoped in the audit
Web, calls and email
- GA4 stg_ga4__traffic_sources
- CallRail stg_callrail__calls
- ActiveCampaign stg_activecampaign__campaigns
- Webflow stg_webflow__articles
- Mailchimp scoped in the audit
- Gong scoped in the audit
Support, scheduling and revenue
- Intercom scoped in the audit
- Zendesk scoped in the audit
- Calendly scoped in the audit
- Stripe scoped in the audit
If it has an API, we build the connector.
The comparison
Three ways to answer. One holds up.
-
An internal hire
Marketing ops knows the funnel. Data engineers know pipelines. One hire rarely covers both, and the search takes months before anyone writes a line of code.
With us
Both, with no hiring search. The audit starts in one to two weeks.
-
Pipeline tools
They copy rows between systems and hand you the modelling problem. The numbers still disagree, just inside a new tool.
With us
Deals modelled back to first touch, and only checked numbers reach your dashboard.
-
A traditional agency
Siloed reports per channel, stitched together in a spreadsheet each month by someone on your team, with no way to check a number.
With us
One database you own, where every figure traces back to the raw load it came from.
Field record
“We spent Fridays manually assembling spreadsheets. We open one dashboard now.”
They ran reporting by hand across three systems that disagreed, so leadership cut the spend it couldn\'t defend. One ledger took in sales and marketing data, connected spend to pipeline, and closed the spreadsheet chain.
- weekly reporting
- 15 hrs, assembled by hand one dashboard
- sources of truth
- three, conflicting one ledger
- pipeline by channel
- estimated in meetings traced to the dollar
Pricing
Three prices, fixed up front.
One path, not à la carte. Each step is agreed before the next one starts, and you can stop after any of them.
-
The audit
Credited in full against the build if you book within 14 days, so $15,000+ due on a $20,000+ build.
$5,000 once
-
The build
Scoped and fixed in the audit. We host the database, and it's yours from day one.
$20,000+ once
-
The retainer
New sources modelled and dashboards iterated, with nightly checks running. Ask it anything from Claude or ChatGPT.
$10,000 monthly
FAQ
Questions from the first call.
- Do you work with our stack?
- If your platform has a usable API, building its connector is scoped in the audit. Recent builds include HubSpot, GA4, Google Ads, CallRail, Clio, Filevine and Litify. Anything with no API at all stays manual, and the audit tells you where your sources fall before you commit.
- Our CRM data is too messy for this.
- A messy CRM is fine. A clean copy sits above it for reporting. The CRM itself stays untouched.
- We just use our CRM's native reporting.
- CRM reporting only shows what happens inside the CRM. Deals usually start from ads, site visits, or emails and calls. Those early touches get joined to the deal, so the start stays visible.
- Why not just hire an internal data engineer?
- Hiring takes months and still leaves a gap between funnel and pipelines. We start from the audit in one to two weeks, without the onboarding.
- How fast can you deploy?
- Audit in one to two weeks. Build ships in three to four weeks from kickoff. Blueprint approved before building starts.
- What do we keep if we cancel?
- The warehouse is your own Postgres database from day one, holding the raw data and the modelled tables built on top of it. The dashboards stay too. The pipelines are part of the retainer rather than a deliverable: extraction runs to the end of your final month, and our access ends with it. You leave with the data and the models built from it, not the pipelines running behind them.
- Who's this not for?
- If your spend runs on platforms with APIs and you want first-touch proof on working tracking, this fits. If most of your spend is LinkedIn, your stack has no APIs, you need multi-touch, or the tracking itself is broken, we'll tell you on the first call.
Find out what your stack actually reports.
The audit takes one to two weeks and ends with a map of your sources and a fixed-price build list. If the answer is that we're not a fit, you get told on the first call.
Or read the checklist first
The three checks the audit runs on every stack.
- Every source listed, with its owner and access path
- Each API tested for what it actually shares
- What gets automated, and what stays manual