The most expensive line you cannot defend
Events are the largest discretionary line in most B2B marketing budgets and the one with the weakest number attached to it. Paid search has a click and email has an open. An event has a list somebody uploaded on the Tuesday after it happened.

Planning for 2027 has already started, and the mood is different from the last two years. Forrester's 2027 budget planning guides, released on 15 July, found that 91% of marketers expect their budgets to increase. I would not read that as good news for every line item. A bigger budget still gets divided, and the increase goes to whichever channels can put a number on the table that finance believes. The channels that cannot produce one end up funding the channels that can.

Budgets are going up in 2027. The argument is about where the increase goes. Source: Forrester, 15 Jul 2026
I have watched events lose that argument for twenty years. They look weak, and they look weak because of three problems that have nothing to do with whether the event worked.
Our customer success team put a number on the first of them on a call this month.
"I can tell you nine out of ten customers that I work with is the exact same thing that you're telling me. The reason they became a lead in MQL was because of the event, but the event wasn't recorded. They weren't uploaded into Salesforce until a week or two later, because of the list upload delay. So then you aren't seeing the true reality."
That figure comes from our own book of business, and it gives you a base rate before you check your own instance. If you are about to make a Q4 call on event performance, assume your number is wrong, and wrong in a predictable direction. The three problems below are clerical. Each takes an afternoon to fix and requires no opinion on attribution models.
Run this first

Open your last completed event campaign in Salesforce.
Note the campaign start date on the record.
Open the campaign members and sort by created date. Note the earliest one.
Compare that to the date the event actually happened.
If the member created dates cluster a week or more after the event, you have problem one, and your problem grows with the size of your event programme. Most people find the gap on the first campaign they open.
Problem 1. The record of the event arrives after the conversion it caused
Attribution runs in order. A touch earns credit if it happened before the funnel movement it is credited with. That rule is correct, and attribution would mean nothing without it.

Your event happened on the third and your list was uploaded on the seventeenth. Some of those people were already marked lead or MQL by the time the campaign membership existed, so the event touch is recorded after the conversion it caused and earns nothing. Whatever touched those people in the fortnight between collects the credit, usually a nurture email and sometimes paid search.
If you run Adobe's Marketo Measure, this behaviour is written down. It dates offline touchpoints from the Salesforce campaign date, and the campaign sync rules are in Adobe's own documentation. A campaign record created on upload day, against a list gathered two weeks earlier, moves the whole event's credit forward by two weeks, exactly as configured.
The customer on that call described his own operation:
"Event happens, list upload, several days afterwards or maybe a week after. It could be anywhere from ten to fifty people."
He had already worked out the fix himself, which is common with this one:
"I've dealt with that before where I have to offset stuff because of list uploads, and I'll say make a seven-day window or a ten-day window."
The detection test. For each event campaign, compare the attributed lead count against the campaign member count. A healthy event campaign attributes most of its members. If yours attributes a fifth of them, you are looking at the lag, and the conversion rate on that report tells you nothing about the event.
The fix, in order of effort. Set the campaign start date to the real event date before you upload the list. Where the list is already loaded, apply a date offset so the engagement date matches the campaign start date. Where your tooling will do neither, a seven to ten day look-back window on event campaigns recovers most of it.
The band to hold yourself to. The gap between the event date and the earliest member created date should be under forty-eight hours. Past a week, assume the credit has moved.

Problem 2. Your event campaign counts invitations
Most Salesforce event campaigns contain everyone invited, because that is how the list was built. The campaign member responded flag is what separates the people who turned up from the people who received an email about it.
Very few teams populate it consistently. When we asked a customer this month whether theirs was reliable, the answer was that they did not know. That is the answer at most companies and nothing to be embarrassed about, because the flag gets set at check-in by whoever ran the booth, usually through a badge scanner whose export probably nobody has reconciled.
Your campaign has a list of 400 invitees, but only 60 attended and this flag is missing. Because every rate uses 400 as the denominator, your conversion rate looks about seven times lower than it really is, while your cost per attendee looks about seven times cheaper.
That makes the event look both ineffective and cheap, the worst combination heading into budget season. A programme that seems cheap but doesn't work is an easy target for cuts.
The detection test. Filter your last three event campaigns on responded equals true. If the count is zero or close to zero, nobody has set the flag.
The fix. Decide who owns setting it, at the event, on the day. Then report invitations and attendance as two separate numbers. An event with 400 invited and sixty attended is a legitimate result. An event with 400 members and no attendance data gives finance nothing to evaluate.
Problem 3. Your one-day event's cost is spread across a quarter
This one is the least known and the easiest to fix.
Salesforce stores a campaign's total cost with no daily figure, so any system that places cost on a timeline has to spread it. The standard approach divides the total evenly across every day between the campaign's start and end dates, which is the right behaviour for a programme that really does run for several weeks.
Now take a one-day event whose campaign record was opened in July and left open until October. Your Q3 report carries only a fraction of what you spent, so the event looks cheaper than it was and its return looks better than it was. If the dates straddle a quarter boundary, part of the cost sits in a quarter where the event did not happen.
An operations lead caught this live on a call this month and got to the right answer before we did:
"For our uses, we would not want to break up the cost between quarters like that, because it's a one-time cost. So we would run a year look at this so that it wouldn't break across quarters."
The detection test. List every campaign whose date range is longer than the period in which the money was actually spent. The list is usually short and dominated by your biggest events, because big events are the ones whose records stay open longest.
The fix. Set the start date equal to the end date on one-day events. For programmes already closed, run event ROI on an all-time view instead of per quarter, so the full cost sits against the full return.
The prompt

You do not need a vendor to run this audit. Two exports and one prompt will do it, and the output is a table you can take into a planning meeting.
Export one. Campaign members for your event campaigns. Columns: campaign_id, campaign_name, campaign_start_date, campaign_end_date, campaign_actual_cost, member_id, member_created_date, member_responded.
Export two. Opportunities for the same period. Columns: opportunity_id, contact_or_lead_id, created_date, amount, stage.
Then paste this, with both files attached, into whichever assistant your company has approved.
You are auditing event attribution in a B2B marketing dataset.
I have attached two CSVs: campaign members and opportunities.
For every campaign in file 1, produce one row with these columns:
1. Campaign name
2. Campaign start date
3. Earliest member created date
4. UPLOAD LAG = days between column 2 and column 3
5. Member count
6. Responded count (member_responded = TRUE)
7. RESPONDED RATE = column 6 / column 5
8. Campaign date range = end date minus start date, plus 1, in days
9. Actual cost
10. COST PER DAY OF RANGE = column 9 / column 8
11. Opportunities where any member appears (match member_id to contact_or_lead_id), created after the campaign start date
12. Pipeline amount from column 11
Then flag every campaign that meets any of these conditions, and say which condition it hit:
FLAG A Upload lag greater than 2 days
FLAG B Responded rate is 0, or exactly 1.00, or null
FLAG C Date range greater than 7 days while cost is a single one-time amount
FLAG D Member count is more than 3x the number of members that appear on any opportunity
Sort the output by column 12 descending, so the largest programmes appear first.
Then write three sentences: which single campaign has the most pipeline at risk from a flag, what the flag is, and what a person should change in Salesforce to fix it.
Do not estimate or infer any value that is not in the files.
Where a column cannot be computed, write UNAVAILABLE and say why.Keep that last instruction even if you trim everything else. When people run this kind of audit through a language model, the usual failure is a confident number computed from a column that was never in the file. Telling it to write UNAVAILABLE gives you an audit you can defend in the meeting without re-checking every cell first.
Run it on one quarter first. The top three rows usually tell you most of what you need.
What to publish afterwards
Once these three problems are corrected, restate the event line so finance can read it. It should look something like this:
EVENT PROGRAMME, Q3 FY26
Invited: 1,240. Attended: 310. Always two different numbers, never blended.
Cost: $412,000. Booked against the event dates, instead of spread across however long the campaign record stayed open.
Attribution window applied: campaign start date, plus a 7-day upload allowance. State this. The whole line depends on this one assumption, and it is invisible on every event report I have seen.
Pipeline from attendees, opportunities created within 90 days: $3.1M.
Known gaps: two regional events have no responded flag and are reported on invitation counts. Disclose them. A number with a named gap survives scrutiny. A number without one gets discounted entirely the first time somebody finds the gap you did not mention.
The values above are illustrative. The third line does the most work - it moves the conversation away from whether events work and onto whether a seven day window is reasonable, and that is an argument you can win with a date field.
Why you should care about it now, before January hits
Belief in marketing's numbers is low going into this planning cycle, and people inside marketing are saying why: Validity's State of CRM Data Management report, released on 25 August, surveyed 500 marketing professionals, and 67% of the C-suite respondents admitted that campaign data is, at times, manipulated to make results look better to leadership.
Finance does not need to read that report to act on it. Every marketing number arriving in a 2027 planning meeting gets discounted before anyone asks about method, and events - carrying the weakest number, get discounted the most.
Events are unusual here. Two of the three issues make the event look worse than it really is. Fixing them can make the numbers higher and more credible, as long as you clearly state the time period you used. Instead of defending the event based on belief, event owners can bring a corrected number with the assumptions clearly shown. That makes a much stronger case during planning.
There is one more reason not to wait. In the same survey, two out of three organisations said they had increased the number of marketing decisions delegated to autonomous AI agents in the past year. Those agents read the same campaign members, dates and flags as you do. A person looking at a fortnight-late timestamp might remember the upload. An agent will take it as the day the event happened, and whatever it recommends next is built on that date.
Fix the dates. Everything downstream inherits them.
If someone on your team owns marketing operations, send them the two-minute test at the top. They can run it before your next planning conversation, and the answer comes back either reassuring or urgent.
Reply with your upload lag in days and I will tell you where it sits against the others I have seen.
The Moneyball CMO goes out weekly to marketing leaders who have been disappointed by at least one attribution tool. Every issue takes one measurement problem I have watched a customer hit, and hands over the report, the formula or the field to check.
Read by teams at Zscaler, Glean, Abnormal Security and Ncontracts. Subscribe at the-moneyball-cmo.beehiiv.com/subscribe.
P.S. Event attribution is one of the recurring problems we get in RevSure. The three problems in this issue are what you fix manually this week. RevSure is what you put in place so you never have to do it manually again. Book fifteen minutes here.
