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 its identify() 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.

Next
Next

How Growth Engineering Turned a Small UX Test into Major Pipeline Impact—Without Increasing Ad Spend