Not verified hands-on. This article was written from primary documentation rather than reproduced in an org, so it carries no tested-release badge. If you run it and something differs, say so in the comments and it gets tested and corrected.

A Campaign is a container, a CampaignMember is a person’s relationship to it, and campaign influence is an attempt to credit revenue back to campaigns. The first two are solid. The third is a modelling exercise where Salesforce gives you the plumbing and you supply the opinion, so be honest about what your attribution numbers are actually measuring.

Campaigns and members

CampaignMember is a junction between a Campaign and either a Lead or a Contact, never both on the same record. It carries a Status and a HasResponded flag, and that flag is what every response statistic on the campaign counts.

Each campaign has its own member statuses, stored as CampaignMemberStatus records. New campaigns start with Sent and Responded. Per-campaign statuses are right for a webinar (Invited, Registered, Attended, No Show), and a nuisance at scale, because they are records rather than a shared picklist. Orgs with many campaigns build a few status templates and apply them at creation with a flow.

Be deliberate about which status carries the responded flag. Flagging both Registered and Attended means nobody reading the dashboard knows what the response rate counts.

When a lead converts, its CampaignMember record converts with it and now points at the Contact. History is preserved, which is one of the better bits of design in the conversion process.

The hierarchy

Campaign has a ParentId lookup to itself, supporting up to five levels. Use it the obvious way: a parent for the programme, children for the channels or waves.

The payoff is a set of hierarchy statistic fields that roll the whole tree up to whichever campaign you are looking at:

SELECT Id, Name, ParentId,
       NumberOfResponses, HierarchyNumberOfResponses,
       AmountWonOpportunities, HierarchyAmountWonOpportunities,
       ActualCost, HierarchyActualCost
FROM Campaign
WHERE ParentId = null

The Hierarchy fields cover the campaign plus all descendants. The plain fields are that campaign alone. Both on one report shows a marketing team what the programme did versus what one email did.

The cost fields are manual. ActualCost and BudgetedCost are typed in by a human, and an empty cost field means every return-on-investment figure downstream is wrong rather than blank. If you are going to report on ROI, make cost required.

Primary Campaign Source

Opportunity has a CampaignId field labelled Primary Campaign Source. It is a single lookup, so it is single-touch attribution by construction, and it is populated automatically only at lead conversion. Opportunities created from a contact, or by a rep working an account, get nothing unless someone sets it.

That is the honest baseline in most orgs: attribution exists for converted leads and is blank for everything else. Any dashboard built on Primary Campaign Source alone is reporting on the subset of the business that came through lead conversion.

Campaign influence

Customizable Campaign Influence adds the CampaignInfluence object, which lets many campaigns share credit on one opportunity with a percentage and an amount each. It ships with a Primary Campaign Source model that gives the primary campaign the full amount.

You can define further models. What Salesforce does not do is invent the maths for you: populating a first-touch, last-touch or even-split model means writing the records yourself with Apex, flow or an external tool, on a schedule or on opportunity creation. Auto-association rules can add campaigns to an opportunity where a contact role’s campaign membership falls inside a configured time frame, which handles the mechanical part and still leaves the weighting to you.

Two things to decide before you build any of it. How far back does a campaign touch count, because a nine-month window and a thirty-day window produce different winners. And does credit follow the contact roles on the opportunity or every campaign the account ever touched, because the second one credits everything and distinguishes nothing.

Being honest about attribution

Multi-touch attribution in a CRM measures the touches recorded in the CRM. It cannot see the conference conversation, the analyst report, or the colleague who recommended you. A model assigning one hundred per cent of revenue across the campaigns you happen to have logged will always look complete and never be.

Report influence as a ranking rather than a ledger. Which campaigns show up on won deals, and how often, is a defensible question. Which campaign generated the revenue is not.

Frequently asked

Why can a user not create campaigns? The Marketing User checkbox on the user record, separate from profile permissions.

Can one person be on a campaign twice? No, one CampaignMember per lead or contact per campaign.

Do campaign statistics update immediately? They are maintained by the platform and can lag after bulk member loads. Give them time before concluding the numbers are wrong.

Does influence work without contact roles? The auto-association path depends on them. An org that does not fill in opportunity contact roles gets nothing from influence.