DealMonitor Logo
Back to Blog
When shops lock us out — why some prices don't refresh

When shops lock us out — why some prices don't refresh

·by DealMonitor Team·5 min read
scrapingbot-protectionreliabilitytransparency

Over the past few days you've been sending us the same kind of messages: "My Otto tracker has been stuck on the same price for days," "Adidas shows €6 even though the item costs €70," "Why isn't this price moving?" The answer is the same in all three cases — and it has nothing to do with our scraper, it has to do with the fact that the shop deliberately doesn't let us in. Here's what's actually happening, and what we shipped a few days ago to handle it properly.

How a price gets refreshed in the first place

When your tracker is due for a check, this little pipeline runs in the background:

  1. HTTP request — we fetch the product page like a regular browser and read the source
  2. Price detection — our ML model finds the price in the page, compares it against the reference price, confirms the match
  3. Headless-browser fallback — if the fast HTTP path comes up empty (too much JavaScript, dynamic pricing), we render the page in a real browser on a separate server

For the vast majority of shops — Amazon, IKEA, MediaMarkt, Cyberport, Zalando, hsnstore, and a few thousand others — this works fine. You never notice the pipeline, the price is just current.

What's different about Otto and Adidas

Otto and Adidas (and a handful of other big brands) have added a particular kind of protection in recent months: commercial bot detection. The specific vendors are Kasada (Otto) and DataDome (Adidas). These aren't simple captchas — they're sophisticated fingerprinting systems that evaluate hundreds of browser signals (canvas rendering, WebGL, audio context, timing patterns, mouse movement) and decide in milliseconds: human or machine?

Our answer is always the same: machine. Which is true. And then this happens:

Instead of the real product page (typically 200–400 KB of HTML with images, descriptions, prices), we get back a tiny challenge page — at Otto that's exactly 912 bytes. Content: a bit of JavaScript initialisation, a hint that a browser should solve a challenge. No price, no product name, nothing useful.

The real problem wasn't the wall — it was our reaction to it

Until recently our scraper treated these 912-byte pages the same as any other "empty" response: no price found, try something else. In practice that meant: after three such empty attempts, the system assumed the headless browser was broken, switched to a different strategy, found nothing there either, switched back, and so on — endless back-and-forth between strategies that all have zero chance of working.

From your perspective: price stuck for days, occasional "tracker is having issues" emails, sometimes a false mismatch alert when a stray digit got extracted from the 912 bytes (which was exactly the Adidas case: from a 403 error page our ML model fished out "6.0" and reported it — for a shoe that costs €70).

What we changed

Instead of blindly retrying, the scraper now recognises the typical signatures of these bot walls:

  • For Kasada: characteristic KPSDK initialisation, KP_UIDz tokens in script URLs, hidden iframe
  • For DataDome: references to js.datadome.co, dd-captcha-container elements, ddjskey configuration

As soon as one of these signatures shows up in a short response (< 10 KB), it's clear: this is a challenge page, not a product page. Three direct consequences:

  1. No more failure counters — the shop doesn't get bounced between scraping strategies because no strategy switch will fix the problem
  2. No more false mismatch alerts — we know there's no real price, so we don't alert on one
  3. Visibility in the daily status — our daily health report now shows a line 🛡️ Bot protection blocks N shops, broken down by vendor

What this means for your tracker

If you have a tracker for otto.de or adidas.de that hasn't updated since May 24th: it's not the tracker, it's that the shop systematically locks us out. We mark that cleanly internally now, you won't get "tracker broken" alerts, and your last stored price stays put.

But it also means honestly: as long as these bot walls are active, we can't actively track the price. We don't attempt technical bypasses — that would be an endless arms race, and the bot-protection vendors ship updates weekly.

What we plan to do instead

The clean way to get Otto and Adidas prices is via official product feeds through affiliate networks like Awin. Both shops offer daily XML feeds with all their products and prices — no scraping, no bot walls, just reliable data. We're applying for inclusion; once approved (typically 1–4 weeks), trackers for those shops will be served via the feeds.

Until then: a bit of patience. And if you've been wondering whether you did something wrong — you haven't. Neither have we. Some doors are just closed.

While we were in there: backend cleanup

While looking at the bot walls we also noticed our backend container never quite cleaned up its embedded Chrome pool — over long uptimes it accumulated memory until the dashboard would hang. So we did two things: a safety net that restarts the container before it hits its memory cap, and (the cleaner step) took Chrome out of the backend entirely — the running browser now lives only in the scheduler container, where it belongs. If you experienced dashboard hangs in recent days: those should be gone now.

What's next

Early June: affiliate applications for the most important shops. In parallel: persistent browser sessions in the scheduler (for more stable detection on dynamic shops) and the Microsoft Edge version of our browser extension. If you have topics or shops that matter especially to you — a quick email to [email protected].

Ready to Never Miss a Deal Again?

Start tracking prices in seconds. No credit card required.

Start for Free

Related Posts

We now read every shop's terms of service — and we're failing at exactly the right step

We now read every shop's terms of service — and we're failing at exactly the right step

6 min read

Three small features that make DealMonitor better in everyday use

Three small features that make DealMonitor better in everyday use

4 min read

Smarter Price Alerts and Self-Healing Trackers

Smarter Price Alerts and Self-Healing Trackers

3 min read

邀请好友,解锁更多追踪名额

邀请好友,解锁更多追踪名额

阅读时间 3 分钟

导入您的愿望清单 — Steam 和 Amazon 一键导入

导入您的愿望清单 — Steam 和 Amazon 一键导入

4 分钟阅读

DealMonitor 一周年:从创意到价格追踪器

DealMonitor 一周年:从创意到价格追踪器

阅读时间 4 分钟

v0.12: HTTP-First Scraping and the End of Selenium Dependency

v0.12: HTTP-First Scraping and the End of Selenium Dependency

5 min read

政权更迭:CatBoost 如何取代了我们之前的价格检测模型

政权更迭:CatBoost 如何取代了我们之前的价格检测模型

5 分钟阅读

The 5 Best Price Comparison Tools in 2026 — Compared

The 5 Best Price Comparison Tools in 2026 — Compared

7 min read

Amazon Price History: How to Track Prices the Right Way

Amazon Price History: How to Track Prices the Right Way

6 min read

v0.11: API Integrations for Etsy, Game Stores, and Multi-Price Tracking

v0.11: API Integrations for Etsy, Game Stores, and Multi-Price Tracking

5 min read

现在就开始关注圣诞礼物?没错,三月正是好时机。

现在就开始关注圣诞礼物?没错,三月正是好时机。

5 分钟阅读

v0.10: Tackling Amazon and AliExpress with APIs

v0.10: Tackling Amazon and AliExpress with APIs

5 min read

网店如何诱骗你购买——以及如何反击

网店如何诱骗你购买——以及如何反击

8 分钟阅读

DealMonitor 正式进入测试版:全新功能一览

DealMonitor 正式进入测试版:全新功能一览

5 分钟阅读

智能网购终极指南:从新手到省钱达人

智能网购终极指南:从新手到省钱达人

7 分钟阅读

v0.8: Dark Mode, Error Monitoring, and Our First Blog Posts

v0.8: Dark Mode, Error Monitoring, and Our First Blog Posts

4 min read

v0.7: Web Push Notifications and Dashboard Search

v0.7: Web Push Notifications and Dashboard Search

5 min read

AI如何在任何网站上检测价格:技术原理详解

AI如何在任何网站上检测价格:技术原理详解

7 分钟阅读

v0.6: Telegram Notifications, Tracker Groups, and Sharing

v0.6: Telegram Notifications, Tracker Groups, and Sharing

4 min read

通过价格提醒省钱的5种方法

通过价格提醒省钱的5种方法

6 分钟阅读

v0.5: Google OAuth and 9 Languages from Day One

v0.5: Google OAuth and 9 Languages from Day One

4 min read

如何在线追踪价格:从入门到精通的完整指南

如何在线追踪价格:从入门到精通的完整指南

5 分钟阅读

When shops lock us out — why some prices don't refresh