Knowledge

Weekday, Weekend, Holiday: How Block Rates Move With the Calendar

Nobody publishes scraper block rates by day of week. What bot, holiday and peak-event data shows about why they move, and how to measure your own calendar.

Matt Brown

Matt Brown

September 24, 2026 · 10 min read

Anyone who runs a crawler long enough notices it: the same job, against the same sites, with the same code, fails more on some days than others. Tuesday is fine. Saturday is worse. The last week of November is a different world. It is tempting to call that noise. It usually is not.

The honest starting point is that no public dataset measures scraper block rates by day of week or by holiday. The most recent large study of bot blocking, from the University of Bamberg in 2026, was a single scan over four days in early 2026, with no view of how blocking changes over time. What does exist is a good deal of data on the things that drive block rates: how the share of bot traffic moves when human traffic moves, what happens to defences at peak events, and when the people who change those defences stop changing them. Put together, they explain most of what crawler operators see.

Key takeaways

  • There is no published measurement of scraper block rates by weekday or holiday. Anyone quoting one should be asked for the method.
  • Bot share rises when human traffic falls. Cloudflare measured a drop of about 4% in overall traffic at weekends, but only about 1% for verified bots.
  • Peak shopping events bring more bots and heavier defences. Imperva measured bad bots at 26.3% of holiday-season retail traffic, against a 22.7% annual average.
  • The worst bot day is not always the famous one. Queue-it’s retail sample saw non-human traffic reach 83% of visits on 11 December 2024, not on Black Friday.
  • Change freezes are documented practice around peak season and the end of the year, so defences tend to change before and after, not during.

Why a calendar would move block rates at all

A site deciding whether to challenge or block a request is, in most modern setups, making a judgement against its current traffic. Three things on the calendar change that judgement:

  1. The mix of traffic. When humans leave, the automated traffic that remains is a larger share of the whole, and share is often what alarms defenders and models.
  2. The stakes. On a sale day or a ticket drop, a site cares far more about scalpers, credential stuffing and inventory hoarding, and tolerates more friction to stop them.
  3. The people. Rules are written and tuned by teams who take holidays and freeze changes at the moments that matter most.

Each has evidence behind it.

Weekends: humans leave, bots mostly don’t

Human internet traffic has a strong weekly rhythm. An analysis by the UK Office for National Statistics’ Data Science Campus of traffic at the London Internet Exchange found that “weekends tend to have lower traffic with mid-week days exhibiting the highest amounts,” with traffic around bank holidays about 7.8% lower on average, and the Christmas period lower still.

Automated traffic is steadier. Cloudflare’s analysis of January to July 2020 found that while a typical weekday sits slightly above average, weekends show “a drop of about 4% in overall traffic,” a pattern that “does not fully apply to verified bots, which only see a small 1% drop.” The same analysis found human traffic about 15% lower between midnight and 05:00 UTC and up to 25% higher between 14:00 and 17:00 UTC.

If a site’s automated traffic holds steady while its human traffic dips, the automated share rises, and so does the chance that any given automated request looks unusual. That is the most plausible mechanism behind worse weekend and overnight block rates, and it is why steady, schedule-free crawling can stand out more on a Sunday than a Tuesday.

There is an important counterexample. Integral Ad Science, measuring bot traffic in ad impressions over 391 days, found the opposite pattern for the bots it tracks: weekday bot traffic about 21.2% higher than at weekends, against only 6.9% for humans. Not all automation is steady. Fraud operations that mimic human schedules behave differently from crawlers, and a site’s defences see all of it at once. The weekly effect on your own block rate is an empirical question, per target.

Peak events: more bots, more friction

The shopping calendar concentrates both sides of the problem.

FindingSource
Bad bots were 26.3% of holiday-season retail traffic in 2023, against an annual average of 22.7%; account takeover attacks rose 85% on Black FridayImperva, November 2023
On Black Friday 2024, bots were up to 19% of e-commerce traffic and humans 81%; bots made 63% of login attempts, slightly down on a month earlier as human logins roseCloudflare, December 2024
Across Cyber Five 2025, 28% of requests came from a bot or a data center, down from 36% in 2024; 97% of suspicious visitors shown a challenge failed itQueue-it, 138 retailers, December 2025
Over the 2024 season, 46% of visits were flagged as bot or data center traffic; the worst day was 11 December, at 83%Queue-it, December 2024
Retailers in the 2025 sample deployed 787 waiting rooms, activated more than 2,000 times over the seasonQueue-it, December 2025

Two details are worth drawing out. First, the Cloudflare figures show that on the biggest day, human growth can actually dilute the bot share, because humans arrive in far larger numbers. A peak day is not necessarily the day your automated share looks worst. Second, the Queue-it figures show the worst day for non-human traffic falling in mid-December, not on Black Friday. Sites that tighten defences for a known event may keep them tight for weeks.

The practical consequence is that any crawler targeting retail, ticketing or travel should expect more challenges, more waiting rooms and lower tolerance from mid-November through December, whatever its own behaviour.

Holidays: quieter, and sometimes calmer

Holidays cut both ways. Human traffic falls: Cloudflare measured US traffic on Thanksgiving 2023 about 10% lower than the previous week. So, apparently, does some attack traffic. The same analysis found Thanksgiving had “the lowest percentage of traffic classified as DDoS attacks targeting the US” that month.

For a crawler, a public holiday in a target’s country combines lower human traffic, which raises the automated share, with a thinner staff on the defending side. The net effect on your block rate depends on the target. What is consistent is that holidays are local. A Tuesday in one country is a holiday in another, which is one more reason to measure per target and per market rather than globally.

Change freezes: when defences stop moving

Rules change when people change them, and people freeze changes at predictable times. This is documented practice, not folklore.

  • Shopify Engineering described a feature freeze that “starts several weeks before BFCM,” and a code freeze a few days before and during the event in which “only critical fixes can be deployed.”
  • GitLab defines a production change lock as “a complete pause on all production changes during periods of reduced team availability, such as major holidays.”
  • Cloudflare’s WAF managed rules follow “a seven-day release cycle, typically on Monday or Tuesday (adjusted for public holidays).”

Freezes make the peak season oddly stable once it begins: defences are tightened in the weeks before, then largely left alone. They also make January a season of change. Rules deferred over the holidays ship when teams return, which is when a crawler that worked all December can break with no change on its side.

Measure your own calendar

Since no public dataset answers the question for your targets, the only reliable answer is your own logs. The method is simple: compute block rate per target, per weekday and hour, in the target’s local time zone, and compare each slot against that target’s overall rate.

from collections import defaultdict
from datetime import datetime


def block_rate_by_slot(rows, tz=None, min_requests=50):
    """rows: (target, iso_timestamp, blocked). Block rate per target, weekday and hour."""
    counts = defaultdict(lambda: [0, 0])
    for target, ts, blocked in rows:
        t = datetime.fromisoformat(ts)
        if tz is not None:
            t = t.astimezone(tz)
        slot = (target, t.strftime("%a"), t.hour)
        counts[slot][0] += 1
        counts[slot][1] += int(blocked)
    return {
        slot: round(b / n, 3)
        for slot, (n, b) in counts.items()
        if n >= min_requests
    }

Count soft blocks as blocks, not only error codes, since a challenge page served with a success status is still a refusal; the silent failure rate covers how to detect them. Keep at least a few weeks of history before drawing conclusions, and mark known events and local holidays so one bad Black Friday does not become your model of every Friday.

Scheduling around it

Once you know your targets’ calendars, a few adjustments follow naturally.

  • Baseline per weekday, not per day. A health score that compares Saturday against a weekday average will cry wolf every weekend. Compare like with like, as described in building a target health score.
  • Move flexible work to good slots. Refreshes that do not need to run on a specific day can shift to the hours and days where a target is most tolerant. Cost-aware crawl scheduling already weighs each visit by cost; a higher expected block rate is a higher cost.
  • Ease off at a target’s peak. A retailer on its biggest sale day is protecting real customers under real load. Lower concurrency and longer intervals during known events are good manners and good sense, and backpressure should do this automatically when block rates rise.
  • Watch January. Expect defences to change as freezes lift, and keep canaries running so you notice within hours, not weeks.
  • Collect from the market’s own time zone and vantage point. Holidays and daily rhythms are local, and so is what a site serves. A country-targeted residential exit, such as country-de on Shifter’s gateway, lets a crawler see a German site as a German visitor would on a German holiday.

The bottom line

Block rates move with the calendar for understandable reasons: automated traffic is steadier than human traffic, so its share rises when people log off; peak events bring more bots and heavier defences for weeks around them; and the teams behind those defences freeze changes during the busiest periods and resume after them. None of that has been measured directly for scrapers in any public dataset, and the evidence is not uniform: some bot traffic follows human schedules closely.

That makes the calendar a question each team has to answer from its own data. Break your block rate down by target, weekday and hour, mark the holidays and sale events, and schedule accordingly. The pattern you find will be specific to your targets, and far more useful than any global average.

Sources and references

Ready to get started?

Try Shifter's residential proxies, 205M+ IPs, 195+ countries, from $0.10/GB.

Get Started