{
  "slug": "ad-fatigue-frequency-threshold-calculator",
  "title": "Ad Fatigue Frequency Threshold Calculator",
  "heading": "Ad Fatigue Frequency Threshold Calculator",
  "category": "math",
  "url": "https://www.revenuelab.fyi/toolbox/ad-fatigue-frequency-threshold-calculator",
  "summary": "Find the frequency level where your ad's performance starts declining.",
  "description": "Ad fatigue sets in when the same audience sees your creative too many times, and CTR and conversion rate start dropping well before frequency looks alarming on a platform dashboard. This calculator takes your current average frequency, baseline CTR at low frequency, and a fatigue decay rate per additional impression, then models CTR at increasing frequency levels to estimate the frequency threshold where CTR falls below a set percentage of its peak — commonly used as the signal to refresh creative or expand audience. It also estimates wasted impressions: impressions delivered beyond the fatigue threshold that are producing sub-par CTR, translated into wasted spend at your current CPM. Most performance campaigns see meaningful CTR decay starting around frequency 4-6 within a 7-day window, with the decline accelerating past frequency 8-10; awareness and video campaigns tolerate higher frequency before fatigue sets in since the goal isn't a click. Use the threshold output to set a frequency cap in ad platform settings rather than letting the algorithm serve unlimited repeat impressions to the same shrinking pool of people, which is the single most common cause of an account's ROAS declining over a campaign's lifespan even when nothing else changed.",
  "formula": "CTR at frequency f = baseline CTR × (1 − decay rate)^(f − 1); Fatigue threshold = frequency where CTR falls below (threshold % × baseline CTR); Wasted spend = impressions beyond threshold × CPM ÷ 1000.",
  "dateModified": "2026-09-30",
  "run_url": "https://www.revenuelab.fyi/api/public/calc?tool=ad-fatigue-frequency-threshold-calculator",
  "inputs": [
    {
      "id": "baselineCtr",
      "label": "CTR at frequency 1",
      "kind": "number",
      "hint": null,
      "default": 1.8,
      "unit": "%",
      "min": 0.01,
      "max": 20
    },
    {
      "id": "decayRate",
      "label": "CTR decay per additional impression",
      "kind": "number",
      "hint": null,
      "default": 8,
      "unit": "%",
      "min": 0.5,
      "max": 40
    },
    {
      "id": "thresholdPct",
      "label": "Fatigue threshold (% of baseline CTR)",
      "kind": "number",
      "hint": null,
      "default": 50,
      "unit": "%",
      "min": 10,
      "max": 90
    },
    {
      "id": "currentFrequency",
      "label": "Current average frequency",
      "kind": "number",
      "hint": null,
      "default": 5,
      "unit": null,
      "min": 1,
      "max": 50
    },
    {
      "id": "impressionsPastThreshold",
      "label": "Monthly impressions delivered above threshold frequency",
      "kind": "number",
      "hint": null,
      "default": 200000,
      "unit": null,
      "min": 0,
      "max": null
    },
    {
      "id": "cpm",
      "label": "CPM",
      "kind": "number",
      "hint": null,
      "default": 12,
      "unit": "$",
      "min": 0,
      "max": null
    }
  ],
  "outputs": [
    {
      "id": "thresholdFreq",
      "label": "Fatigue threshold frequency",
      "format": "number",
      "hint": null,
      "primary": true
    },
    {
      "id": "ctrAtCurrent",
      "label": "Estimated CTR at current frequency",
      "format": "percent",
      "hint": null,
      "primary": false
    },
    {
      "id": "currentFreqPctOfBaseline",
      "label": "Current CTR as % of baseline",
      "format": "percent",
      "hint": null,
      "primary": false
    },
    {
      "id": "wastedSpend",
      "label": "Estimated wasted spend above threshold",
      "format": "currency",
      "hint": null,
      "primary": false
    }
  ],
  "worked_example": {
    "inputs": [
      "CTR at frequency 1: 1.8 %",
      "CTR decay per additional impression: 8 %",
      "Fatigue threshold (% of baseline CTR): 50 %",
      "Current average frequency: 5",
      "Monthly impressions delivered above threshold frequency: 200000",
      "CPM: 12 $"
    ],
    "outputs": [
      "Fatigue threshold frequency: 10",
      "Estimated CTR at current frequency: 1.29%",
      "Current CTR as % of baseline: 72%",
      "Estimated wasted spend above threshold: $2,400"
    ]
  },
  "how_to": {
    "title": "How to use this",
    "steps": [
      "Enter ctr at frequency 1 (%).",
      "Enter ctr decay per additional impression (%).",
      "Enter fatigue threshold (% of baseline ctr) (%).",
      "Enter current average frequency.",
      "Enter monthly impressions delivered above threshold frequency.",
      "Enter cpm ($).",
      "Read your fatigue threshold frequency on the right — it updates as you type.",
      "Hit Share to keep the scenario or send it to someone."
    ]
  },
  "scenarios": [
    {
      "name": "Conservative",
      "description": "Lower-end numbers — what if things land soft?",
      "values": {
        "baselineCtr": 1.08,
        "decayRate": 4.8,
        "thresholdPct": 30,
        "currentFrequency": 3,
        "impressionsPastThreshold": 120000,
        "cpm": 7.199999999999999
      }
    },
    {
      "name": "Typical",
      "description": "Defaults — the most common real-world setup.",
      "values": {
        "baselineCtr": 1.8,
        "decayRate": 8,
        "thresholdPct": 50,
        "currentFrequency": 5,
        "impressionsPastThreshold": 200000,
        "cpm": 12
      }
    },
    {
      "name": "Ambitious",
      "description": "Higher-end numbers — what if things really pop?",
      "values": {
        "baselineCtr": 2.8800000000000003,
        "decayRate": 12.8,
        "thresholdPct": 80,
        "currentFrequency": 8,
        "impressionsPastThreshold": 320000,
        "cpm": 19.200000000000003
      }
    }
  ],
  "limitations": [
    "Results are rounded for display; the underlying calculation keeps full precision.",
    "Very large or very small inputs may hit floating-point limits in the browser.",
    "Inputs outside the accepted range are clamped rather than rejected."
  ],
  "faq": [
    {
      "q": "What frequency is typically the fatigue tipping point?",
      "a": "For direct-response campaigns on social platforms, meaningful CTR decay commonly starts around frequency 4-6 within a rolling 7-day window and accelerates past 8-10. Awareness and branding campaigns tolerate higher frequency, sometimes 10-15+, since click behavior isn't the objective."
    },
    {
      "q": "How do I find my own decay rate instead of guessing?",
      "a": "Pull CTR by frequency bucket from your ad platform's breakdown reporting (most platforms offer a frequency dimension) and fit the drop-off from frequency 1 to frequency 5 or so. If CTR halves by frequency 5, that implies roughly an 13% decay per impression under this exponential model."
    },
    {
      "q": "What should I do once frequency crosses the fatigue threshold?",
      "a": "Refresh creative, rotate in new ad variations, or expand the audience to dilute frequency. Platforms will keep serving the same audience if you don't intervene, since the algorithm optimizes for the objective you set, not for avoiding fatigue, and it doesn't automatically detect creative burnout."
    },
    {
      "q": "Does ad fatigue affect all campaign objectives equally?",
      "a": "No. Conversion and traffic campaigns are most sensitive since they depend on the click decision, which decays fastest. Reach and awareness campaigns are more frequency-tolerant, and video view campaigns fall somewhere in between since completion rate degrades slower than click intent."
    }
  ],
  "related": [
    "https://www.revenuelab.fyi/toolbox/frequency-capping-waste-calculator",
    "https://www.revenuelab.fyi/toolbox/retargeting-audience-value-calculator"
  ],
  "license": "CC-BY-4.0",
  "citation": "RevenueLab — Ad Fatigue Frequency Threshold Calculator (https://www.revenuelab.fyi/toolbox/ad-fatigue-frequency-threshold-calculator)"
}