OneMetric Case Studies

Solving Ads reporting in HubSpot (without using expensive tools)

Written by Admin | Sep 5, 2025 12:40:17 PM

A Little Context on Our Client?

Our client helps fast-growing companies manage employee laptops and IT gear across cities, countries, and continents. From sourcing to delivery, retrieval to recycling,  they handle the full lifecycle of remote IT hardware so teams can work smoothly without worrying about logistics.

As they scaled, they ramped up their marketing, too. Campaigns went live on Google, LinkedIn, Reddit, Meta, and Bing. Budgets were spent. Ads were running. Leads started coming in.

But the pipeline stayed quiet.

They knew something was off, and they wanted to fix it. That meant answering questions like:

  • What’s working and what’s not?
  • Where should we allocate more budget?
  • What should we scale or stop?

And that’s where the problem began.

The Problem with Multi-Channel Reporting in HubSpot

What they wanted was simple: to know how much each Lead, Marketing Qualified Lead (MQL), Sales Qualified Lead (SQL), Opportunity, and Customer cost them, per channel, per campaign.

A dream dashboard might look like this:

The problem? The numbers lived in two different worlds:

  • Ad spend data sat inside the ad platforms.
  • Funnel stages were tracked inside HubSpot.


And HubSpot with its limited ad reporting didn’t help:

  • HubSpot only pulls ad spend data from Google, Meta, and LinkedIn. No native support for Microsoft Ads or Reddit.
  • Even where it does connect, it’s limited to high-level metrics. There’s no proper way to link campaign spend to funnel stages like SQLs or Opportunities.
  • Attribution inside HubSpot breaks the moment naming conventions aren’t followed perfectly (which happens often).
  • And there’s no out-of-the-box way to see cost per lifecycle stage. You can’t calculate things like cost per MQL or cost per Customer natively.


So you end up with a lot of data… but very little insight.

The team found themselves bouncing between platforms, exporting reports, cleaning spreadsheets, and still struggling to answer basic questions like:

  • What’s the CAC from LinkedIn?
  • Which campaigns are generating real pipeline?
  • Is Microsoft Ads even working?

No marketing team wants that. So they brought us (OneMetric) to solve it.

Connecting Ad Spend with HubSpot Funnel: A Fun Challenge

We did what most would: started with Looker Studio.

The idea was to centralize campaign cost data from ad platforms and then later pull in funnel data from HubSpot.

But Looker didn’t play nice:

  • Campaign IDs came in as raw numbers
  • Formulas broke
  • HubSpot integration was clunky

It was clear this wasn’t going to scale. We needed a better solution.

Back to First Principles: Google Sheets FTW

Instead of adding more tools, we went back to the basics and asked: What exactly do we want to measure?

Answer:

  • Campaign-level performance
  • Channel-level performance


And for that, we didn’t need a Business Intelligence platform. We needed structured campaign data in one place.

Here’s how we broke it down:

Campaign-level data (spend, impressions, clicks, leads)
 → summed up to → Channel-level reporting (Google, LinkedIn, etc.)
 → grouped into → Paid Search vs. Paid Social

We thought, maybe we can just do it on Google Sheets. And we did. But again, things were not easy.


Minor Yet Difficult Data Inconveniences

We weren’t blocked by missing data. But small issues made reporting harder than it should’ve been.

1. Campaign Naming Was Inconsistent

To link ad spend from Google to funnel performance in HubSpot, campaign names needed to match. But even within Google Ads, naming varied a lot.

Example:

- Google Ads had two campaigns: GS_23 and GoogleSearch_23 (same month, same goal, different names)
- HubSpot recorded both under a single UTM like: adwords

Without standard names, nothing aligned.

So, we standardized campaign names and UTM sources.. Then built a cleanup workflow to keep things tidy going forward.

2. HubSpot Dates Were Unreadable

HubSpot exported dates as long Unix timestamps. For example, instead of “Jan 2024,” we got something like 1704067200000.

We didn’t need time-to-the-second — we just wanted the month for each contact. So we used a formula in Google Sheets to convert Unix timestamps into clean, readable dates.

3. Currency Mismatches Created Noise

Most of the ad platforms were reporting in euros. But LinkedIn? It gave us costs in dollars. That broke any clean comparison between platforms.

If we had gone ahead with mixed currencies, the spend numbers would’ve looked inflated or deflated—completely distorting cost per lead or SQL calculations, and making LinkedIn seem more (or less) efficient than it actually was.

So, we used the GOOGLEFINANCE function inside the sheet to convert USD to EUR in real time. This kept all spend data aligned without manual adjustments and ensured fair, apples-to-apples comparisons across every channel.

Marrying the Data: One Unified Funnel View

Once the campaign and funnel data were cleaned and standardized, we were ready to stitch it all together.

We had:

  • Ad platform sheet: campaign name, spend, impressions, clicks, with consistent naming and month tagging
  • HubSpot funnel sheet: UTMs and lifecycle stages at the contact level, with readable dates converted to month format

Step 1: Build the Base: Campaign-Level Metrics

Now that campaigns were aligned, we could map:

  • Spend from each campaign (from ad data)

  • Leads, MQLs, SQLs, etc. tied to each campaign (from HubSpot)

We used Pivot Tables along with COUNTIF formulas in Google Sheets to combine this.

And every row was labeled by month, so we could break down:

  • Cost per SQL in March 2024
  • Cost per Customer in April 2024

Step 2: Channel-Level Rollup

We rolled up the campaign-level data to show monthly performance for each platform. This gave a clear, side-by-side comparison of how each channel was performing over time.

This gave a month-on-month view of performance by platform. Something they never had before.

Step 3: Paid Search vs. Paid Social

Finally, we added a column that categorized each channel into:

  • Paid Search: Google, Bing
  • Paid Social: LinkedIn, Meta, etc.

Using this, we created monthly summaries like:

This structure helped them:

  • Spot monthly trends
  • Identify seasonality
  • Align campaign activity with quarterly goals

Step 4: Built a Complete Funnel Sheet

We pulled in all the key metrics and structured them month by month. This included:

  • Top-of-funnel metrics: Impressions, Clicks, and Click-Through Rate (CTR)
  • Lead journey metrics: Leads, MQLs, SQLs, Opportunities, Customers
  • Spend and efficiency metrics: Spend, Cost per Lead (CPL), Cost per MQL, Cost per SQL, Cost per Opportunity, and Cost per Customer
  • Conversion rates: MQL to SQL % and MQL to Opportunity %

This gave the team full visibility from first click to closed customer, with performance and cost mapped at every stage.

Real-Time, Self-Updating Reports? Yes, Please.

We wanted to make sure that the data stayed fresh without manual effort.

  • Ad platform data (Google, LinkedIn, Meta, Reddit, Bing) was set to update automatically in Google Sheets every morning at 9 AM using Coefficient.
  • HubSpot data was dynamic by nature. Any time a contact moved from one lifecycle stage to another—lead to MQL, MQL to SQL, or customer—it instantly reflected in the sheet.

The result? A live, always-on dashboard that told the team:

  • What they spent every month
  • What leads came in
  • How those leads were progressing through the funnel

No delays. No refresh buttons. Just real-time insights, every day.

From Guesswork to Confident, Data-Driven Marketing

This wasn’t just a reporting fix. It completely changed how the team approached marketing decisions.

Example: Let’s say they were spending $1,000* on each channel.

After the dashboard went live, they saw that only 3 campaigns on Google and 2 on LinkedIn were actually bringing in customers*.

The rest were generating impressions and clicks—but nothing beyond that.

Now, instead of guessing what to tweak, they could:

  • Reallocate budget to the campaigns that were working
  • Cut back or pause spend on low-performing efforts
  • Experiment with new ideas, knowing the data would show results
  • Predict pipeline value based on current Cost per MQL, SQL, and Opportunity

With visibility into every stage from spend to revenue, they finally had a marketing engine guided by real-time data and not gut feel.

But It Didn’t Stop There

Now that the team had a clear view of what was working and what wasn’t, they wanted to go one level deeper — reverse engineer the journey.

They weren’t just asking which campaign brought in leads. They wanted to know:

  • What page did users visit before they even reached the landing page?
  • Which content paths actually led to conversions?

But tracking that wasn’t straightforward.

RevenueHero was handling form fills and pushing data into HubSpot, which meant the actual landing page visits weren’t being captured directly.

Here’s how we solved it:

  • Tracked the thank-you page (post-form submission) as an event in Google Analytics
  • Used that event as an anchor to backtrack the customer journey
  • Identified the entry pages and paths users followed before converting

This gave the team clear insight into which pages were driving conversions — not just traffic. And it helped them decide exactly where to double down, improve messaging, or test new ideas.

Clarity Without Complexity

Now, there was no more guessing which channels work because campaigns now connect directly to pipeline and revenue. And the impact was in pocket:

  • $9,000+ saved annually by skipping bloated BI tools and overpriced connectors
  • 30+ hours a month reclaimed, no more chasing reports across five different platforms
  • Eliminated 2 channels with 0 effect on pipeline. Reallocated the same budget to campaigns that were working to increase the pipeline.


What they have now is clean, simple, and scalable — exactly how reporting is supposed to look.

Want a Similar Report for Your Team?