Circular pie chart with one small orange slice separated from pink and purple gradient larger section.
Case Study
Back to Case Studies

Marketing attribution the team could trace and trust

The marketing team could see its campaigns but not their impact, because tracking was slow, manual, and disconnected from pipeline. I rebuilt the attribution architecture end to end, so every marketing touch became traceable and leadership could finally attribute pipeline by channel and initiative, and trust the numbers enough to act on.
Schedule a Call
Challenge
Marketing tracking disconnected from pipeline
Solution
An end-to-end multi-touch attribution architecture
Outcome
Pipeline traceable by channel, and trusted enough to act on
Result
6 Months
Multi-touch Attribution exposed that the single largest source was slow-moving, with a six-month lag, which rebalanced spend toward faster, lower-cost channels while pipeline grew.

When I joined the marketing organization at Brightcove, leadership could not answer a question that should have been simple: which marketing initiatives were actually generating pipeline? By the end, every touch a prospect made was traceable, pipeline could be attributed by channel, campaign, initiative, and business vertical, and the team could walk into an executive review and defend its budget with objective numbers instead of opinion. The people running campaigns also stopped waiting on anyone else to set them up.

This took about a year and a half, and it worked precisely because it did not try to happen overnight. Brightcove was a medium-sized company of 800+ people, with a marketing team of 40 to 50, and at that scale decisions do not move fast. It was also well before the AI era we work in today, so every piece was designed, built, and negotiated by hand.


Key data points
  • 48 hours → 15 minutes. Campaign tracking moved from a manual Marketing Operations SLA to a self-serve process.
  • ~70% of leads, one channel. Attribution exposed that the single largest source was slow-moving, with a six-month lag, which rebalanced spend towards faster, lower-cost channels while pipeline grew.

The Problem

At the time, campaign tracking ran on Salesforce Campaign IDs. Every time a Campaign Manager wanted to launch something, they requested a new ID from Marketing Operations through a shared spreadsheet, and they needed a separate ID for every distribution channel.

For example, a single campaign promoted on LinkedIn and Google Ads, with branded and non-branded keywords tracked separately, required three different Campaign IDs, each created by hand before anything could go live.

It was technically functional, but it was slow, and it produced data no one could reason with. Salesforce held one enormous, undifferentiated list of campaign records, with no taxonomy and no hierarchy, so a simple question like "what campaigns are we running right now?" had no structured answer, just an ever-growing list. And connecting a marketing interaction to a sales opportunity was a complex, opaque process. We had an estimate of how much pipeline marketing generated, but it was difficult to trust.


The Diagnostic

The complaint I heard was that campaign tracking was inefficient. That was true, but it was the symptom, not the cause.

The real problem lived in the data model. The Campaign ID was being asked to carry three things at once: the content someone engaged with, the channel they arrived through, and the campaign it belonged to. Because the channel was baked into the identifier, every channel variation needed its own record, which is what exploded the count and destroyed the granularity.

You cannot attribute across dimensions you have collapsed into one. If channel, content, and campaign all live inside a single ID, there is no clean way to ask how a channel is performing separately from how a piece of content is performing. The inefficiency was annoying; the collapsed model was disqualifying. It was also why the pipeline estimate could never be trusted: with the dimensions tangled and the path to an Opportunity opaque, there was no clean line from a marketing touch to the revenue it influenced.


The Approach

The most important decisions here were not about tools. They were about separating things that had been tangled together, and about being able to trace exactly how each campaign was tracked.

First, I moved tracking off Salesforce Campaign IDs and onto UTMs, the industry standard, with a taxonomy I designed to define how each channel and campaign type should be tagged. (UTMs are the small tags appended to a link, source, medium, campaign, that tell you where a visitor came from.)

The key architectural decision followed straight from the diagnosis: Salesforce would no longer try to identify the channel, only the content offer. If someone downloaded a specific whitepaper, that whitepaper became the offer, and since each content asset had its own form, identifying it was trivial. The channel information, the UTMs, moved onto the Campaign Member record as properties. That single move untangled the three things that had been fighting for space inside one identifier: content identity in the offer, channel in the UTM properties, campaign metadata in the hierarchy. All three preserved, none conflated.

Second, I made campaign creation self-service, to remove Marketing Operations as the bottleneck. There was no reason a Campaign Manager should wait on another team to generate a tracking link, nor for Marketing Operations to spend its time producing them.

Third, I gave Salesforce a real hierarchy: a Parent Campaign for the strategic initiative, carrying the business vertical as an attribute, and Child Campaigns for the individual content offers beneath it. This is basic database design, parent-child relationships with each level owning the attributes relevant to it, but it was the difference between an undifferentiated list and a structure that mirrored how the business actually thought about its marketing.

Attribution itself was a genuine choice, as much a business decision as a technical one. Some stakeholders believed the first touch deserved the credit, others the last. Rather than force one view, we built the model to support first touch, last touch, and multi-touch, so stakeholders could analyze through whichever lens fit the question. (First touch is the earliest marketing interaction a Contact had; last touch, the final one before an Opportunity; multi-touch, every interaction along the way.)

One finding was worth carrying forward, because it taught me something I now use everywhere: you cannot read a number honestly until you understand how it was produced. Content Syndication looked like our strongest source, accounting for nearly 70% of leads, but many of those Contacts sat inactive for six months or more before an Opportunity appeared. That pointed to later sales outreach, not the original download, which we confirmed with the Sales team, and it rebalanced how we invested across channels.


The Built

With the decisions made, the build followed from them:

  • A self-service workflow. A Google Form that adapted its questions to the channel selected and generated the correct UTMs automatically, stored the result in Google Sheets, and surfaced finished campaign links through a Looker Studio dashboard, ready to copy and paste.
  • Website capture. Modified site JavaScript stored incoming UTMs in the browser for about 48 hours, an attribution window we agreed on with the Campaign Managers, and populated them as hidden fields on any form the visitor later submitted. Forms were built in Oracle Eloqua, our marketing automation platform, and passed the attribution straight into Salesforce.
  • The Salesforce model. Every submission created a Campaign Member tied to the content offer, with the UTMs as filterable properties, sitting under the parent-child campaign hierarchy.
  • The attribution logic. Pipeline was reconstructed along the chain that already existed in Salesforce: Campaign Member to Contact to Account to Opportunity.

One honest limitation shaped the work: Salesforce did not reliably record which specific Contact drove an Opportunity, since that depended on how Sales maintained their records. Rather than claim a precision we did not have, we added confidence adjustments based on how many Contacts an Account carried, and set expectations up front about what the model could and could not claim.


The Outcome

After a year and a half and a multi-phased approach, the data finally served the marketing team instead of standing in its way. The numbers had become relatable, something people recognized from the campaigns they configured and could act on with confidence.

  • Numbers the team trusted. Every figure traced back to how the campaign was configured, nothing hidden.
  • Campaign setup, 48 hours → 15 minutes. Fully self-serve, with Marketing Operations out of routine setup.
  • Pipeline attributable. By channel, campaign, initiative, and vertical.
  • Spend rebalanced. Moved towards faster, lower-cost channels as slow sources surfaced.

What began as a complaint about slow campaign setup ended as a measurement architecture the Marketing Leadership team could actually use.

More Case Studies

Circular pie chart with one small orange slice separated from pink and purple gradient larger section.
Get Started

Ready to Start Trusting
Your Numbers Again?

Let’s talk about your current challenges and 
see what model best fits you.
Man with glasses smiling broadly wearing a white striped shirt against textured wall background.
César
Founder
Schedule a Call