RevOps Playbook: Campaigns, UTMs, and Multi‑Touch Attribution Between HubSpot and Salesforce
Published by Bles Software, a custom software and AI company based in Yehud-Monoson, Israel, building web apps, AI agents and API integrations for clients in Israel, the US, the UK and the EU.
Attribution breaks when campaigns and UTMs don’t traverse systems intact. Marketing sees one story. Sales sees another. Finance can’t reconcile sourced vs. influenced. This playbook provides a pragmatic design to make HubSpot and Salesforce tell the same attribution story by standardizing UTM capture, campaign structure, and membership sync.
The guidance assumes Salesforce is the durable ledger for Campaigns and Campaign Members, while HubSpot is the system of action for channels, UTMs, and nurture. If you’ve historically created campaigns in HubSpot, we’ll show how to transition without losing history.
Operating Assumptions
We’ll assume a simple, scalable policy:
- UTMs are captured and normalized in HubSpot at the session and form‑submission level. First/last touch rollups live on the Contact and are mirrored to Salesforce.
- Salesforce owns campaign taxonomy (programs, child tactics) and Campaign Members. HubSpot references the same campaigns via shared keys.
- Multi‑touch attribution (MTA) is computed either in HubSpot, Salesforce, or your warehouse, but the underlying membership data is consistent in both systems.
Campaign Taxonomy That Survives Scale
Adopt a hierarchy that your teams can actually maintain:
- Parent “Program” Campaigns represent budgeted initiatives (e.g., 2025 Q4 Paid Social, 2025 Webinars, 2025 Content Syndication). They carry planned cost and strategic KPIs.
- Child “Tactic” Campaigns represent concrete, trackable efforts (e.g., Webinar: RevOps Summit Oct‑03, Paid Social: LinkedIn Demo Offer Sep‑22). They receive members and actual costs.
- Channel and Source are UTM‑driven fields on members or contacts, not separate campaigns. Avoid duplicating the UTM matrix as campaigns; it explodes count and adds noise.
Shared Keys and Creation Policy
Pick one creation source and stick to it. The durable pattern:
- Create every new campaign in Salesforce with an external key (
External_Campaign_Key__c). - Store that key in HubSpot (Campaign external ID) and in any orchestration tools. If HubSpot needs to create a campaign, it must call a Salesforce‑first path or write the external key back after Salesforce creation.
- When HubSpot runs a program (email, form, ad), it adds or updates Campaign Members in Salesforce for the tactic campaign using the Contact/Lead ID.
UTM Capture and Contact Rollups
Capture UTMs in HubSpot with strict normalization:
- At session level: capture raw UTMs for analytics; do not mirror these into Salesforce.
- At conversion level: stamp UTMs at the moment of a qualifying event (form submit, trial start). Map these into “First Touch” and “Latest Touch” rollups.
- Mirror rollups to Salesforce on Contact/Lead and also to the Campaign Member when the member is created. Once set, avoid overwriting first touch; allow latest touch to update.
Recommended HubSpot properties:
first_touch_source,first_touch_medium,first_touch_campaign,first_touch_datelatest_touch_source,latest_touch_medium,latest_touch_campaign,latest_touch_date
Mirror to Salesforce custom fields on Lead/Contact with identical names (or your naming standard). For campaign alignment, include utm_campaign and a Touch_Type__c field on Campaign Member when created.
Member Status and Progression
Define a status model that works for all digital campaigns:
Respondedindicates a meaningful engagement (form submit, registration, attended, downloaded).Sent,Opened,Clickedmay be tracked but should not count as Responded without a business rule sign‑off.- For webinars and events, use
Registered,Attended,No Show, and designate which counts asResponded.
In HubSpot, configure workflows to set the appropriate status when the qualifying action occurs. Writes must target the Salesforce Campaign Member via external campaign ID and Salesforce record ID to avoid duplicates.
Multi‑Touch Attribution Models
Pick one MTA model per dashboard; document its rules and stick to it for a quarter. The simplest options:
- First‑Touch: all credit to the earliest qualifying touch.
- Last‑Touch: all credit to the most recent qualifying touch before opportunity creation.
- Linear: equal credit across all qualifying touches within a defined window (e.g., 90 days before the opportunity was created).
- W‑Shaped: weighted credit to First Touch, Lead Creation Touch, and Opportunity Creation Touch, with the remainder split across the middle touches.
Where to compute:
- HubSpot: fastest to deploy for marketing‑centric dashboards. Mirror opportunity and revenue context into HubSpot.
- Salesforce: suitable if your org drives attribution in CRM; requires a reliable process to create campaign members from HubSpot.
- Warehouse: highest fidelity, requires more engineering; ideal if you blend product usage and offline events.
Opportunity Association and Influence
For any MTA model that includes revenue, ensure Opportunities are associated to relevant Campaign Members. The durable policy is:
- When a Salesforce Opportunity is created, copy the primary Contact and recent Campaign Members to the Opportunity via native influence or a light automation. Do not mass‑associate thousands of members; it inflates influence and slows reports.
- When HubSpot creates or updates a Deal that mirrors an Opportunity, ensure the external key is present so influence automations can resolve the Opportunity correctly.
Cost Capture and ROI
If Finance needs net ROI, capture actual cost at the tactic campaign. For recurring programs, post costs monthly as separate child tactics or via a cost ledger related to the campaign. Keep planned cost on the parent program for budget variance reporting.
Data Quality Guardrails
Defend your attribution integrity with these habits:
- Normalize UTM parameters (lowercase, trimmed, whitelisted values). Store raw values separately if you need them for diagnostics.
- Block non‑human traffic (bots) and filter internal IP ranges.
- For direct traffic without UTMs, apply a last non‑direct rule so you don’t attribute “Direct” excessively.
- Disallow overwriting first‑touch fields. If an admin must correct them, stamp a
First_Touch_Manual_Override__cflag.
Transitioning from HubSpot‑First Campaigns
If you historically created campaigns in HubSpot, migrate to Salesforce‑first with a pragmatic backfill:
- Export HubSpot Campaigns with their IDs and key metadata.
- Create matching campaigns in Salesforce; write the Salesforce external key back into HubSpot.
- Reconcile membership by matching email/record IDs; avoid re‑adding members to prevent fake “new” responses.
Reporting Patterns That Hold Up
Provide a canonical set of dashboards that are consistent in both systems:
- Pipeline by Program: Opportunities sourced and influenced by program parent over the last two quarters.
- Touch Velocity: median days from first touch to MQL, MQL to SAL, SAL to Opportunity.
- Cost‑per‑Response and Cost‑per‑Opportunity by tactic. – Attribution Mix: percent share of credit by channel under your chosen model.
Anti‑Patterns
Avoid the following practices:
- Duplicating campaigns for every UTM variant; put UTM data on the member or contact.
- Over‑associating thousands of Campaign Members to every Opportunity; it pollutes influence.
- Allowing HubSpot to create campaigns without a shared external ID, leading to near‑duplicates.
FAQ
Should we put UTMs on Campaign Members or on Contacts?
Do both, but differently: store normalized first/last touch on the Contact for funnel reporting; stamp UTM context onto Campaign Members at the moment of membership. Contacts give you lifecycle context; members give you tactic‑level context.
How do we credit meetings booked from SDR outbound?
Treat outbound sequences as Salesforce Campaigns with explicit “Meeting Booked” statuses. Attribute in your model alongside marketing touches; don’t let them overwrite first‑touch attribution.
Can we rely on first‑touch if we do a lot of retargeting?
First‑touch alone underweights retargeting, content syndication, and community. Use W‑shaped or linear for executive reporting, and keep first‑touch for budget allocation sanity checks.
Where should we compute MTA if we plan to add product usage?
In your warehouse. Use HubSpot for capture and early insights, Salesforce for operational views, and a single warehouse model for mixed marketing + product attribution that feeds BI.
How do we avoid duplicate Campaign Members from HubSpot workflows?
Always reference the Salesforce campaign via external key and the record by Salesforce Id. Use “upsert” semantics and check for existing membership before adding. The official integration and light iPaaS flows can both do this safely.
More RevOps Playbooks from Bles Software
- Attribution & Pipeline Reporting Setup | Bles Software
- Data Mapping Checklist (Leads/Contacts/Opportunities) | Bles Software
- Field Governance & Picklists | Bles Software
- Sync Rules: Deduping, Owners, Lifecycle | Bles Software
- HubSpot ↔ QuickBooks Integration Playbook | Bles Software
- Errors & Retries: Top Fixes | Bles Software
- HubSpot ↔ Salesforce Integration: Executive Guide | Bles Software
- HubSpot ↔ Salesforce: Cost & Timeline Drivers | Bles Software
- Daily AI Roundup: AI agent, model and enterprise AI news