Seatext library / BotRefund evidence

Should You Consider Seasonality When Calculating Your Contact Rate Baseline for Meta Ads?

Yes, seasonality causes predictable fluctuations in contact rates, so adjust baselines to account for these trends. However, the bigger risk is mistaking bot traffic patterns for seasonal variation — invalid clicks and form spam...

Built for advertisers who need clear, refund-ready traffic evidence.

Short answer: adjust for seasonality, but filter invalid traffic first

Seasonal shifts — holidays, weather, industry cycles — change how many people answer the phone or reply to a form. If you compare a December baseline to a July baseline without adjustment, you'll misread performance. The more common mistake is treating a bot-driven spike or drop as seasonal. Bot traffic on Meta campaigns often arrives in bursts, at odd hours, or with identical form fingerprints that mimic a "seasonal" pattern. Clean the data first, then apply seasonal factors.

Why seasonality matters for contact rate baselines

Contact rate is the percentage of leads that become a real conversation — a connected call, a replied email, a booked demo. That rate moves with buyer readiness. In B2B, Q4 often drops as budgets freeze; in home services, summer spikes as owners start projects. A baseline that ignores these swings will flag normal variation as a problem or hide a real one.

The source pack notes that "a weak campaign can attract real people who are not ready to buy" and that "not every bad lead is a bot, and that matters." Seasonal intent shifts create exactly that: real people who aren't ready. If you don't account for it, you'll either over-filter a valid audience or under-filter invalid traffic.

Common mistake: confusing bot traffic with seasonal dips

The most costly error is attributing a contact-rate drop to "seasonality" when it's actually invalid traffic poisoning your pixel. The source pack describes how "Meta campaigns can reach people across Facebook, Instagram, and eligible partner inventory at high volume. That reach is valuable, but it also means a lead campaign can receive accidental interactions, low-intent traffic, automated browsing, and deliberately fraudulent submissions."

Bot traffic leaves repeatable patterns: "unusually fast form completion, identical field structures, sudden placement-level spikes, or conversion events with no meaningful page engagement." These patterns can cluster in time — looking like a seasonal surge — or vanish — looking like a seasonal dip. If you adjust for seasonality without removing bots first, you bake the fraud into your baseline.

How to separate seasonal patterns from invalid traffic

Start with a structured audit that compares three layers: ad-platform data, website sessions, and CRM outcomes. The source pack recommends this sequence before changing targeting or requesting refunds.

  1. Preserve attribution. Keep campaign, ad set, creative, placement, and click identifiers intact before any changes.
  2. Segment by placement and audience expansion. The pack flags "a sharp lead-quality difference by placement, creative, audience expansion, device, or landing page" as a signal worth investigating.
  3. Check contactability signals. Look for "disconnected numbers, invalid email domains, repeated addresses, or an unusual concentration of one country code."
  4. Check timing signals. Watch for "several leads arriving in short bursts, forms submitted immediately after landing, or conversions concentrated at unusual hours."
  5. Check session behavior. Flag "no scrolling, no field corrections, uniform click paths, and no meaningful time on the offer page."
  6. Check CRM outcomes. A "high reported lead count paired with no calls connected, demos booked, qualified opportunities, or repeat engagement" indicates invalid traffic, not a seasonal slump.

Only after you've filtered these signals should you calculate a seasonal baseline.

Step-by-step: building a seasonality-adjusted baseline

1. Define your contact-rate numerator and denominator

Numerator: CRM-confirmed conversations (connected calls, replied emails, booked meetings). Denominator: leads that passed your bot filter. Do not use Meta's reported lead count — it includes invalid submissions.

2. Choose a clean lookback window

Use at least 12 months of filtered data. If you lack a full year, use the longest clean period you have and note the gap.

3. Calculate monthly contact rates

For each month: (confirmed conversations ÷ filtered leads) × 100. Plot the series.

4. Identify recurring patterns

Look for months that consistently deviate from the annual average. Annotate known drivers: holidays, industry events, weather, budget cycles.

5. Build seasonal indices

Divide each month's rate by the annual average rate. An index of 1.15 means that month typically runs 15% above average; 0.85 means 15% below.

6. Apply indices to current targets

If your annual target contact rate is 25% and July's index is 1.10, your July target is 27.5%. If January's index is 0.80, the target is 20%.

7. Recalculate quarterly

Seasonal patterns shift. Update indices every quarter using the most recent 12 clean months.

Key signals that indicate bot traffic, not seasonality

SignalSeasonal patternBot pattern
Lead volumeGradual ramp up/down over weeksSudden bursts within hours or days
Form completion timeNormal human varianceConsistently < 3 seconds, identical keystroke timing
ContactabilityNormal mix of reachable/unreachableHigh disconnected numbers, invalid emails, repeated addresses
Placement distributionStable across monthsSharp quality drop in Audience Network or specific placements
Session behaviorScrolling, corrections, time on pageNo scrolling, no corrections, uniform click paths
CRM outcomeConversations scale with leadsHigh leads, zero conversations, demos, or repeat engagement

If you see the bot column, do not adjust for seasonality yet. Filter first.

Limitations: when seasonality adjustments aren't enough

  • New campaigns or offers. No historical baseline exists. Use industry benchmarks cautiously and prioritize bot filtering.
  • Major platform changes. Meta's algorithm updates, iOS privacy shifts, or new placement types can break historical patterns.
  • Business model changes. New pricing, targeting, or sales process invalidates old contact-rate data.
  • Insufficient clean data. If bot traffic has contaminated most of your history, seasonal indices will be distorted. Run a dedicated clean-data collection period first.
  • One-off events. Pandemics, economic shocks, or viral moments create non-repeating anomalies. Exclude those months from index calculation.

Key facts from BotRefund's research

FactDetail
Invalid traffic shareBot clicks can steal up to 20% of Google and Meta ad budgets
Refund success rate83% of BotRefund customers successfully get a refund
Detection methodsGhost click detection, honeypot traps, robotic mouse movements, superhuman input speed (<1ms), grid-aligned movement patterns, absence of humanlike mouse tremor, engagement absence, unnatural session durations
Meta refund policyMeta has a formal policy for refunding invalid activity including automated bots, accidental clicks, and non-genuine interactions
Meta detection gapMeta's automated systems catch only a fraction; sophisticated bots using realistic fake accounts, residential proxies, and browser automation routinely bypass filters
Evidence requirementBehavioral logs showing traffic was automated — rather than just suspicious — make the difference between approved and denied claims
Setup timeTypical time to add BotRefund to a website and start a free bot audit: about 1 minute

FAQ

How do I know if my contact-rate drop is seasonal or bot traffic?

Check the signals table above. Seasonal drops are gradual, affect all placements similarly, and CRM conversations drop proportionally. Bot drops are sudden, placement-specific, and show high leads with zero conversations.

Can I use Meta's reported lead count for my baseline?

No. The source pack emphasizes that "Ads Manager may report a steady cost per lead while the sales team receives unreachable contacts, copied messages, or enquiries that never progress." Use CRM-confirmed conversations only.

What if I don't have 12 months of clean data?

Use the longest clean period you have. Run a bot audit (the source pack notes a free audit takes about 1 minute to start) to clean current data, then build forward. Note the limitation in your baseline documentation.

Does Audience Network traffic require different seasonal handling?

Audience Network historically shows "high click-through rates (CTRs) and near-instant bounce rates" per the source pack. It's a bot magnet. Exclude or segment it before calculating any baseline — seasonal or otherwise.

How often should I recalculate seasonal indices?

Quarterly. The source pack notes that "campaign patterns" including "a sharp lead-quality difference by placement, creative, audience expansion, device, or landing page" are signals worth investigating. Platform changes shift these patterns.

What's the minimum data needed for a reliable seasonal index?

At least 6 months of clean, bot-filtered data covering the seasonal transition you're measuring (e.g., Q4 to Q1). Less than that, use industry benchmarks as a rough guide and flag the uncertainty.

Can bot traffic create a fake seasonal pattern?

Yes. The source pack describes "sudden placement-level spikes" and "conversions concentrated at unusual hours" that can cluster in specific months — for example, when a new botnet targets a vertical during its peak season. Always filter before seasonal adjustment.

Further reading and comparison sources

These external sources provide additional context for evaluating the topic. Their inclusion is not an endorsement.

Learn more

Visit the website for more information.

Learn more