Campaign Member
A Campaign Member is the junction record that links a Lead or Contact to a Campaign in Salesforce.
Definition
A Campaign Member is the junction record that links a Lead or Contact to a Campaign in Salesforce. The record captures who the person is, which campaign they touched, what their current Member Status is (Sent, Responded, Registered, Attended), and the Response Date when status flipped to a responded state. Every interaction between a person and a marketing program lives in one of these rows.
CampaignMember is a standard junction object, but it is shaped differently from a normal junction. It carries fields from both parent records (Lead/Contact and Campaign) plus its own status, response, and date fields. It is the data source for Campaign Influence, Campaign Hierarchy rollup counts, and most marketing reports. Without Campaign Members, a Salesforce Campaign is just a label with a cost field.
How Campaign Members turn a Campaign record into a measurable marketing program
Member Status values and the Responded flag
Each Campaign defines its own Member Status picklist. Status values map to a Has Responded boolean. Sent and Skipped are typically not responded; Registered, Attended, and Responded are. The Has Responded flag is what drives the campaign's Total Responses number and any influenced-revenue calculation. A common mistake is leaving the default status set as Sent so members technically count as touched but never as responded, which silently zeros out the campaign's measurable impact.
The Lead vs Contact split inside one object
CampaignMember can point at either a Lead or a Contact, not both at once. The record has LeadId and ContactId fields, one populated, one null. When a Lead converts to a Contact via Lead Conversion, Salesforce automatically updates every existing CampaignMember row for that Lead to point at the new Contact instead, preserving the campaign history. This is one of the few cases where Salesforce moves child records across parents without losing the audit trail.
How Campaign Member counts feed hierarchy rollups
Campaign.NumberOfContacts, Campaign.NumberOfLeads, and Campaign.NumberOfResponses are system-maintained fields that count rows in CampaignMember filtered by IsResponded and the parent type. The hierarchy fields (Total Members in Hierarchy, Total Responses in Hierarchy) aggregate these counts across descendant campaigns. The rollup is async; mass member updates can take a few minutes to reflect in the parent counts.
Bulk loading members via the wizard versus Data Loader
The Manage Members wizard from a Campaign record lets you add up to 50,000 members at a time using a report or a CSV. For larger volumes, Data Loader against CampaignMember directly is faster, but requires the right combination of CampaignId plus either LeadId or ContactId. The wizard handles deduplication; Data Loader does not. Inserting the same person twice into the same campaign throws a duplicate-value error on the (CampaignId, LeadId) or (CampaignId, ContactId) unique constraint.
Campaign Member Statuses are per-Campaign
The Member Status picklist is not org-wide. Each campaign has its own set of status values, configured on the Campaign Member Statuses related list of the campaign record. This means a Webinar campaign can use Registered, Attended, No-Show, Followed Up, while a Trade Show campaign uses Visited Booth, Scanned, Qualified. You can copy status definitions from one campaign to another via the Set Up Statuses link, but you cannot define a global default outside of process automation.
Reporting on Campaign Members across campaigns
The Campaigns with Campaign Members report type joins Campaign to CampaignMember and lets you filter by Member Status, Has Responded, and Response Date. To see a single contact''s campaign history across the entire org, use the Campaign History related list on the Lead or Contact, or build a report grouped by Contact ID. Marketing analytics tools usually flatten this via CampaignMember exports because the standard report type lacks Account-level fields.
The CampaignMemberStatus object for automation
CampaignMemberStatus is a separate object that holds the picklist values per campaign. Flow and Apex can create or modify status values programmatically, which is how marketing automation platforms (Pardot, Marketo) sync their own status taxonomies into Salesforce. The default record (Sent, Responded) is created automatically on every new campaign; replacing it with a custom set is a deploy-time operation, not a one-click toggle.
Adding members to a Campaign and configuring Member Status
Adding Campaign Members is how a Campaign gets its data. You add members one at a time from the Lead or Contact, in bulk from a report or CSV, or programmatically via flow or API. Member Status values have to be set up before adding members or every row defaults to Sent.
- Define the Member Status picklist
From the Campaign record, click Campaign Member Statuses on the related list and add the statuses that match the campaign type. Webinar campaigns typically use Invited, Registered, Attended, No-Show. Mark exactly one as Default and any that count as engagement as Has Responded.
- Add members from a report
Campaign record, Manage Members dropdown, Add Members From Report. Pick a tabular Leads or Contacts report and a starting Member Status. Salesforce inserts up to 50,000 CampaignMember rows in one batch. Reports must include the standard Lead or Contact ID field for the join to work.
- Add members from a CSV
Campaign record, Manage Members, Add Members From File. Upload a CSV with email or external ID, map to Lead or Contact, set the starting status. Salesforce matches existing records first, then optionally creates new Leads for unmatched rows.
- Update status on existing members
From the Campaign Members related list, select rows and click Update Status. The bulk update writes the new status and stamps Response Date if Has Responded is true. Use this after every webinar or event to flip Registered to Attended.
- Add members programmatically
Flow has a Create Records element with CampaignMember as the object. Set CampaignId plus either LeadId or ContactId, plus Status. Bulk patterns use the Update Campaign Member Status action from marketing automation packages.
The parent Campaign record. Cannot be changed after creation; reparenting requires delete and recreate.
Exactly one of these. Populating both raises a validation error. Lead converts to Contact migrate the LeadId reference to ContactId automatically.
Picklist value from the Campaign's Member Status set. Defaults to the campaign's marked-as-default status if not specified at insert.
Derived from the Status value's Has Responded flag. Not directly writable; controlled by the chosen Status.
- A person cannot be a Campaign Member as both a Lead and a Contact on the same Campaign. Convert the Lead first or pick one path.
- Member Status picklists are per-Campaign, not org-wide. Adding members to a new campaign without first configuring statuses lands every row in Sent.
- Campaign.NumberOfResponses lags member-status edits by a few minutes due to async rollup. Refreshing the page does not force recalculation.
- Adding the same Lead to the same Campaign twice raises a duplicate-key error. Use the wizard for dedupe; Data Loader expects unique pairs upfront.
- Campaign Influence records are not created automatically when a member becomes an Opportunity Contact Role. Customizable Campaign Influence has its own attribution logic.
Trust & references
Cross-checked against the following references.
- Campaign Members OverviewSalesforce Help
- CampaignMember Object ReferenceSalesforce Developer Docs
Straight from the source - Salesforce's reference material on Campaign Member.
- Add Campaign Members from a ReportSalesforce Help
- Set Up Campaign Member StatusesSalesforce Help
About the Author
Dipojjal Chakrabarti is a B2C Solution Architect with 29 Salesforce certifications and over 13 years in the Salesforce ecosystem. He runs salesforcedictionary.com to help admins, developers, architects, and cert/interview candidates sharpen their fundamentals. More about Dipojjal.
Test your knowledge
Q1. What is a Campaign Member?
Q2. What does the Status field on a Campaign Member track?
Q3. Can a person be a Campaign Member of multiple campaigns?
Discussion
Loading discussion…