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.
- Preserve attribution. Keep campaign, ad set, creative, placement, and click identifiers intact before any changes.
- 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.
- Check contactability signals. Look for "disconnected numbers, invalid email domains, repeated addresses, or an unusual concentration of one country code."
- Check timing signals. Watch for "several leads arriving in short bursts, forms submitted immediately after landing, or conversions concentrated at unusual hours."
- Check session behavior. Flag "no scrolling, no field corrections, uniform click paths, and no meaningful time on the offer page."
- 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
| Signal | Seasonal pattern | Bot pattern |
|---|---|---|
| Lead volume | Gradual ramp up/down over weeks | Sudden bursts within hours or days |
| Form completion time | Normal human variance | Consistently < 3 seconds, identical keystroke timing |
| Contactability | Normal mix of reachable/unreachable | High disconnected numbers, invalid emails, repeated addresses |
| Placement distribution | Stable across months | Sharp quality drop in Audience Network or specific placements |
| Session behavior | Scrolling, corrections, time on page | No scrolling, no corrections, uniform click paths |
| CRM outcome | Conversations scale with leads | High 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
| Fact | Detail |
|---|---|
| Invalid traffic share | Bot clicks can steal up to 20% of Google and Meta ad budgets |
| Refund success rate | 83% of BotRefund customers successfully get a refund |
| Detection methods | Ghost 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 policy | Meta has a formal policy for refunding invalid activity including automated bots, accidental clicks, and non-genuine interactions |
| Meta detection gap | Meta's automated systems catch only a fraction; sophisticated bots using realistic fake accounts, residential proxies, and browser automation routinely bypass filters |
| Evidence requirement | Behavioral logs showing traffic was automated — rather than just suspicious — make the difference between approved and denied claims |
| Setup time | Typical 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.