Trade show leads belong in Salesforce within seconds of the scan, attached to the event Campaign as a Responded Campaign Member, with Lead Source and custom event fields populated. Most teams ship them as CSVs to RevOps a day or two later and bleed attribution doing it.
This post assumes you already know Salesforce. Skipping to dedup, Campaign Member mechanics, and where Primary Campaign Source actually lives.
How do you sync trade show leads to Salesforce in real time?
Push each scan into Salesforce via API within seconds, attribute it to the event Campaign, and write event fields at create. Skip the CSV step.
The structural failure is the CSV-at-end-of-day workflow. A booth captures 200 scans on Tuesday. The exhibit lead exports the file Wednesday, hands it to RevOps, who runs the Data Import Wizard Thursday. By Friday the Lead exists. Primary Campaign Source is usually blank, owner is whoever ran the import, and the scan timestamp is the import timestamp. Pipeline reporting now lies to you.
Real-time sync means each scan is a REST API call to Salesforce that lands a Lead (or matches to an existing Contact), adds the Campaign Member with status Responded, writes custom fields, and posts a notification, all before the rep walks away from the prospect. Tendro runs this end-to-end in under ten seconds. iCapture and Captello publish similar sync depth. Organizer rental scanners do not.
Should trade show scans become Salesforce Leads or Contacts?
Default to Lead. Use a matching rule so existing Contacts auto-convert. Hard rule of Contact-only breaks when the buyer is net-new.
This is the question RevOps actually argues about. The honest answer depends on your dedup config; the right default is Lead with auto-conversion.
At a trade show you do not know whether the badge belongs to an existing account, a known Contact, an unknown buyer at a known account, or a net-new logo. Treating every scan as a Lead and letting Salesforce's matching rule resolve to the existing Contact (or auto-convert) covers all four cases. Creating Contacts directly breaks the moment the buyer is net-new: orphan Contact, no Account, broken reports.
Recommended pattern: scanner creates a Lead with Lead Source set. Standard matching rule fires on email plus name. If a Contact match exists, the Lead auto-converts via Apex trigger or Flow and the existing Contact gets the new Campaign Member. If no match, the Lead routes to the assigned rep.
Either way, the Campaign Member record is the durable attribution. The Lead-versus-Contact debate matters less than getting the Campaign Member right.
How do you attribute trade-show leads to a Salesforce Campaign?
Add a Campaign Member with status Responded at scan time. On conversion the Opportunity's Primary Campaign Source picks that up for first-touch attribution.
Two records do the work: the Campaign Member junction on the Lead or Contact, and the Primary Campaign Source lookup on the resulting Opportunity.
Primary Campaign Source lives on the Opportunity object. It's a lookup to Campaign, populated when a Lead is converted with an Opportunity attached, or when an Opportunity is created from a Contact. Default behavior pulls the most recently associated Campaign on the record. Some teams customize via Flow to pick the most recent Campaign Member with Responded status only.
What the scanner controls is the Campaign Member. A scan at the booth is by definition a response (the buyer showed up at your booth). Salesforce convention for B2B field marketing is Campaign Member status Responded at create. That is what every standard Campaign Influence report keys off, and what flows downstream into the Opportunity attribution.
Common mistake: teams use status Sent or Registered, which fits invite or pre-show registration but is wrong for a booth scan. The Responded count is what your CMO sees on the post-event dashboard. The other common mistake is treating Lead Source as the attribution field; Lead Source is a free-text picklist ("Trade Show", "Webinar"), not a Campaign reference.
Which Salesforce fields should a badge scan populate?
Lead Source on the Lead, Campaign Member with status Responded on the event Campaign, plus custom fields for booth, note, scanner rep, timestamp, and offline flag.
Standard fields at minimum: Lead Source on the Lead ("Trade Show" or "Event"), Lead Status, Owner (via routing or scanning rep), and a Campaign Member record on the specific event Campaign (e.g., "SaaStr Annual 2026", not a 2026-events rollup) with status Responded. Primary Campaign Source on the resulting Opportunity flows from the Campaign Member at conversion time.
Custom fields you actually need:
- Event Name (text). Redundant with Campaign but useful for Lead-object reports.
- Booth Number (text). For multi-booth presence at large shows.
- Conversation Note (long text). 30-second voice note or transcript at scan time. Makes the Lead useful to the SDR three days later.
- Scanner Rep (lookup to User). For attribution and coaching.
- Scan Timestamp (datetime). Actual scan time, not Salesforce create time. Can differ by hours when offline queue flushes.
- Offline Sync Flag (checkbox). True if the scan was queued offline. Useful for data-quality audits.
Resist adding 17 more fields. Every custom field is a future migration tax. Five-to-seven event fields is the right count.
How do you handle duplicates when the same buyer shows up at three events?
Use Salesforce matching rules plus a multi-select or junction custom field for events attended. One record, multiple Campaign Memberships.
This breaks naive setups every time. Buyer hits your booth at SaaStr in March, B2B Marketing Expo in May, and Dreamforce in September. A scanner that blindly creates a new Lead each time leaves you with three records, three Lead Sources, and three separate engagement histories nobody can stitch back together.
Three-layer fix:
- Matching rules. Activate Salesforce's standard matching rules on Lead and Contact (the standard rule matches on email plus a fuzzy name match). Scan with matching email upserts the existing record instead of inserting a new one.
- Campaign Member is the per-event record. The Lead or Contact is unique; Campaign Members are not. Each event adds a new Campaign Member with status Responded. Reports show full event history without dedup gymnastics.
- "Events attended" rollup. A rollup counting Campaign Memberships of type Event gives you "this Contact attended five of our events in 18 months." Worth routing on as a behavioral score.
The attribution gotcha to know about: when a Lead converts (or an Opportunity is created from a Contact), Salesforce's default behavior populates Primary Campaign Source from the most recently associated Campaign, not first-touch. If you want first-touch attribution preserved across multi-event journeys, you need a Flow on Opportunity create that picks the earliest Campaign Member with status Responded instead of the latest. Without that customization, the September Dreamforce scan steals credit from the March SaaStr first-touch.
What does the actual data flow look like end-to-end?
Scan, enrich, upsert via Salesforce REST API, add Campaign Member with status Responded, post to Slack, assign owner. Under ten seconds end to end.
Concrete walkthrough:
- Scan (T+0s). Rep scans the badge. Voice or text note attaches locally.
- Enrichment (T+1-3s). Provider (Apollo, Hunter, PDL, Clearbit) fills in title, company, LinkedIn, size, industry.
- Upsert (T+3-7s). Scanner calls Salesforce REST API. Matching rule updates the existing Lead or Contact, otherwise inserts a new Lead with Lead Source = Trade Show. Custom fields set at create.
- Campaign Member (T+5-8s). Junction record created on the event Campaign with status Responded. New Membership on the same Lead or Contact if prior Memberships exist. This is the durable attribution record; Primary Campaign Source on the Opportunity will pull from it at conversion.
- Routing (T+5-9s). Assignment rule fires by territory, industry, or rep on duty.
- Notification (T+8-10s). Optional Slack message in the field marketing channel.
Under ten seconds from scan to fully attributed, routed, and notified Lead. Tendro hits this. iCapture publishes similar latency on its better integration paths. Organizer rental scanners do not get close.
How does this work with Pardot or Account Engagement?
The Salesforce connector syncs the Lead or Contact, Campaign Member sync mirrors event membership, and Engagement Studio fires off list segmentation.
Pardot is now Marketing Cloud Account Engagement (the rename happened in 2022). Mechanics are essentially the same. The Salesforce-Account Engagement connector watches Lead and Contact records and syncs matching records into Account Engagement as prospects.
Two prerequisites worth knowing about. First, prospects sync into Account Engagement once a record is assigned to a user (via completion action, automation rule, or assignment rule); unassigned Leads sit on the Salesforce side until routed. Second, Connected Campaigns needs to be turned on for Salesforce Campaigns to mirror as Account Engagement Campaigns; without it, Campaign Member sync is one-way and partial.
Standard pattern with Connected Campaigns on: enable Campaign Member Sync so the Account Engagement prospect picks up event Campaign membership. Build an automation rule that segments prospects with "Campaign Member of any event Campaign, status Responded, in the last 7 days" into a list, then trigger an Engagement Studio program off that list. Sends the post-event email sequence, drops into nurture if no engagement, hands off to sales when score crosses threshold. Engagement Studio triggers on list membership, not directly on Campaign Member create.
Do not write a separate Account Engagement list import for event leads. The connector handles this natively; double-importing breaks scoring and creates duplicate prospects. Marketo on Salesforce works the same way through the Marketo Sales Connect sync.
What happens when the venue has no Wi-Fi?
A real event scanner queues scans locally and syncs to Salesforce when reception returns. The Campaign Member is created on flush, not at scan time.
Convention centers have famously bad Wi-Fi. Some venues actively block carrier signal in the exhibit hall. A scanner that requires a live connection fails at exactly the moment you need it most.
The offline-first pattern. Scanner stores scans locally with full metadata (Campaign, custom fields, note, timestamp). The Salesforce API call is deferred. On reconnect, the queue flushes in order, scan timestamps preserved, offline-sync flag set so RevOps knows the record was queued.
Everything else fires normally on flush: Lead Source, Primary Campaign Source, Campaign Member status, dedup, routing, notifications. The only difference is the clock.
No offline mode means lost scans in the dead zone, or booth staff typing them into a Google Sheet that disappears by Tuesday. Tendro and Captello offer offline; iCapture's offline support is more limited per current G2 reviews.
What does the Tendro Salesforce integration specifically do?
Tendro upserts to Salesforce in under ten seconds, adds Campaign Member with status Responded, writes custom event fields, applies dedup, and works offline.
Disclosure: I build Tendro. Filter accordingly.
What ships: native Salesforce OAuth connector. Upsert by default with the standard matching rule respected (existing Contacts get a new Campaign Member instead of a duplicate Lead). Lead Source picklist mapped. Custom field mapping UI for the seven event fields above. Campaign Member created on the event Campaign with status Responded in the same API call where possible. Offline queue preserves timestamps and sets the offline-sync flag on flush.
Pricing context: flat annual subscription, no per-event seat fees, no hardware. Compare against organizer rental scanners. The 2025-26 order forms put those at $400-700 per device per event, reaching about $735 onsite at the largest shows. AAOS 2026's CDS form, for one, runs $605-685 for a handheld and $455-525 for the app license. Organizers increasingly charge again for the API and CRM-integration access on top. Or iCapture, now folded into Cvent, with a reported starting price around $8,000 a year and enterprise contracts.
When Tendro does not fit: if your entire calendar runs through Cvent, you do not need a universal scanner. iCapture inside Cvent works for that case.
Broader CRM comparison: event leads to CRM. Scanner deep dive: universal badge scanner. HubSpot equivalent: trade show leads to HubSpot. Full pillar: event lead capture.