An evidence-informed synthetic data demonstration showing how attitudinal, behavioral, and longitudinal measurement methods can be applied to advertising experience research on streaming platforms.
Ad-supported streaming is no longer a niche product tier. Netflix's ad-supported plan reached approximately 94 million monthly active users in 2025, with U.S. members averaging around 41 hours of monthly viewing. By 2026, Netflix reported that its ads plan reached more than 250 million global monthly active viewers — confirming that this growth has already arrived, not merely projected. Note: Netflix's public advertising metrics shifted from "monthly active users" to "monthly active viewers" between these reporting periods; the latter reflects household-level viewership and should be interpreted as an indicator of scale rather than a directly comparable subscriber count. The rapid scale of this shift makes advertising experience quality a timely strategic research problem, not just a technical modeling exercise. How platforms balance monetization with member experience will be a defining competitive variable in the next phase of streaming growth.
As streaming platforms shift toward ad-supported models, understanding how advertising experience shapes member satisfaction and retention becomes a strategic research priority. Yet the core mechanism — how ad fatigue accumulates over time and at what point it begins to damage the viewing experience — remains poorly understood in a longitudinal context.
This demonstration builds a transparent, evidence-grounded research framework to answer three questions: (1) How do ad load and personalization independently affect member satisfaction over a 12-month period? (2) Does ad fatigue mediate the effect of ad load on churn intent? (3) Is the relationship between fatigue and satisfaction bidirectional, and if so, which direction dominates?
I generated a synthetic longitudinal panel (3,150 members × 12 months) using parameters calibrated to published research and industry benchmarks, then applied a full measurement and modeling pipeline including Confirmatory Factor Analysis, Generalized Estimating Equations, Weibull Survival Analysis, and Cross-Lagged Panel Modeling.
The design crosses three levels of ad load (2.5, 4.5, 6.5 min/hr) with three levels of personalization (low, medium, high), yielding 9 experimental conditions with 350 simulated members each. A third factor, ad diversity (creative variety), was varied within conditions to assess its fatigue-mitigating effect.
Unlike cross-sectional designs, this framework models two time-dependent processes that make ad experience fundamentally different from a single-exposure study:
adstock_t = exposure_t + λ × adstock_{t-1}, where λ = 0.47 (Leone 1995 meta-analysis median). This means the "weight" of advertising compounds — members who have seen many ads feel their effect more strongly.
The theoretical backbone integrates three published frameworks:
Every numerical value in the simulation has an explicit justification. Parameters were either (a) taken directly from published estimates, (b) derived by back-calculation from a defensible target outcome, or (c) stated explicitly as design assumptions. No key parameter was left undocumented; each was sourced, calibrated, or explicitly treated as a modeling assumption subject to sensitivity analysis.
| Parameter | Value | Justification | Source |
|---|---|---|---|
| Target monthly viewing | 41 hrs | Netflix ad-tier U.S. average viewing reported across multiple industry sources | Marketing Brew / Netflix upfront (2023) |
| Default ad load | 4.5 min/hr | Industry-reported estimate: multiple sources place Netflix's ad tier in the 4–5 min/hr range. Used as a design assumption; not a formally published Netflix specification. | Industry-reported estimate (MediaPost, Omdia, 2023–24); used as simulation baseline |
| Adstock carryover λ | 0.47 | Median λ from meta-analysis of 128 advertising studies | Leone (1995) |
| Fatigue persistence α | 0.72 | Estimated from wear-out literature showing fatigue persists across viewing sessions | Pechmann & Stewart (1988); Kronrod & Huber (2019) |
| Diversity mitigation coefficient | 0.49 | Back-calculated from 40% lifecycle extension benchmark for 3–4 creative variants. Equation: (1−m×0.30)/(1−m×0.80)=1.40 → m=0.49 | Mynt Agency (2025); Strategus OTT benchmark (2025) |
| Adstock → fatigue increment | 0.28 | Back-calculated targeting fatigue steady-state ≈ 0.48 [0,1] at medium load. increment = 0.48×(1−α)/(adstock_norm_SS×div_factor) | Derived from Strategus (2025) OTT wear-out cycle |
| Personalization → relevance (β) | 0.40 | Personalized ads increase ad tolerance by ~40% | Google/Ipsos (2019) |
| Baseline churn rate | ~2%/mo | SVOD annual churn 20–25% → monthly 1.7–2.1%. Logit intercept calibrated accordingly. | Parks Associates (2024) |
| Post-ad drop-off baseline | 17% | Viewers abandoning content within 30s of mid-roll ad insertion | Conviva Streaming Benchmark (2023) |
| Ad-supported streaming share | 68% | Proportion of streaming subscribers using ad-supported options | Deloitte Digital Media Trends (2026) |
| Framework | Role in Model | Source |
|---|---|---|
| Advertising Value Model | Relevance, trust → satisfaction (+); intrusiveness, fatigue → satisfaction (−) | Ducoffe (1996); Brackett & Carr (2001) |
| Web Ad Intrusiveness Scale | Intrusiveness construct definition and item structure | Li, Edwards & Lee (2002) |
| Internet Ad Avoidance Model | Goal impediment, ad clutter, prior negative experience → avoidance behavior | Cho & Cheon (2004) |
| Adstock / Koyck Model | Carryover effect: adstock_t = exposure_t + λ × adstock_{t-1} | Koyck (1954); Leone (1995) |
| Ad Wear-out / Wearout Wearout | Fatigue accumulation and the short-term vs. long-term reversal pattern | Pechmann & Stewart (1988); Kronrod & Huber (2019) |
All code is available below. The full pipeline runs in a single Python environment. Click any block to expand.
# Evidence-Informed Synthetic Longitudinal Data Generator
# Parameters calibrated from published literature — see Parameter Table above
from dataclasses import dataclass
import numpy as np
@dataclass
class EffectProfile:
# All coefficients in 5-point scale absolute units (not standardized)
# This ensures between-condition differences are visible in output
name: str = "base"
personalization_to_relevance: float = 1.20 # Google/Ipsos 2019: +40% tolerance
diversity_fatigue_mitigation: float = 0.49 # Back-calc: 40% lifecycle extension
adload_to_intrusiveness: float = 0.28 # Li, Edwards & Lee (2002)
adstock_to_fatigue_increment: float = 0.28 # Back-calc: SS fatigue ≈ 0.48 at 4.5min/hr
relevance_to_satisfaction: float = 0.40 # Ducoffe (1996); Kim & Han (2014)
intrusiveness_to_satisfaction: float = -0.35
fatigue_to_satisfaction: float = -0.32
trust_to_satisfaction: float = 0.35
continuance_to_churn_logodds: float = -0.80
fatigue_to_churn_logodds: float = 1.20 # Parks Associates 2024: ~2%/mo baseline
def simulate_one_scenario(cfg, ep):
"""
Core longitudinal data generator.
Time-varying dynamics:
[1] Adstock: adstock_t = exposure_t + λ × adstock_{t-1} [Koyck 1954]
[2] Fatigue: AR(1) in bounded [0,1] state with variety mitigation
[3] Latent constructs: generated in absolute 5-pt scale units
[4] Behavioral outcomes: logistic models calibrated to benchmarks
"""
fatigue_state = rng.uniform(0.02, 0.06, size=n) # New subscriber: minimal prior fatigue
adstock_state = np.zeros(n)
for month in range(1, cfg.n_months + 1):
# Adstock update (Koyck carryover)
adstock_state = ad_exposure + cfg.adstock_lambda * adstock_state
adstock_norm = adstock_state / (adstock_state + 180.0)
# Fatigue update: AR(1) with variety mitigation (Kronrod & Huber 2019)
fat_increment = (ep.adstock_to_fatigue_increment * adstock_norm
* (1 - ep.diversity_fatigue_mitigation * diversity))
fatigue_state = np.clip(cfg.fatigue_persistence * fatigue_state
+ fat_increment + noise, 0, 1)
# Satisfaction structural model (Ducoffe 1996)
satisfaction_lat = (3.00
+ ep.relevance_to_satisfaction * (relevance_lat - 3.0)
+ ep.trust_to_satisfaction * (trust_lat - 3.0)
+ ep.intrusiveness_to_satisfaction * (intrusiveness_lat - 2.5)
+ ep.fatigue_to_satisfaction * (fatigue_lat - 2.5)
+ re_satisfaction)
# Churn intent: logistic, calibrated to ~2%/month (Parks Associates 2024)
churn_logit = (-4.20
+ ep.continuance_to_churn_logodds * (continuance_lat - 3.0)
+ ep.fatigue_to_churn_logodds * fatigue_state
+ 0.25 * price_sensitivity)
# ── CFA: Confirmatory Factor Analysis ──────────────────────────────
model_spec = """
Relevance =~ relevance_1 + relevance_2 + relevance_3
Intrusiveness =~ intrusiveness_1 + intrusiveness_2 + intrusiveness_3
Trust =~ trust_1 + trust_2 + trust_3
Fatigue =~ fatigue_1 + fatigue_2 + fatigue_3
Satisfaction =~ satisfaction_1 + satisfaction_2 + satisfaction_3
Continuance =~ continuance_1 + continuance_2 + continuance_3
"""
model = semopy.Model(model_spec)
model.fit(df_month6[item_cols])
fit_stats = semopy.calc_stats(model)
# ── GEE: Generalized Estimating Equations ──────────────────────────
# GEE chosen over LMM because ad condition variables are constant
# within members (between-subject design), causing singularity in
# LMM's random effect estimation. GEE with exchangeable correlation
# structure provides valid inference for this design.
from statsmodels.genmod.generalized_estimating_equations import GEE
from statsmodels.genmod.families import Gaussian
from statsmodels.genmod.cov_struct import Exchangeable
gee_m2 = GEE.from_formula(
"satisfaction_score ~ time_c + load_z + pers_z + fatigue_score",
groups=df["member_id"], data=df,
family=Gaussian(), cov_struct=Exchangeable()
).fit()
# ── Cross-Lagged Panel Model ───────────────────────────────────────
# Within-person demeaning removes between-subject confounds,
# isolating the lagged temporal relationship.
for col in ["fatigue_score", "satisfaction_score", "fat_lag1", "sat_lag1"]:
m = df.groupby("member_id")[col].transform("mean")
df[col + "_dv"] = df[col] - m
path_A = smf.ols("satisfaction_score_dv ~ fat_lag1_dv + sat_lag1_dv + time_c",
data=df).fit(cov_type="HC3")
path_B = smf.ols("fatigue_score_dv ~ sat_lag1_dv + fat_lag1_dv + time_c",
data=df).fit(cov_type="HC3")
# ── Survival Analysis ──────────────────────────────────────────────
# Weibull AFT for covariate inference; Kaplan-Meier for visualization.
waf = WeibullAFTFitter(penalizer=0.01)
waf.fit(surv_df, duration_col="duration", event_col="event")
Full source code: ads_experience_synthetic_v2.py (simulation engine) · ads_analysis_pipeline.py (analysis pipeline) · Python 3.12 · statsmodels 0.14.6 · lifelines 0.30.3 · semopy 2.3.11
| Construct | Definition | Theoretical Basis |
|---|---|---|
| Relevance | Perceived informativeness and personal relevance of ads shown | Ducoffe (1996) Ad Value Model |
| Intrusiveness | Perceived interruption and goal impediment from ad insertion. Distinct from irritation — it is the cognitive perception that the ad has disrupted the viewing flow, regardless of emotional valence. | Li, Edwards & Lee (2002) |
| Trust | Perceived credibility and trustworthiness of ads shown | Choi & Rifon (2002) |
| Ad Fatigue | Accumulated sense of weariness from repeated ad exposure over time (time-varying) | Pechmann & Stewart (1988) |
| Satisfaction | Overall satisfaction with the viewing experience during the period | Ducoffe (1996); Brackett & Carr (2001) |
| Continuance Intent | Intention to continue using the service in the coming months | Bhattacherjee (2001) |
χ²(120) = 110.67, p = .718. A non-significant χ² indicates good model-data fit. Note on perfect fit indices: CFI = 1.000 and RMSEA = .000 are mathematically inevitable when the data-generating process exactly mirrors the assumed factor structure — as it does here by construction. This is a known limitation of evaluating measurement models on synthetic data. In practice, real survey data from streaming members would introduce correlated residuals (adjacent items sharing method variance), measurement drift over time, and respondent heterogeneity. A realistic expectation for a well-designed real study would be CFI ≈ .95–.98 and RMSEA ≈ .03–.06. The Trust construct's weaker performance (AVE = .387) is the more meaningful finding here — it is not an artifact of the simulation, but reflects genuine multi-dimensionality in how members conceptualize ad credibility.
| Construct | Items | Std. Loading Range | AVE | CR | α | Verdict |
|---|---|---|---|---|---|---|
| Satisfaction | 3 | .842 – .847 | .712 | .881 | .881 | ✓ Strong |
| Fatigue | 3 | .820 – .833 | .685 | .867 | .867 | ✓ Strong |
| Intrusiveness | 3 | .782 – .789 | .618 | .829 | .829 | ✓ Good |
| Continuance | 3 | .762 – .776 | .592 | .813 | .814 | ✓ Good |
| Relevance | 3 | .718 – .736 | .529 | .771 | .771 | ✓ Adequate |
| Trust | 3 | .596 – .651 | .387 | .655 | .654 | △ Weak |
AVE = Average Variance Extracted (threshold ≥ .50); CR = Composite Reliability (threshold ≥ .70). Trust falls below both thresholds, indicating its three items do not converge sufficiently on a single factor. This likely reflects the multi-dimensional nature of ad trust (brand trust vs. data privacy trust vs. ad content credibility). A revised instrument would separate these facets.
Each diagonal cell = AVE. Off-diagonal cells = squared inter-factor correlation (r²). Discriminant validity holds when the diagonal exceeds all values in the same row and column.
| Relevance | Intrusiveness | Trust | Fatigue | Satisfaction | Continuance |
|---|
The Satisfaction ↔ Continuance pair fails the criterion (r² = .830 exceeds both AVEs of .712 and .592). This is expected — in consumer research, overall satisfaction and continuance intention are conceptually very close constructs. Practically, they can be treated as a combined "loyalty" dimension. Trust also fails against Satisfaction (r² = .428 > AVE .387), consistent with its convergent validity weakness.
Across all conditions, satisfaction declines monotonically from month 1 to month 12 as ad fatigue accumulates. The effect is most pronounced under high ad load (6.5 min/hr), where average satisfaction drops from 2.84 to 2.20 — a 0.64-point decline on the 5-point scale.
Generalized Estimating Equations were used to model repeated satisfaction measurements while accounting for within-member correlation (exchangeable working correlation structure). Three nested models were compared using QIC (Quasi-likelihood under the Independence model Criterion).
| Model | Predictors | QIC | ΔQIC | Verdict |
|---|---|---|---|---|
| M1 Basic | Time + Ad Load + Personalization | 34,681 | — | |
| M2 + Fatigue | M1 + Fatigue Score | 34,679 | −2 | ✓ Selected |
| M3 + Interaction | M2 + Load × Personalization | 34,688 | +7 | Not supported |
| Predictor | β | SE | z | p | Interpretation |
|---|---|---|---|---|---|
| Intercept | 3.734 | .017 | 215.9 | *** | Baseline satisfaction at average conditions |
| Time (centered) | −0.031 | .001 | −10.8 | *** | Satisfaction declines ~0.03 points per month |
| Ad Load (z-scored) | −0.353 | .009 | −38.9 | *** | 1 SD increase in ad load (= 2 min/hr) → −0.35 satisfaction |
| Personalization (z-scored) | +0.200 | .009 | +22.8 | *** | 1 SD increase in personalization → +0.20 satisfaction |
| Fatigue Score | −0.314 | .006 | −56.6 | *** | 1-point fatigue increase → −0.31 satisfaction |
| Load × Personalization | −0.001 | .011 | −0.08 | .933 | Interaction not significant (M3 not supported) |
*** p < .001. β values are unstandardized GEE estimates. Load and Personalization z-scored (SD=2 min/hr and SD=0.25 respectively) for comparability.
Two-way ANOVA on month-12 satisfaction confirms large independent effects of both ad load (η² = .297) and personalization (η² = .083), with no significant interaction (η² = .000, p = .855). Ad load and personalization operate as additive, independent levers.
The range from worst condition (high load + low personalization: 1.91) to best condition (low load + high personalization: 3.56) spans 1.65 points on the 5-point scale — a substantial effect with meaningful real-world implications for member experience.
A Weibull AFT model regressed time-to-first-churn-intent on member-level average fatigue, satisfaction, ad load, personalization, and price sensitivity. Key finding: ad load does not directly predict when members develop churn intent. Fatigue and satisfaction do.
| Predictor | Coef | exp(coef) | p | Interpretation |
|---|---|---|---|---|
| Mean Fatigue | −0.301 | .740 | *** | Higher fatigue → churn intent arrives 26% sooner |
| Mean Satisfaction | +0.289 | 1.336 | *** | Higher satisfaction → churn intent delayed 34% |
| Price Sensitivity | −0.255 | .775 | ** | Price-sensitive members reach churn intent sooner |
| Ad Load | +0.008 | 1.008 | .634 | Not significant — effect is fully mediated by fatigue |
| Personalization | +0.005 | 1.005 | .961 | Not significant — effect mediated by satisfaction/fatigue |
To test the temporal directionality of the fatigue–satisfaction relationship, I applied a within-person demeaned cross-lagged model. This removes all stable between-person differences (including condition effects) and tests whether changes in one variable precede changes in the other.
| Path | β | SE | t | p | R² |
|---|---|---|---|---|---|
| Path A: Fatiguet−1 → Satisfactiont | −0.098 | .006 | −16.79 | *** | .058 |
| Path B: Satisfactiont−1 → Fatiguet | −0.034 | .005 | −6.88 | *** | .253 |
Both paths are statistically significant, confirming a bidirectional relationship. However, Path A is approximately 3× stronger than Path B (|−0.098| vs |−0.034|). This indicates that fatigue is the dominant temporal antecedent of satisfaction, not the reverse. Members who feel more fatigued in month t−1 report meaningfully lower satisfaction in month t, even after controlling for their prior satisfaction level.
The mediation finding has a direct product implication: optimizing fatigue management is a more tractable target than ad load reduction, because it can be addressed through product levers (break placement, creative rotation frequency, personalization quality) that don't directly reduce ad inventory or revenue. A 40% reduction in fatigue accumulation through creative diversity — as estimated from OTT industry benchmarks — could meaningfully extend the time before members reach dissatisfaction thresholds.
Ad fatigue should be measured as a time-varying construct within longitudinal survey designs, not a single cross-sectional measure. The AR(1) dynamics observed here suggest that surveys administered at months 3–4 will underestimate eventual steady-state fatigue, while surveys administered after month 8 will better capture the plateau. Diary study designs or embedded in-app pulse surveys (1–2 items per session) would provide higher temporal resolution than traditional monthly surveys.
This demonstration illustrates the value of connecting attitudinal survey data (what members say) with behavioral signals (what they do: drop-off rates, episode completion, churn). The Weibull AFT finding — that attitudinal fatigue predicts churn timing more directly than ad load — would be impossible to detect from behavioral data alone, and invisible from survey data without longitudinal follow-up.
| Limitation | Impact | How to Address in Real Study |
|---|---|---|
| Synthetic data cannot capture real member heterogeneity | Effect sizes may differ substantially | Pilot survey (n≈200) to recalibrate parameters |
| AR(1) fatigue model assumes monotonic accumulation | Underestimates long-term fatigue decay (Kronrod & Huber reversal) | Extended observation window (>18 months) with non-linear growth model |
| Trust construct has weak AVE (.387) | Trust-related path coefficients are attenuated | Revise to distinguish brand trust, privacy comfort, content credibility |
| Single-period condition assignment (members in one condition throughout) | Cannot test within-person condition changes | Crossover design or randomized condition change at mid-study |
| No content type moderator | Fatigue may differ by content genre (sports vs. drama vs. series) | Add content-type as a moderator in the structural model |
This project is designed as a methodological bridge: it demonstrates how I would enter a new product domain, translate business questions into measurable constructs, generate evidence-informed synthetic data, and prepare a validated analysis plan — before working with real member-level data.
My research background is in educational psychology, psychometrics, and quantitative methods — not advertising or consumer product research. Rather than claiming experience I don't have, I chose to demonstrate how I would approach an unfamiliar product domain: by grounding the problem in published theory, building a transparent and testable measurement framework, and applying longitudinal methods appropriate to the research question.
In short: I can translate a product question into a measurable longitudinal research design, build an evidence-informed synthetic prototype before accessing internal data, and identify which behavioral and attitudinal signals should be validated with real member data. That is what this portfolio demonstrates.
This framework — evidence-informed synthetic data, factorial sensitivity analysis, and a full CFA → GEE → Survival → CLPM pipeline — represents how I would design and analyze a first study before having access to real member data.
| ✓ | Survey instrument design & psychometric validation |
| ✓ | Confirmatory Factor Analysis (CFA) & SEM |
| ✓ | Longitudinal modeling (GEE, LMM, growth models) |
| ✓ | Survival / event history analysis |
| ✓ | Cross-lagged panel models & temporal ordering in longitudinal observational data |
| ✓ | Factorial design & sensitivity analysis |
| ✓ | Simulation-based research design |
| ✓ | Python (statsmodels, lifelines, semopy, scikit-learn) |
| ✓ | R (lavaan, lme4, survival) — for cross-validation |
| → | Conjoint analysis & MaxDiff (actively developing) |
Theoretical frameworks, empirical benchmarks, and industry sources used in parameter calibration and model design.
| Reference | Role in This Study |
|---|---|
| Bhattacherjee, A. (2001). Understanding information systems continuance: An expectation-confirmation model. MIS Quarterly, 25(3), 351–370. | Theoretical basis for Continuance Intention construct |
| Brackett, L. K., & Carr, B. N. (2001). Cyberspace advertising vs. other media: Consumer vs. mature student attitudes. Journal of Advertising Research, 41(5), 23–32. | Ad value → satisfaction path coefficients |
| Cho, C.-H., & Cheon, H. J. (2004). Why do people avoid advertising on the internet? Journal of Advertising, 33(4), 89–97. | Ad avoidance model; intrusiveness → churn pathways |
| Choi, S. M., & Rifon, N. J. (2002). Antecedents and consequences of web advertising credibility. Journal of Interactive Advertising, 3(1), 12–24. | Trust construct theoretical basis |
| Conviva. (2023). State of Streaming. Conviva Inc. | Post-ad drop-off baseline (~17%); behavioral benchmarks |
| Deloitte. (2026). Digital Media Trends Survey. Deloitte Insights. | Ad-supported streaming adoption rate (~68% of subscribers) |
| Ducoffe, R. H. (1996). Advertising value and advertising on the web. Journal of Advertising Research, 36(5), 21–35. | Advertising Value Model; relevance/trust → satisfaction (+), intrusiveness → satisfaction (−) |
| Fornell, C., & Larcker, D. F. (1981). Evaluating structural equation models with unobservable variables and measurement error. Journal of Marketing Research, 18(1), 39–50. | AVE and CR thresholds; Fornell-Larcker discriminant validity criterion |
| Kim, Y. J., & Han, J. (2014). Why smartphone advertising attracts customers: A model of Web advertising, flow, and personalization. Computers in Human Behavior, 33, 256–269. | Mobile advertising meta-analytic path coefficient estimates |
| Kronrod, A., & Huber, J. (2019). Ad wearout wearout: How time can reverse the negative effect of frequent advertising repetition on brand preference. International Journal of Research in Marketing, 36(2), 306–324. | Fatigue persistence estimates; short-term vs. long-term reversal pattern; model limitation |
| Koyck, L. M. (1954). Distributed Lags and Investment Analysis. North-Holland. | Adstock carryover model structure: adstock_t = exposure_t + λ × adstock_{t-1} |
| Leone, R. P. (1995). Generalizing what is known about temporal aggregation and advertising carryover. Marketing Science, 14(3), G141–G150. | Adstock λ = 0.47 (meta-analytic median across 128 studies) |
| Li, H., Edwards, S. M., & Lee, J.-H. (2002). Measuring the intrusiveness of advertisements: Scale development and validation. Journal of Advertising, 31(2), 37–47. | Intrusiveness construct definition, scale structure, and items |
| Mynt Agency. (2025). Predicting Ad Fatigue: When to Refresh Your Creative. Retrieved from articles.myntagency.com | 40% lifecycle extension from creative rotation; TV refresh cycle benchmarks |
| Netflix. (2026, May). Netflix Upfront 2026 Presentation. Netflix, Inc. | 250M+ global monthly active viewers on ad-supported plan (2026) |
| Parks Associates. (2024). OTT Video Market Tracker. Parks Associates. | SVOD annual churn rate ~20–25%; monthly baseline ~1.9% calibration |
| Pechmann, C., & Stewart, D. W. (1988). Advertising repetition: A critical review of wearin and wearout. Current Issues and Research in Advertising, 11(1-2), 285–329. | Fatigue persistence across sessions; wear-out dynamics |
| Reuters. (2025). Netflix ad-supported tier reaches 94 million monthly active users. Reuters. | 2025 ad-tier MAU baseline (94 million) |
| Strategus. (2025). What is Ad Creative Fatigue & How to Minimize it on OTT/CTV Channels. Retrieved from strategus.com | OTT creative wear-out cycle 3–4 weeks; diversity mitigation parameter calibration |