Re-Engineering A/B Test Attribution: How We Solved Real-Time UTM Tracking Without Overloading Salesforce
Modern B2B marketing experiments don’t mean much without clean attribution. At Cloudera, our experimentation and growth playbook depends on accurate, granular attribution, especially in a complex B2B environment with long sales cycles, multiple stakeholders, and non-linear journeys.
To truly measure the outcomes of our A/B tests, targeting strategies, and personalization efforts—and to ensure our cross-functional marketing teams have reliable reporting—we needed a smarter, more scalable attribution architecture. That’s the problem Growth Engineering and the broader MarTech team set out to solve.
The Problem: Granular Attribution vs. System Limitations
We started with a deceptively simple challenge: improve how UTM parameters—like utm_source
and utm_campaign
—flow into Salesforce Campaign Member records. The business wanted clarity on channel performance, placement impact, and lead source. But the systems we had were limited:
Marketo, which syncs to Salesforce in batches (~5 min delay)
Salesforce, which couldn’t reliably handle attribution in high-speed, multi-touch scenarios
A fragmented set of websites, forms, and landing pages—including third-party tools like Splash and ON24
To track performance, teams had resorted to creating hundreds of nearly identical Salesforce Campaigns (one per channel, placement, or creative variation). This led to clutter, time loss, and no real-time insights.
Even worse, when a user submitted multiple forms quickly (“binge behavior”), UTMs from one form could overwrite or fail to appear on the correct Campaign Member—breaking attribution entirely.
The Goal: Scalable Attribution + Real-Time Personalization
We set out to:
Reduce Salesforce Campaign sprawl by capturing UTMs at the Campaign Member level
Ensure accurate attribution, even during fast-paced user interactions
Standardize tracking parameters to improve data hygiene and clarity
Support real-time targeting by enabling “next-best-step” personalization logic
Create a scalable architecture that works across all platforms and touchpoints
The Solution: Segment CDP × Marketo → Salesforce
The breakthrough didn’t come from Salesforce—it came from engineering a smarter event architecture between Twilio Segment and Marketo.
1. Segment as the Real-Time Brain
We transformed Segment into our attribution control center:
Segment Source Functions introduced deliberate sequencing: we delayed the
track()
call (with UTM details) until after Marketo had completed itsidentify()
process. This sequencing prevented race conditions.Data Governance via Segment Protocols helped enforce clean and standardized values across touchpoints.
Identity Resolution stitched together anonymous and known sessions across devices and multiple email addresses.
Data Sync to Redshift allowed for deep attribution reporting and computed trait modeling.
2. Marketo as the Attribution Dispatcher
We configured Marketo to:
Ingest UTMs on form submission, which temporarily writes them to the Person record
Immediately update the Salesforce Campaign Member with the UTMs
Then clear the UTM fields on the Marketo Person record to prevent contamination during future submissions
This “stamp-and-clear” pattern allowed us to maintain attribution integrity even when users submitted multiple forms in rapid succession.
3. Salesforce as the Reporting Backbone
We extended Salesforce’s capabilities by:
Adding UTM fields to Campaign Member records (not just Leads and Contacts)
Streamlining layouts and removing clutter from non-reporting-critical fields
Using Flow to populate Campaign Member fields automatically
Making UTM values available in reports for true multi-dimensional attribution
Results: What We Unlocked
Major reduction in campaign sprawl—no more one-off SFDC Campaigns for every tactic
Accurate, real-time attribution even in edge cases (e.g. fast multi-form submits)
Campaign Member-level reporting across dimensions like channel, ad type, and creative
Personalization-ready architecture using UTM-based logic and inferred audience parameters
Unified identity resolution across web, form, and third-party platforms
Scalable foundation for real-time analytics, A/B testing, and downstream CDP workflows
Lessons Learned
Building pseudo-real-time attribution in a batch-based ecosystem taught us a lot:
Sequencing is everything when your stack mixes events and syncs
Attribution is a plumbing problem—getting data to the right place at the right time is 90% of the challenge
Identity resolution is fragile, and assumptions break when people use different devices or emails
Internal teams drive real breakthroughs—outside vendors can help, but internal curiosity and iteration ultimately lead the way
Looking Ahead
This project laid the foundation for far more than just cleaner attribution. It now powers our Drift chatbot attribution, informs paid media optimization, and enables “next-best-step” targeting across Cloudera’s web properties.
It also reminded us of a core truth: attribution isn’t about filling in fields. It’s about earning the ability to trust your data—and act on it.
Appendix: Why We Moved Away from a Salesforce-Only Solution
Before implementing the Segment–Marketo–Salesforce event flow, we worked through several iterations of Salesforce Flow-based logic with our internal Salesforce Admin team. However, we ran into a persistent issue: Salesforce would often fail to stamp UTM parameters onto Campaign Member records when two form submissions used the same UTM values across different campaigns.
For example:
A user fills out a form for Campaign A with
internal_link=InternalLink1
Later, they fill out a form for Campaign B, again with
internal_link=InternalLink1
Result: Campaign B’s Campaign Member record is created—but the UTM fields remain blank
Salesforce appears to interpret the second submission as a duplicate and skips updating the values, even though the user is engaging with a different campaign. This behavior created gaps in attribution and made the system too unreliable to serve as our primary logic layer for real-time UTM handling.
Turning Off the Native Marketo–Salesforce Sync
As the architecture matured, we made a strategic decision to disable the native Marketo–Salesforce sync for Campaign Membership altogether. The sync’s batch-based nature introduced timing delays that could not keep up with rapid-fire user behaviors—especially in cases where users submitted multiple forms in short succession or navigated quickly between touchpoints.
Relying on this batch process meant that Campaign Member creation in Salesforce could lag behind actual user behavior, often resulting in:
UTMs being stamped to the wrong Campaign
Missing or overwritten attribution values
Inconsistent reporting and personalization logic downstream
By disabling the native sync and instead orchestrating Campaign Member creation and UTM stamping directly through Marketo Flow steps—triggered immediately upon form submission—we ensured the right data was applied to the right campaign, at the right time, with no lag.
This shift further solidified our event-based attribution architecture and gave us full control over sequencing, logic, and data integrity.
If you're interested in diving deeper into the technical architecture or want to exchange ideas on attribution systems, feel free to reach out to me on LinkedIn. I’m always happy to connect with fellow MarTech builders and growth engineers.