
Hidden Fields vs Salesforce UTM Touchpoints: Where DIY Tracking Breaks
June 9, 2026
Build vs Buy UTM Attribution in Salesforce: Cost, Risk, and Maintenance at 12 Months
July 5, 2026Campaign Influence QA Checklist: 12 Failure Tests Before You Trust the Dashboard
A Campaign Influence dashboard can look completely fine at first glance.
It loads quickly, the charts are clean. The numbers "feel" reasonable, you can even get a headline metric... like influenced pipeline... and drop it straight into a QBR slide without thinking twice.
And then, inevitably, someone from leadership looks at it and says:
There's no way that channel influenced that much/little revenue.
Now you are explaining attribution logic on the spot, trying to defend numbers you assumed were solid.
That is the real problem with Campaign Influence reporting. A dashboard can look polished long before its actually trustworthy.
Campaign Influence is a downstream rollup. It depends on everything underneath it working correctly:
- CampaignMember records
- OpportunityContactRole records
- Member timing
- Model windows
- Campaign Hierarchy
- Channel Taxonomy
If any one of those is slightly off, the dashboard can still render perfectly, and still be wrong.
This post walks through a 12-test QA checklist you can run before putting a Campaign Influence dashboard in front of leadership. The tests move from the data layer up, because that is usually where issues start to show.
Why Dashboards Pass Visual Checks but Fail Decision Quality
A clean dashboard answers one question: "Does it render?"
That's not the same as: "Can I defend this number when someone who knows the campaigns tries to poke holes in it?"
Most Campaign Influence issues fall into four buckets:
- Integrity gaps - the records influence depends on are missing or incomplete.
- Timing gaps - the right records exist, but landed outside the window where the model counts
- Model artifacts - the math is running, but is distorted by outliers or configuration choices.
- Rollup and channel distortion - the same deal gets counted multiple times, or a channel reads as zero because the plumbing is broken.
A good QA pass does not assume a chart is reliable because is loaded. It tests the path behind the number.
Data Integrity Tests
Start with the foundation. If these fail, the dashboard built on them is not trustworthy.
Our (free) Campaign Influence Accelerator's Troubleshooting dashboard surfaces a lot of the same signal out of the box...more on that later.
Test 1: Campaign Members Actually Connect to Deals Through OCRs
Campaign Influence flows from a Campaign's engagement to Opportunities through Opportunity Contact Roles. If a Campaign's members (Contacts) are not Contact Roles on an Opportunity, there's no path to the revenue that was influenced. No matter how good the campaign was.
Start by looking at which Opportunities a Campaign's members are actually attached to. Drop a campaign name into the query below:
SELECT OpportunityId, Opportunity.Name, Opportunity.Amount, ContactId, Contact.Name FROM OpportunityContactRole WHERE ContactId IN ( SELECT ContactId FROM CampaignMember WHERE Campaign.Name = 'Q2 Webinar Series' ) ORDER BY Opportunity.Amount DESC
Your results will include Opportunities (and amounts) that can receive influence from that Campaign because their Contacts are both CampaignMembers and OpportunityContactRoles.
If the list is much shorter than expected, OCR coverage is the constraint...not campaign performance.
Test 2: CampaignMembers without an OCR
Now let's flip that question around. Which campaign members engaged, but have no path to influence any opportunity?
Use the query below, put in a Campaign name and find members with no OCR anywhere.
SELECT Id, ContactId, Contact.Name, Campaign.Name, Campaign.Type
FROM CampaignMember
WHERE Campaign.Name = 'Q2 Webinar Series'
AND ContactId != null
AND ContactId NOT IN (
SELECT ContactId
FROM OpportunityContactRole
)
You can also swap the Campaign.Name = 'Q2 Webinar Series' for Campaign.Type = 'Webinar' if you want to broaden your results.
A large result here is one of the most common reasons a real campaign shows little or no influence. The engagement happened, but the contact roles needed to carry it did not.
Also note the ContactId != null filter. A Campaign Member can be a Lead or a Contact. Lead members will not pass influence until they convert. This query intentionally focuses on Contact members, because OCRs require Contacts.
Test 3: The Model Window Matches your Real Sales Cycle
In Salesforce, look at your Auto-Association Settings (in Setup). Compare the Campaign Member Influence Time Frame against your actual sales cycle.
A useful rule of thumb is to set the window to roughly 1.5x - 2x your average sales cycle length. Why?
Early-but-legitimate touches still need room to count.
A 90-day window on a six-month buying cycle will quickly exclude top-of-funnel influence. Nothing breaks, no error messages. The dashboard just drifts away from reality.
Test 4: You Are Reporting Influenced Amount, not Opportunity Amount
Be very deliberate about which number is going into the slide.
There's a difference between Opportunity Amount and model-weighted Influenced Amount from CampaignInfluence.
Under a multi-touch model, if you were to sum up the Opportunity Amount across campaigns, you likely would be double-counting (or triple, or worse) your revenue. The same deal can show up in multiple campaigns.
That is the point of the calculated influenced amount. Each Campaign Influence record carries its weighted share, so the shares can all roll back up with multiplying.
Sanity-check the total against actual pipeline and closed-won. If influenced pipeline wildly exceeds what the opportunities could support, you are probably summing the wrong field.
Timing Tests
The right records can exist and still be invisible to the model. Timing is where a lot of the "data is wrong" conversations come from.
Test 5: CampaignMember CreatedDate Falls Inside the Influence Window
Influence Models care about when the Campaign Member was created relative to the Opportunity...not just that it exists.
Sample a few Opportunities and compare CampaignMember's CreatedDate against the Opportunity timeline and the model window.
If the CampaignMember was created outside the window, the engagement may be real but it contributes nothing to the number. That's a painful failure mode because the data looks present.
Test 6: Late Member Creation and Backfills are not Dropping Credit
Imports, delayed integration syncs, and backlog jobs often create CampaignMembers well after the actual engagement happened. That can quickly wipe out influence.
Look for CampaignMembers with CreatedDate clustered around import dates instead of spread across real engagement dates. That pattern usually means you are looking at operational timing (the import), not marketing timing.
If you need to import historical CampaignMember records, make sure you have the Salesforce permission to Set Audit Fields upon Record Creation and make sure your import is setting the CreatedDate of when the engagement happened.
You may need to delete and re-import them to correct timing.
Test 7: Dashboard Date Filters Match the Attribution Date Logic
Sometimes the influence data is fine, it's your dashboard filters.
Confirm whether each dashboard component is filtering on:
- Opportunity Close Date
- Opportunity Created Date
- Campaign Date
- CampaignMember Created Date
- Influence Record's Dates
Then compare that against what the audience thinks they are seeing. A close-date-filtered component can look empty for recent activity because nothing has closed yet. That's not missing influence...it's just a date logic mismatch.
Model Sanity Tests
Now that records and timing have been checked, lets look at the shape of the model output.
The question here isn't whether every model agrees...they shouldn't. It's whether the difference makes sense.
Test 8: First, Last, Even, and Primary Models Tell a Consistent Story
Run the same period through multiple models side-by-side. (our accelerator has a dashboard you can start from)
You should expect to see differences, that's the point of model comparison. But you shouldn't expect one model to produce a wildly different ranking that no one can explain.
A single-model outlier often points to a data issue. For example:
- Missing early touchpoints can inflate last-touch
- Missing late touchpoints can inflate first-touch
- Missing OCRs can make everything look smaller than it should
- Overbroad campaign membership can make one campaign look wildly more important/successful than it really is
Model comparison isn't just an attribution strategy exercise (or looking at pretty charts). It's a data quality test.
Test 9: No Single Campaign Holds an Implausible Share of Credit
Sort your campaigns by influenced amount and look at the top.
A single campaign holding an outsized share of total influence is often a symptom, not a win. It might be:
- A catch-all campaign
- A newsletter list
- An automation that adds everyone as a member
- A campaign type that is too broad
- A hierarchy rollup being interpreted incorrectly
If the top campaign's share doesn't match operational reality, inspect the membership before celebrating it. The fix usually lives upstream.
For a catch-all campaign, tighten your Auto-Association Settings. Narrow the included Campaign Types, or use rule criteria to exclude the campaign so it stops absorbing influence on every deal.
Test 10: Closed-Won Influence Ties Back to Known Deals
Pick a handful of recent closed-won deals you personally understand, then trace them through the dashboard. See if the assigned influence matches what really happened.
This is one of the most convincing tests you can run. If the dashboard contradicts the deals you know, what's it doing to the deals you don't?
Hierarchy and Channel Tests
The last layer is the one leadership usually reads first. Channels, Campaign groups, Hierarchy rollups. This is also where clean-looking numbers can get very misleading.
Test 11: Campaign Hierarchy Is Not Counting the Same Deal Twice
Campaign hierarchy can be useful, and it can also overstate influence if you aren't careful.
When the same opportunity is influenced by both a parent campaign and one or more child campaigns, a hierarchy rollup can count that deal at multiple levels.
Find opportunities credited more than once within a single hierarchy:
SELECT OpportunityId, Opportunity.Name, COUNT(Id) influenceRecords FROM CampaignInfluence WHERE CampaignId = '701000000000000AAA' OR Campaign.ParentId = '701000000000000AAA' OR Campaign.Parent.ParentId = '701000000000000AAA' GROUP BY OpportunityId, Opportunity.Name HAVING COUNT(Id) > 1 ORDER BY COUNT(Id) DESC
Replace the Id in the query with the parent campaign's record Id.
Multiple influence records per opportunity can be normal in a multi-touch model...that's not the issue we are chasing here.
The issue is whether your hierarchy-level rollup is adding parent and child credit together in a way that overstates the total.
Decide what you are reporting:
- Leaf-level campaigns (no children)
- Parent-level campaigns
- Both, but clearly separated
Just don't add them together and call it a clean number.
Test 12: Zero-Influence Channels Are Actually Zero, Not Broken Matching
A channel / campaign showing zero influence is not just a number...it is a claim. Before you call it underperforming, verify that it truly drove nothing.
Check:
- Members matched to the right campaigns
- Members converted from Leads to Contacts
- Contacts were added to OCRs
- Member timing fell inside the model window
- Campaign Types were included in auto-association
- Dashboard filters are not excluding the data
"Zero because nothing worked" and "zero because the plumbing is broken" look identical on a dashboard, but you can tell them apart with some QA.
A Monthly Cadence with Named Owner
A one-time QA pass fixes today's deck. A cadence keeps the dashboard trustworthy as everything else around us continually changes.
A practical monthly rhythm:
- Quarterly: run the 12 tests against the dashboards leaderships will see.
- Assign a single owner (not a team) for influence data quality. Not just the person who builds charts, someone accountable for OCR coverage, member timing, campaign structure and attribution readiness.
- Keep a short log of what failed and what was fixed. Recurring failures usually point to an upstream process gap
- Watch a few "should be zero" signals, like opportunities with influence but no members, members created far outside the window, and top campaigns with unrealistic share.
The goal isn't perfect attribution, it's to be able to walk into a pipeline review already knowing where the soft spots are. That's a better place to be than discovering them after being challenged.
Where the Campaign Influence Accelerator Fits
The Campaign Influence Accelerator is a free unmanaged package with ready-to-edit reports and dashboards to give this work a head start.
It includes:
- Model Comparison: puts First, Last, Even Touch, and Primary Source side by side, which helps with Test 8.
- Troubleshooting: surfaces the kinds of integrity and timing gaps behind Tests 1, 2, 5 and 6
- Example Dashboard: gives you a starting point you can edit instead of building from a blank canvas.
The dashboards do not replace the checklist, they just make it faster to run. The QA discipline is still yours.




