Peer-to-peer fundraising campaigns introduce a data complexity that most nonprofits underestimate when they launch their first campaign. The organization is not just collecting donations directly. It is managing a participant layer, the individual fundraisers who register, recruit their networks, and collect gifts on the organization’s behalf, whose data needs to be tracked separately from the donors they bring in.
Getting that structure right in Salesforce NPSP, and building the form workflows that feed it, is the difference between a P2P campaign that produces clean, actionable data and one that creates a reconciliation problem the development team spends weeks cleaning up after the campaign closes.
Understanding the P2P Data Model
A peer-to-peer campaign involves at least three distinct data entities that need to be tracked separately and related to each other in Salesforce.
The campaign participant is the individual who registers to fundraise on behalf of the organization. They have their own Contact record, their own fundraising goal, and a relationship to the campaign they are participating in. In Salesforce NPSP, participants are typically tracked as Campaign Members with a custom record type distinguishing them from donors.
The team is an optional but common structure in P2P campaigns where participants recruit sub-groups. Teams have their own aggregate goals, their own leaders, and a relationship to both the parent campaign and the individual participants within them. Team structures in Salesforce require a custom object or a parent Campaign record type depending on how complex the campaign hierarchy is.
The donor is the individual who gives in response to a participant’s fundraising. Donors have their own Contact records and their gift creates an Opportunity record linked to the campaign. The critical relationship to track is the connection between a specific donation and the participant who solicited it, which is what makes participant-level fundraising reporting possible.
Building the Fundraiser Registration Form
The fundraiser registration form is the entry point for campaign participants and the form that creates or updates the most Salesforce records in a single submission.
At minimum, a participant registration form needs to create a Contact record for the participant if one does not already exist, create a Campaign Member record linking the participant to the campaign with the correct record type, capture the participant’s fundraising goal and record it on the Campaign Member, and optionally create or join a Team record if the campaign uses team structures.
Duplicate Contact handling is critical in P2P campaigns, where participants may be existing donors, volunteers, or staff who already have Salesforce records. The registration connector should match on email address before creating a new Contact, and the matching logic should be tested explicitly with scenarios where the registrant’s name differs slightly from their existing record (a common occurrence with maiden names, nicknames, and name abbreviations).
For campaigns with team formation, the registration form should allow participants to create a new team or join an existing one. Creating a new team generates a team record in Salesforce; joining an existing team requires a lookup or selection mechanism that connects the participant to the right team record. Dropdown selections populated from existing team records, or a team join code approach, are both workable depending on campaign structure.

Collecting Sponsor and Donor Data
The donor-facing giving form in a P2P campaign needs to capture not just the donation itself but the connection between the donation and the specific participant who solicited it. Without that connection, the development team cannot produce participant-level fundraising reports, and participants cannot see their own fundraising progress in real time.
The most reliable way to track participant attribution is through a parameterized URL. Each participant’s personal fundraising page or sharing link includes a unique identifier (typically the participant’s Campaign Member record ID or a custom tracking code) that is passed to the giving form as a hidden field. When the donor submits the form, the hidden field value writes to the Opportunity record as the referring participant, creating the attribution link.
FormAssembly supports URL parameter capture through hidden fields that pre-populate from query string values. Building participant attribution into the form architecture from the start is significantly easier than trying to reconstruct attribution from incomplete data after the campaign closes.
Payment Processing in P2P Campaigns
P2P campaigns that process payments through FormAssembly forms need to confirm that the payment processing configuration satisfies both the organization’s financial controls and PCI DSS requirements. Credit card data collected through web forms must be handled by a PCI-certified payment processor, and the form platform must not store raw card numbers at any point in the transaction.
FormAssembly’s payment connector integrations with Stripe, PayPal, and other processors handle card data within the processor’s PCI-certified environment, which means card numbers do not pass through or reside in FormAssembly’s infrastructure. The form collects payment intent and donor information; the processor handles the actual card transaction and returns a tokenized confirmation that can be stored safely with the donation record.
For campaigns accepting both online donations and offline gifts (checks, cash collected at events), the Salesforce Opportunity model accommodates both. Online gifts create Opportunities automatically through the form connector. Offline gifts can be entered manually by staff with the campaign relationship and participant attribution set the same way. Consolidated campaign reporting then shows total fundraising across both channels.
Post-Campaign Data Reconciliation
The period immediately after a P2P campaign closes is when the data quality of the collection workflow becomes visible. Campaigns with clean Salesforce data reconcile quickly. Campaigns with attribution gaps, duplicate Contact records, or missing team relationships take significantly longer to close out.
Building a reconciliation checklist into the campaign closeout process makes this work more systematic. Check for duplicate Contact records created by the registration form and merge them before finalizing campaign totals. Verify that all Opportunity records have the correct Campaign attribution and participant attribution. Confirm that team-level aggregates in Salesforce match the campaign platform’s team totals. Run a final check on Campaign Member records to confirm that all registered participants have the correct gift totals attributed to their fundraising.
The investment in getting the data structure right before and during the campaign is what makes that reconciliation fast. A P2P campaign that produces clean Salesforce data closes out in hours rather than days and positions the organization to use that data for participant re-engagement in the next campaign cycle.
Transform data collection for your nonprofit with a helping hand from FormAssembly.
Book a personalized demo