Marketing Measurement
How Does Full-funnel Marketing Mix Modeling (MMM) Account For Upper-funnel Channels?
Simple MMM models assign all the credit to performance channels, while full funnel MMM provides a more balanced image of channels’ performance.

What is Full-Funnel MMM?
Full-funnel Marketing Mix Modeling (MMM) is an advanced measurement framework that quantifies how marketing activities across the customer journey, from top-of-funnel brand awareness to bottom-of-funnel conversions, interact and drive revenue.
Unlike traditional MMM, which focuses primarily on direct, short-term conversions, full-funnel MMM captures the cross-funnel effects of brand investments. It models how upper-funnel tactics, such as Connected TV and PR build brand equity and improve the performance of lower-funnel channels.
By accounting for these indirect pathways and long-term carryover, it gives marketers a unified view of total ROI, helping them allocate budgets strategically across every stage of the buyer’s journey.
Key Takeaways
- Upper-Funnel Undervaluation: Standard MMM treats all channels in parallel, allowing lower-funnel channels (like paid search) to capture credit for demand built by upper-funnel channels (like CTV or Broadcast).
- Search as a Mediator: Full-funnel MMM explicitly models search spend and impressions as a multi-stage mediator to capture indirect brand halo effects.
- Increased ROAS Attribution: In our 4-year dataset analysis, accounting for mediated search demand attributed 21.7% more revenue and boosted upper-funnel ROAS from 28.0 to 35.0.
- Privacy-Safe Measurement: Full-funnel Bayesian MMM relies purely on aggregated time-series data without user-level tracking or cookies.
Upper-Funnel Marketing Mix Model
Some marketing channels push people toward other channels.
In this demo marketing data that we use for this blogpost, Broadcast and Streaming ads are the awareness-building, “upper funnel” spend. We want to test if this spend influence people to search for the product.
If, for example, we build a flat model where Search sits next to CTV, a part story will be hidden: Search will steal some of the credit that belongs to CTV.
This notebook builds two models on a four-year weekly dataset:
- The first is a standard model, where Search is treated like any other channel.
- The second is a funnel-aware model, where part of Search is a result from the upper-funnel channels.
We then compare the two models and assess how well each model fits the data.
This notebook assumes introductory knowledge about modeling with pymc-marketing, refer to step-by-step guide to modeling with pymc-marketing.
How we think about the funnel
Let’s start by looking at the following chart

The diagram above shows two channel groups: upper-funnel and lower-funnel. Also, a chain of boxes on the bottom that explains how Search really works
The two channel groups. Broadcast and Streaming are the upper-funnel channels: awareness-building spend that we think also creates search demand.
DirectMail and Digital channels (lower-funnel channels) that don’t believe they feed search, so each group has one arrow labeled “direct” going straight to revenue.
The hidden demand. In addition to directly influencing revenue, the upper-funnel channels create a “hidden search demand”. These are people who become more likely to search for the product. We can’t observe this demand directly, hence it’s drawn as a dashed node.
The mediator. That hidden demand combines with search spend into a single “mediator.” It is the total pool of search-driven interest in a given week, whether that comes from upper-funnel activities or from search spend.
The mediator does two jobs:
- It is measured by search impressions. Impressions are a noisy readout of the mediator.
- Separate from the upper-funnel channels’ direct arrows, mediator has its own indirect arrow into revenue. Model would miss this credit if it treats search as an ordinary channel.
So every dollar of upper-funnel spend can reach revenue directly, and indirectly through the demand it creates in search. The funnel-aware model estimates both; the standard model (described below) only sees the direct path.
Setup
All the Python code, datasets, and models used in this analysis are available on Explore the Full-Funnel MMM GitHub Repository.
First, we import the foundational libraries for probabilistic modeling, data manipulation and Bayesian diagnostics.
Loading the data
Next, we load the dataset and define the key variables that structure our modeling framework. In this step, we parse the primary date and revenue metrics, specify which media channels operate as top-of-funnel drivers versus lower-funnel mediators, isolate control variables like holiday flags, and split the dataset into our features () and target variable ().
A Quick look at the data
We start by visualizing our target metric over the entire observation window, from mid-2020 through mid-2024.

The plot highlights strong annual seasonality, characterized by massive revenue surges at each holiday season (peaking near $350M–$370M near year-end) alongside steady baseline revenue hovering around $50M–$100M during non-peak periods.
Let’s break down marketing spend across channels to reveal distinct investment strategies and flighting patterns.

While DirectMail shows high-frequency, continuous weekly spend, upper-funnel channels like Streaming and Broadcast show heavier pulsing tactics, spiking sharply during Q4 holiday windows to capture seasonal demand.
To evaluate search as a mid-to-lower funnel mediator, we overlay search spend against search impressions on a dual-axis line plot.

The two metrics mirror each other almost perfectly, scaling from a baseline of ~200k impressions up to steep 900k+ impression peaks around November and December, confirming that impression volume reliably scales alongside search budget allocation.
Building the Search-as-Mediator Piece
To capture how awareness drives interest before turning into sales, we define a custom PyMC custom effect class, FunnelEffect, to model our full-funnel structure.
The library pymc-marketing lets you plug a custom extra term into a model’s mean, and that custom term is allowed to bring its own observed data with it. That’s what we use to add the mediator behavior.
Here’s what our custom piece does:
- Takes the spend of Broadcast and Streaming, applies adstock and saturation to each (same as a normal channel would get), and adds them together into a hidden demand number
- Adds a scaled version of search_spend on top of that hidden demand
- Compares that combined total against the actual search_impressions we observed, treating the difference as noise
- Passes the combined total through one more adstock-and-saturation step and adds the result to revenue, alongside the direct contributions of every channel
This way, the model estimates one set of numbers that has to explain both the search data and the revenue data at the same time.
What the next cell defines: upper_dim is the name ("channel_upper") of a new PyMC coordinate used only inside this effect, separate from the model’s regular "channel" dimension. FunnelEffect subclasses pymc_marketing.mmm.additive_effect.DataVarMuEffect and implements the four methods that interface requires:
- to_dict: serializes the effect’s configuration (used if the model is saved/loaded).
- incrementality_spec: tells pymc-marketing’s incrementality module how much extra carryover (l_max_lf lags) the mediator’s own adstock adds, so ROAS calculations later account for it.
- create_data: registers upper_dim as a model coordinate.
- create_effect: builds the actual PyMC graph — demand, mediator, the TruncatedNormal likelihood on search_impressions, and the returned funnel_effect_contribution term that gets added to the revenue mean.
None of this runs until the class is instantiated later, inside make_funnel_effect.
Setting up both models
Next, we establish our model configuration helpers and instantiate our custom funnel effect. We write a function to auto-scale channel saturation priors based on relative spend shares, set maximum adstock carryover windows (l_max), and configure the make_funnel_effect factory function, wiring up distinct geometric adstock and logistic saturation transformations for both the upper-funnel upper-channel path and the lower-funnel demand-to-revenue path.
The funnel model needs its input data in a slightly different format so that search_spend and search_impressions travel along with it, including when we later ask it to predict on new data. We handle that with a small subclass below.
Let’s define the following helper function that builds the dataset
Finally we are ready to define the two models
Fitting both models
We fit both models on the full history:
- The standard model puts search_spend next to the other four channels as just another channel.
- The funnel model keeps the same four direct channels, and adds the mediator piece so the two upper-funnel channels also get credit for the search demand they create.
Both use the same settings otherwise. Fitting both models takes a while, feel free to lower the draws/tuning numbers below for a quicker test run.


After fitting in both models, lets now proceed with checking if there were any divergences.
Checking the Models Sampled Properly
Before looking at any results, it’s worth checking that the model fitting actually went well for both models
The results showed zero divergences for both the models with max r-hat as 1.004 and 1.005 for standard and funnel model respectively.
Does Each Model Reproduce What We Actually Saw?
The funnel model has to explain two things at once: revenue, and the search_impressions numbers it uses as a stand-in for hidden demand. We check both.

Both models trace the major holiday spikes and non-peak fluctuations closely within their uncertainty bands, confirming that adding indirect search mediation and multi-stage adstock structure preserves strong predictive fit while accounting for cross-funnel dynamics.
Beyond revenue, our full-funnel model includes a secondary likelihood to validate the intermediate stage of the customer journey: search impressions. By extracting the posterior predictive samples for funnel_search_impressions_likelihood, we plot the predicted search volume against observed data along with the 94% HDI.

The plot confirms that the model accurately tracks lower-funnel search demand, capturing both baseline impression levels and major Q4 volume surges, validating search as an effective, properly modeled mediator in the funnel. This check carries direct business value for search teams: If the model’s predicted demand contradicted real-world search impressions, the funnel logic would be fundamentally flawed in a way that evaluating sales fit alone could never uncover.
Splitting Upper-Funnel Credit into Direct and Indirect Parts
Only the funnel model can answer this: out of all the revenue we attribute to Broadcast and Streaming, how much comes from their direct effect, and how much comes from the extra search demand they generate? To isolate the indirect part, we compare the mediator’s contribution as fitted against what it would look like if upper-funnel spend had been zero the whole time, the difference is the part that’s actually caused by upper-funnel spend, rather than baseline demand or search’s own spend.
The following decomposition plot illustrates how upper-funnel investments translate into revenue through both paths over time.
Indirect share of the upper-funnel effect (posterior mean): 10.0%

While direct upper-funnel contribution provides the primary baseline lift (peaking near $50M during Q4 bursts), the indirect path, routed through search demand, contributes a reliable secondary lift peaking around $3M–$5M in key seasonal windows. Combining these components gives us the total upper-funnel effect and allows us to calculate the exact posterior share of revenue that would be missed by ignoring indirect search mediation.
Comparing the Two Models Head-To-Head
Here’s the number that actually matters for a spending decision: how much total revenue do Broadcast and Streaming create? In the standard model, that’s just their combined direct contribution. In the funnel model, it’s the direct-plus-indirect total we just computed.
Funnel model attributes +21.7% more mean revenue to the upper funnel than the standard model.

We also compare return on ad spend (revenue generated per dollar spent) for the same two upper channels across both models.


Standard MMM, which only accounts for direct conversions, understates the true value of upper-funnel investments, returning an all-time mean ROAS of 28.0. By incorporating both direct impact and search-mediated halo effects, the full-funnel model shifts the posterior distribution upward to a mean ROAS of 35.0. This comparison highlights how traditional attribution models systematically undervalue awareness channels by failing to credit the downstream demand they create.
Wrapping up
What we found
- Treating search_spend as just another channel hides part of the upper funnel’s real value: the standard model gives Broadcast and Streaming less credit than the funnel model does, because it doesn’t have anywhere to put the indirect effect.
- The funnel model separates that credit into a direct part and an indirect (search-mediated) part, fitting both alongside the search impressions data at the same time.
- The two models can predict revenue about equally well even though they disagree on attribution, so prediction accuracy alone isn’t enough to catch this kind of mistake.
Frequently Asked Questions About Full-Funnel MMM
How does full-funnel MMM differ from single-stage MMM?
Single-stage MMM treats every marketing channel as a direct, parallel driver of a single outcome (like revenue). Full-funnel MMM explicitly models multi-stage dependencies, mapping how upper-funnel investments (like CTV or PR) generate latent brand demand, which then flows into intermediate mediators (such as branded search impressions or site traffic) before converting into sales.
Why does standard attribution or single-stage MMM undervalue upper-funnel campaigns?
When upper-funnel channels drive search interest, standard attribution assigns 100% of the conversion credit to the lower-funnel search ad that captured the final click. Single-stage MMM faces a similar dilemma: including lower-funnel metrics as control variables strips upper-funnel channels of the credit for creating that demand in the first place. Full-funnel MMM eliminates this bias by accounting for both direct paths and indirect halo effects.
Does full-funnel MMM require individual user tracking or cookies?
No. Like traditional MMM, full-funnel models operate entirely on aggregated time-series data such as weekly spend, impressions and revenue. It is fully privacy-safe and not impacted by cookie deprecation.
How ELIYA Helps Build Custom Full-Funnel Models
While open-source packages like pymc-marketing provide modular components, implementing robust production models requires enterprise data integration and validated causal priors. ELIYA’s proprietary Multi-Stage Demand-Bridge Framework connects top-of-funnel investments to downstream conversion channels without losing attribution credit
- Custom Bayesian Funnel Architecture: ELIYA builds tailored multi-stage graphs calibrated to your specific purchase cycle, adstock carryover, and saturation curves.
- Proven Impact: In enterprise B2B SaaS deployments, ELIYA’s full-funnel attribution restored an average of 18% to 25% additional revenue credit to upper-funnel awareness campaigns that standard single-touch or single-stage models ignored.
- Expert PhD Validation: Every model specification is audited by PhD data science practitioners to prevent non-identifiable parameter ridges and ensure convergence.
Is your upper-funnel spend getting unfairly cut due to flawed lower-funnel attribution?
If you are a growth-stage B2B SaaS or multi-channel consumer brand spending across Connected TV, PR, or digital video, ELIYA’s full-funnel MMM program is built to quantify your true cross-channel halo effect. Request a Custom Measurement Assessment with ELIYA.










