A 55-person B2B SaaS company. CRM, three ad platforms, and GA4, reconciled by hand in a spreadsheet every Wednesday before Thursday's revenue meeting. The attribution argument ran for four months. Here is what we connected, the five tiles we built, and the three outcomes, including a budget reallocation that would not have happened from a spreadsheet.
This is a case study from a build we completed in early 2026. The client is a B2B SaaS company based in the Netherlands, 55 people, Series A, selling workflow software to mid-market operations teams. We have anonymised the company name. The numbers are as close to real as we are able to share.
Before: Wednesday afternoon was already spoken for
The marketing lead, we will call her Sophie, ran a three-person team responsible for demand generation, content, and field events. Every Thursday morning the leadership team held a revenue meeting: pipeline, closed-won, burn rate, forecast. Marketing was expected to show up with attribution data. Which channels had sourced pipeline. What campaigns had contributed to deals that closed. What the CAC looked like by channel.
Getting to those numbers took most of Wednesday afternoon. Every week.
The data lived in four places. HubSpot held deals, deal sources, and close dates. Google Ads, LinkedIn Campaign Manager, and Meta Ads Manager each held their own spend, clicks, and conversion data, none of them talking to each other, and none of them agreeing with HubSpot on what a conversion meant. Google Analytics 4 held the web behaviour and assisted conversion data, which was the only place where content and organic performance showed up alongside paid.
Sophie's Wednesday routine was: export from HubSpot (deals closed or advanced this week, with deal source), export from each ad platform (spend and attributed conversions for the same period), open GA4 for organic traffic and goal completions, then pull all four into a master spreadsheet maintained in Google Sheets. The spreadsheet had a channel breakdown tab, a CAC calculation tab that required manual input of each platform's spend, and a pipeline attribution tab that required manually joining the HubSpot deal list with the ad platform conversion data by approximate timestamp, because none of the systems shared a common identifier for the same lead.
The process took between two and three hours. Occasionally it took longer when a HubSpot export came out differently formatted, or when one of the ad platforms had changed its export column headers. The output was a set of numbers Sophie had reasonable confidence in, presented in a Google Slides deck that she updated manually for each meeting.
Two things went wrong at the revenue meeting regularly:
Sales challenged the attribution. Their version of pipeline sourced by marketing was lower than Sophie's, because HubSpot deal source attribution was set by whoever created the deal, and sales reps tended to attribute deals to their own outbound effort rather than inbound sources. There was no neutral source both sides agreed on. The Thursday meeting spent fifteen minutes most weeks on a conversation that was really about methodology, not results.
Finance challenged the CAC number. The finance team calculated CAC using total marketing spend (including Sophie's team's salaries and tools), not just ad spend. Sophie's number was media spend only. Neither was wrong, but they were different calculations, and the mismatch surfaced at the same meeting in front of the CEO every week.
What we built
The discovery call was thirty minutes. Sophie had two asks. First: she wanted the attribution methodology agreed on before it appeared in a meeting. Second: she wanted to stop spending Wednesday afternoons on assembly and spend them on analysis instead.
We spent the first half of day one on the attribution problem before writing any code. With Sophie, the head of sales, and the CFO on the same call, we agreed a definition: pipeline sourced by marketing means deals where the first touch was an inbound channel (form fill, content download, event registration, organic search). Deals where sales made first contact are sales- sourced regardless of later marketing touchpoints. Both teams looked at the same tile and used the same number from the first week.
We connected four sources: HubSpot (via the CRM API, pulling deals, contacts, and first-touch attribution), Google Ads (via the Ads API), LinkedIn Campaign Manager (via the Marketing API), and GA4 (via the Data API, pulling sessions and goal completions by source and medium). The board has five tiles:
Pipeline sourced this quarter. Deals in HubSpot where first-touch is an inbound source, summed by deal value. Broken down by channel. The agreed definition is baked into the query, sales and marketing read from the same tile.
CAC by channel. Ad spend from each platform divided by attributed deals closed in the same period. Media spend only, the definition Sophie was using. A separate row shows fully-loaded CAC (including team costs from the payroll export) so finance can read both without anyone recalculating.
MQL to SQL conversion rate. By channel and week. Shows where pipeline starts well but stalls at the handoff, and where it converts cleanly end to end. Pulled from HubSpot lifecycle stage transitions.
Content-sourced pipeline. Deals where first touch was organic search, content download, or blog, using UTM source data from GA4 combined with HubSpot contact source. The tile Sophie could never build cleanly from the spreadsheet because it required joining two systems at the contact level.
Campaign ROI. For each active or recently-closed paid campaign: spend, pipeline generated, deals influenced, and a simple ROI multiple. Updated daily from each ad platform.
Build time was seven days. Day one was the attribution methodology session and the data mapping. Days two and three: HubSpot and GA4 connections, followed by a full back-period validation, we ran the pipeline sourced tile against Sophie's existing spreadsheet for the previous six weeks to confirm the numbers matched before presenting them in a meeting. Days four and five: the ad platform connections and the CAC logic. Day six: Sophie reviewed with the head of sales and the CFO, one adjustment to the CAC tile to add the fully-loaded row. Day seven: live, with a two-hour handover.
After: Wednesday afternoon came back
The first Thursday revenue meeting after go-live, Sophie presented from the board on a laptop. No deck, no spreadsheet. The pipeline sourced number was the same one sales saw in HubSpot. The CAC showed both the media-spend line and the fully-loaded line in the same tile. The attribution methodology conversation did not happen.
Three outcomes that were measurable within the first quarter:
Wednesday prep went from two to three hours to twenty minutes.Sophie describes the change as moving from building the picture to checking that it looks right. The board updates overnight. On Wednesdays she spends twenty minutes reviewing for anything anomalous before the Thursday meeting. The rest of the afternoon is available for work that was previously impossible to schedule.
The attribution argument stopped. The first revenue meeting after go-live was the first in four months where the pipeline sourced number was not challenged. The agreed methodology is visible in the tile description, anyone who opens the board can see exactly what it includes and excludes. The conversation moved to what the number meant, not whether it was right.
A budget reallocation that would not have happened otherwise.In week three, the CAC by channel tile showed LinkedIn spend at 3.1x the CAC of content-sourced pipeline for the same deal size and close rate. The content-sourced pipeline tile confirmed the volume was there, organic and blog traffic was generating a similar number of qualified leads at significantly lower cost. Sophie proposed shifting 30% of the LinkedIn budget to content amplification at the following Thursday meeting. The CFO approved it in the room because both the CAC number and the pipeline volume were on the same screen. Under the old process, building that comparison would have taken a full day and still relied on manual joins across three systems.
What made it work
The attribution methodology session was not optional. If we had skipped it and built the board to Sophie's existing definition, the Thursday argument would have continued, now about a board instead of a spreadsheet. Getting sales and finance in the same room to agree on what the tile means before the tile existed was slower upfront and faster every week after.
The back-period validation was the other non-negotiable. Running the pipeline sourced tile against Sophie's own spreadsheet for six weeks of prior data meant the first Thursday meeting started from a number everyone recognised. A new dashboard showing a different number than the one people have been seeing for months is a trust problem before it is anything else. Matching the historical numbers removed that friction entirely.