Marketing ROI Measurement: Book the Spend Against the Campaign It Bought.
Ask a marketing team what the return was on last quarter's webinar series and you will usually get a number within the hour. Ask the finance team what the series cost and you will usually get a different number, and a question: which invoices do you mean?
That question is the whole problem with marketing ROI measurement, and it is not a modelling problem. The formula is a line long. Return minus cost, divided by cost. Everyone agrees on it. The trouble is that the cost half has no home in the books, so the formula cannot be run by anyone who has to defend the answer.
A general ledger is organised by account and vendor. Advertising is one account. Software is another. A contractor who wrote the webinar scripts is a vendor, paid against a professional-services account, and the same contractor may also have written an email sequence, a case study and a landing page the same month. The invoice says "content services". Nothing on it says which campaign it belongs to.
Spend on the ad platforms is worse in one way and better in another. The platform knows exactly which campaign each dollar went to. The ledger knows only that a card was charged, usually in arrears, sometimes on a threshold that has nothing to do with the month. So the platform's report and the ledger agree on the year and disagree on every month inside it.
Put those together and a marketing leader who wants cost per campaign has three choices. Rebuild it by hand from invoices each quarter, which is slow and gets argued with. Use the platform's spend figure for ads and a guess for everything else, which is fast and overstates the return. Or give up and report activity. All three leave the CFO with the same view: marketing reports a return the books cannot confirm. An agency's monthly report makes it sharper, because it shows the spend the agency controls and leaves out the rest, as we set out in the report that hides the number the CFO wants.
The cost is not a wrong number. It is a number nobody with budget authority will rely on. A return calculated from media spend alone looks excellent, because content, tooling and agency fees are left out, and finance knows they were spent. The first time someone adds them back in, the return halves, and every earlier figure is now in doubt, including the ones that were right.
There is a second cost, quieter. Without a campaign on the bill line, the decision to stop a campaign cannot be made from the books. You can stop a vendor. You cannot stop a campaign, because nobody can say what it is still costing. Spend that should have ended continues for months under a vendor name no one is looking at.
The repair is a campaign code, one short identifier, carried as a dimension on every bill line. Most ledgers already have a place for it: a class, a tracking category, a project or a department. The rule that makes it work is about timing, and it is where most attempts fail.
The code is assigned when the spend is committed, not when the invoice arrives. A purchase order, a contractor's statement of work and an ad-platform budget each get the code the day they are approved. If the code is added at invoice time, by whoever happens to be coding invoices, it will be wrong in a predictable way: the bill gets coded to the campaign the coder remembers, which is the loudest one.
The same code has to exist on the other side. It is the campaign identifier the CRM stamps on a lead, the one the links carry, the one the ad platform's campaign name begins with. When one string appears in the ledger, in the ad account and in the CRM, the join is a lookup. When three teams each keep their own naming, the join is a spreadsheet, and the spreadsheet is the thing finance will not trust.
We have written about the pipeline half of this in the one table a CFO will trust: fields on the lead and a status a person sets. This is the other half. Attribution tells you which campaign a dollar of pipeline came from. The booking rule tells you which campaign a dollar of cost came from. Neither is useful alone.
One code per campaign, issued once. Someone owns the list. A new campaign gets a code before it gets a budget. Retired codes stay in the list so old bills still make sense.
Shared costs are allocated by a written rule, not by judgement. An agency retainer, a marketing platform subscription and a designer's time serve several campaigns. Pick the allocation basis, usually share of media spend or share of leads, write it down, apply it every month. The number is no longer arguable once the rule is, because the argument moves from the number to the rule, once.
Accrue the ad spend. Platforms bill after the fact. Book the month's platform-reported spend as an accrual against the campaign code, and true it up when the invoice lands. That makes monthly cost per campaign available in the first week of the next month instead of the sixth week.
Reconcile the platform to the ledger every month, to a tolerance. Pick a tolerance, say two percent, and report the gap. A gap inside it is noise. A gap outside it is a campaign coded to the wrong code, or spend that skipped the purchase order, and both are worth finding in the month they happen.
With those four rules, the question "what did the webinar series cost" has an answer that comes from the books, can be reproduced by finance, and arrives in the first week of the next month. The ROI number that follows is the number finance can defend, because the cost half is theirs.
What you give up is some freedom. A campaign cannot start before it has a code, and a contractor cannot be paid against "content services" without saying for what. Marketing teams push back on this for about a month and then notice that their budget requests are approved faster, because the request now shows what the money will be measured against.
Our role is to make the cost side a property of the system rather than a quarterly rebuild. In a discovery we read your ledger, your ad accounts and your CRM, and show which campaigns can be costed from the books today, which cannot, and what has to change for the rest. Discovery is no-risk: you pay only if you go ahead. The setup of the campaign code, the allocation rules and the monthly reconciliation carries a guaranteed estimate, so if we estimate low, we absorb the difference.
One test tells you whether it is working. Pick any campaign that ended two months ago and ask finance for its total cost, then ask marketing. If the two figures match to within the tolerance and the person asking never had to open a spreadsheet, the cost side holds. If they differ, the difference is the first thing to fix, and it will be one of four things: an uncoded bill, a shared cost with no rule, an accrual not trued up, or spend that never had a purchase order.
The measure of success is simple. When the CFO asks what a campaign cost, marketing answers from the same books, in the same week, with the same figure.
Watch the 6-minute guided demo, then book a walkthrough: we read your CRM, ad accounts and content and show what a governed system would do differently. You pay only if you proceed. Or see how we approach it.
More on the same problem:
"Something isn't working." "We're outgrowing our tools." "We're afraid to make the wrong move." No-Risk Discovery is a short, practical conversation that gets you clarity before you commit to anything big. We'll tell you if we're a fit. If we're not, we'll tell you that too.
Say who you are and ask. A person replies within one business day.