What is Three Degrees of Attribution in Salesforce? A B2B marketer's guide
Three Degrees of Attribution splits marketing's contribution to closed-won pipeline into Absolute, Direct, and Indirect tiers — so a CFO sees what marketing owns, what marketing co-owns, and what marketing influenced.
Three Degrees of Attribution in Salesforce is a framework for capturing the full marketing contribution to a closed-won opportunity — not just the campaign that was tagged as Primary Campaign Source, and not the diluted average that Campaign Influence produces by default. It splits credit into three explicit tiers — absolute, direct, and indirect — so a CFO can see how much of the pipeline marketing owns outright, how much marketing co-owns with sales, and how much marketing influenced without owning. This guide explains what each tier measures, how to compute it from the Salesforce + Account Engagement data model, and where most B2B teams get the math wrong.
Why "single-touch attribution" stopped working
The classic Salesforce pipeline-marketing report is built on one field: Opportunity.CampaignId, also called Primary Campaign Source (PCS). Sales sets it (or a workflow does), and every revenue dashboard rolls up against it.
PCS gives you exactly one campaign per opportunity. For 2014 marketing — one big-ticket trade show, one webinar, one demo request, deal closes — that was fine. The buyer touched marketing once before sales took over.
That isn't how B2B buying works in 2026. The average enterprise opportunity now touches eight to twelve marketing campaigns before close — a top-of-funnel ad, a gated whitepaper, a webinar registration, three nurture emails, an in-person event, an SDR follow-up sequence, a competitive comparison page view. Pinning revenue to a single one of those campaigns is no longer "attribution," it's a coin flip.
Salesforce's answer was the Campaign Influence object: any contact role on the opportunity, multiplied by their campaign memberships, gets a slice of the revenue. The maths uses one of three pre-built models (First Touch, Last Touch, Even) or a custom model. It works, but two problems make it a CFO's worst dashboard:
- The "Even" split dilutes everything. A campaign that genuinely drove the deal is treated identically to a campaign that one of the deal's contacts happened to attend two years ago.
- The reporting object is hostile.
CampaignInfluenceis a junction object with quirky permissions, soft caps, and a default 90-day attribution window that quietly drops contributions older than that. Most teams ship a dashboard that reads from it once and never realise half the influenced pipeline is invisible.
So the typical state is: PCS shows the marketing-attributed pipeline that's too narrow, Campaign Influence shows the marketing-attributed pipeline that's too noisy, and finance picks whichever number is more flattering for the quarter. That isn't a system; it's a guess.
What Three Degrees of Attribution actually measures
Three Degrees splits the question into three answers, computed against the same source-of-truth data but with different rules.
Degree 1: Absolute
Definition: revenue from opportunities where this campaign is the Primary Campaign Source (Opportunity.CampaignId = thisCampaign).
This is the marketing-owned pipeline. The lead came in through this campaign, sales picked it up, the opportunity was created, and PCS was set as part of the create flow. There is no shared credit and no inferred influence — the sales rep wrote the campaign name in the field.
You'd typically use Absolute to answer: "Which campaigns are sourcing pipeline?" It's the most defensible number when finance pushes back. It's also the smallest — usually 30–40% of the pipeline marketing actually touched.
Degree 2: Direct
Definition: Absolute, plus opportunities where one of the contact roles attended this campaign at a meaningful threshold (registered + attended, or downloaded gated content) within the attribution window.
This adds the cases where marketing was clearly part of the deal but wasn't the source. The buyer attended a webinar mid-cycle. The technical evaluator downloaded the whitepaper before the procurement decision. The CFO got the comparison-grid email two weeks before the renewal call.
Direct is the right answer to: "Did marketing touch this deal in a way that mattered?" It deliberately excludes the long tail of casual touches (single-pixel email opens, drive-by site visits, registrations without attendance) that bloat Even-split Campaign Influence numbers.
Degree 3: Indirect
Definition: Direct, plus opportunities where this campaign appeared anywhere in any contact role's campaign-member history during the attribution window — including registrations without attendance, light email engagement, and any CampaignMember where Status is Sent or higher.
This is the broadest measure. It's the answer to: "Did this campaign show up in the buying journey at all, even tangentially?"
Indirect is intentionally generous. It's what you use to evaluate awareness plays — display ads, top-of-funnel content, podcasts, sponsorship — that influence brand without producing a clean direct touch. A CFO won't fund the next display campaign on Indirect alone, but a CMO needs Indirect to defend the brand budget that produces it.
A worked example
A mid-market SaaS company runs four campaigns in Q2:
- Q2 Webinar — How to Forecast Pipeline (registered: 480, attended: 220)
- State of RevOps 2026 Whitepaper (downloads: 1,140)
- Display retargeting — Forecasting Buyers (impressions: 1.2M, click-throughs: 8,400)
- Outbound nurture — VP Finance (emails sent: 920, replied: 67)
Three months later, Salesforce closes 18 opportunities tagged to one of those campaigns. Three Degrees against the webinar:
| Count | Pipeline | ||
|---|---|---|---|
| Absolute (PCS) | 3 ops | $284k | $124k |
| Direct (PCS + attended + downloaded) | 9 ops | $1.04M | $410k |
| Indirect (any campaign membership) | 14 ops | $1.92M | $740k |
Three numbers, same campaign, same source data. The absolute number is what you bring to finance. The direct number is what marketing leadership reports to the board. The indirect number is what you use internally to argue for the next webinar.
Importantly: the three tiers are nested, not separate. Direct includes Absolute. Indirect includes Direct. There's no double-counting, and the largest number is always the broadest.
Computing it from the Salesforce data model
The three SOQL queries map directly to the three tiers. Each one assumes a 90-day attribution window — adjust to taste, but document the choice somewhere.
Absolute:
SELECT Id, Name, Amount, StageName
FROM Opportunity
WHERE CampaignId = :campaignId
AND CloseDate >= :windowStart
Direct:
SELECT Opportunity.Id, Opportunity.Amount, Opportunity.StageName
FROM OpportunityContactRole
WHERE Contact.Id IN (
SELECT ContactId FROM CampaignMember
WHERE CampaignId = :campaignId
AND Status IN ('Attended', 'Downloaded', 'Registered + Attended')
AND CreatedDate >= :windowStart
)
Then union with the Absolute set, deduping by Opportunity.Id.
Indirect:
SELECT Opportunity.Id, Opportunity.Amount, Opportunity.StageName
FROM OpportunityContactRole
WHERE Contact.Id IN (
SELECT ContactId FROM CampaignMember
WHERE CampaignId = :campaignId
AND CreatedDate >= :windowStart
)
Union with the Direct set, dedupe by Opportunity.Id. The only difference from Direct is the Status filter is removed.
Three things to watch out for in production:
- The 90-day window is a default, not a law. B2B sales cycles for $100k+ ACV deals are routinely 6–9 months. If you only count touches in the trailing 90 days you'll miss the whitepaper download from month one of a six-month evaluation. Lengthen the window for high-ACV motions, document the choice, and re-run historicals so the comparison is fair.
- CampaignMember Status values are workspace-specific. What counts as "attended" in your AE business unit might be
Attended,Registered + Attended,Joined Webinar, or something custom. The Direct query is only as good as your Status taxonomy. - Roll-up across campaign hierarchies. If a parent campaign has children (a "Q2 Demand Gen" parent with a webinar, a whitepaper, and a display set as children), the three queries should sum across the full subtree. Most teams forget this and report the parent's Absolute as zero because PCS is set on the children.
Where most teams get the math wrong
After working with several dozen MOps teams on attribution, the same five mistakes show up repeatedly:
- Confusing PCS with Direct. PCS is one field, set once per opportunity. Direct is a query that union-counts opportunities across multiple touchpoints. A team that only looks at PCS is reporting Absolute and calling it Direct.
- Missing PCS data on legacy accounts. Opportunities created before the team turned on PCS-required validation rules have a null
CampaignId. The fix is a back-fill: an audit that finds opportunities with null PCS but withCampaignMemberrecords on contact roles, and assigns the most-recent-pre-creation campaign as the inferred PCS. Manual at small scale, automated at large scale.
- Even-split everywhere. The default Campaign Influence model gives every campaign equal weight on a deal, so a passive newsletter signup gets the same credit as the demo request that started the conversation. Replace it with a model that weights touches by Status (registered + attended > downloaded > sent + opened > sent), or move to a Three Degrees view that doesn't try to apportion at all.
- Reporting Indirect as if it were Direct. The temptation is to pick the biggest number and pretend it's defensible. CFOs catch this on the first follow-up question. Always lead with Absolute, follow with Direct, footnote Indirect.
- Not connecting attribution back to campaign generation. The team computes the numbers, ships the dashboard, and then designs next quarter's campaigns from a fresh whiteboard with no reference to what worked. Attribution should feed back into the brief: which channels, which structural patterns, which audiences produced the highest Direct-to-Indirect ratio.
What this looks like in crm.care
crm.care computes all three tiers automatically against your live Salesforce + AE data and surfaces them on the campaign Results tab. The PCS audit catches the missing-data case from #2 above. The campaign-hierarchy roll-up handles parent + children correctly. And the predictive layer feeds Direct attribution back into next-campaign generation, so the team's compounding pattern of what works gets baked into the briefs over time.
The Three Degrees framework itself is platform-agnostic — you can build it in any BI tool with the SOQL above. The reason teams use crm.care is that the maths happens automatically against the same Salesforce data the rest of the company sees, computed the moment a campaign moves to in-progress, with no quarterly project to "rebuild attribution" because nobody can remember what the old dashboard was joining on.
For a deeper look at the surrounding pieces — how to structure your campaign hierarchy so the roll-up works, why your Pardot dashboard is hiding influenced pipeline, what to do when 30% of your opportunities have null PCS — see the features page, or read Why crm.care exists for the broader frame on AI-native marketing operations.
Ready to see it on your own pipeline? Free 7-day trial. Connects to Salesforce + AE in about 90 seconds. Three Degrees lights up the moment your first campaign hits in-progress.
Why crm.care exists
AI marketing tools today are either generic chat wrappers or platform-locked features. There's a gap in the middle: an AI-native operator that lives outside Salesforce but closes the loop into it. That's crm.care.
Read postcrm.care vs. Jasper for Salesforce-native marketing teams
Honest comparison of Jasper and crm.care for B2B teams running on Salesforce + Account Engagement. Jasper's editor is mature; crm.care closes the loop into AE and back from Salesforce. Different products for different bottlenecks.
Read postRun the loop yourself.
Free 7-day trial. Full feature set. No credit card. Ship a real campaign in 30 minutes.
Start free trial