HubSpot/No. 35/6 min read
Your HubSpot campaigns have no cost attached. That’s why you can’t report ROI.
A campaign report without a cost is just a list of things you did. Here’s the budget, spend, and association build that turns HubSpot campaigns into something finance will accept.
Open your HubSpot campaigns tool and sort by budget. If most of the column is empty, you don’t have campaign ROI. You have a list of campaigns. Return needs a denominator, and nobody put one in.
October is when this gets expensive. Next year’s budget is being argued right now, and the question on the table is always the same: what did the money produce? Marketing budgets are flat, moving from 7.7% of company revenue in 2025 to 7.8% in 2026 in Gartner’s latest CMO Spend Survey. Flat budgets get defended line by line. A campaign with no cost on it loses that argument before it starts.
Why HubSpot campaign reports fall apart
Most teams use campaigns as a folder. They create one, tag a few emails and a landing page, and move on. Three things go wrong from there.
There is no cost. HubSpot calculates campaign budget as “the sum of all campaign budget items” and spend as the sum of all spend items. No items, no totals, no remaining budget, nothing to divide revenue by. Your report can show contacts and deals. It can’t show return.
The spend lives somewhere else. Paid media spend sits in the ad platforms. Event costs sit in a finance sheet. Agency fees sit in an invoice. None of it is on the campaign record, so every ROI number is assembled by hand in a spreadsheet, once, and goes stale the next day.
The assets aren’t actually attached. A campaign only reports on what’s associated with it. The forgotten landing page, the three nurture emails someone cloned, the form on a partner site: all of it falls outside the campaign. The result is the same cost-per-lead problem we keep seeing. The cheap number looks great because half the denominator is missing.
The build: make the campaign a financial record
Four moves. None needs new software.
1. Set a budget before the first asset ships
Make a budget item the first step of every campaign brief. One line per cost type: media, events, content production, tooling, agency. Use the same item names on every campaign so reports can group them. A budget you add after launch is a number you reverse-engineered from what happened.
2. Sync the ad spend, then know what doesn’t sync
According to HubSpot’s documentation on campaign budgets, budget and spend from associated ad campaigns sync into the campaign automatically, and the sync can take up to 24 hours. The catch is that it doesn’t apply to ads with daily budgets. Only lifetime (Total) budgets come through. If your Meta or LinkedIn campaigns run on daily budgets, which most do, that spend never reaches the campaign. Either switch the campaigns that matter to lifetime budgets, or add a spend item manually on a fixed cadence. Pick one and write it down.
3. Add the non-ad costs by hand, on a schedule
Event fees, freelancers, and agency retainers won’t sync from anywhere. Assign one owner and a monthly close: spend items entered by the fifth business day, or they don’t count. This is the boring part, and it’s the part that makes the report believable.
4. Associate every asset, and audit the gaps
Every email, form, landing page, ad, and CTA that belongs to the campaign gets associated with it at creation, not in a cleanup sprint. Then build a saved report of live assets with no campaign. Anything on that list is spend you can’t trace. Pair it with your UTM rules, because tagging and association are two halves of the same job: utm_campaign tells the analytics who sent the visit, and the campaign record tells the CRM what it cost.
One limit to plan around. HubSpot notes that campaign attribution reports require Marketing Hub Professional or Enterprise, that deal and revenue reports are Enterprise only, and that the reports don’t include data from static lists or workflows. So they may not match the campaign’s Performance tab. Document which view is your source of truth before someone presents both in the same meeting.
What good looks like
A campaign with a budget, tracked spend, and every asset attached can answer three questions without a spreadsheet: what did it cost, what pipeline did it touch, and what’s left. Roll that up by quarter and you can compare a webinar series to a paid program on cost per opportunity instead of cost per click. Send the closed-won outcomes back to the platforms through offline conversions and the ad algorithms start optimizing for the same result your CFO does.
Skip it and you’ll do what most teams do: defend the budget with activity metrics, lose the ROI argument to whoever has a cleaner spreadsheet, and cut the programs that were working because nobody could prove it.
This is the data-model work behind every Marketing Operations & CRM engagement we run. Decide what a campaign is, enforce it at creation, and let the reporting sit on top.
Where to start
Export every campaign from the last twelve months. Count how many have a budget total, how many have any spend, and how many have more than three assets associated. That’s your campaign-cost coverage, and it is usually lower than anyone expects. Fix the top five campaigns by media spend first, backfill their actuals, and make the budget item a launch requirement from here on.