Product
Scrape monitoring, because the worst failure is silent
Scrape monitoring is the practice of watching the collection pipeline itself, not just the prices it produces. It measures coverage, meaning how many tracked listings returned a valid price, and freshness, meaning how recently each one did. Good scrape monitoring detects a source that quietly stopped updating before anyone prices against a stale number.
The expensive failure here is almost never a wrong price. It is a price that stopped updating while the dashboard still looked fine. A scraper that breaks loudly gets fixed the same day. One that breaks quietly leaves last Tuesday's number on screen, and by then a repricing rule has run on it for a week. Scrape monitoring makes that silence impossible: coverage and freshness measured per source, automatic repair when extraction breaks, and an alert on degradation rather than on disappearance.
How a price feed goes quiet without an error
The mechanics matter, because the abstraction hides the problem. A retailer redesigns a product page and moves the price out of the server-rendered HTML into a component a script writes after load. Nothing errors. The fetch returns HTTP 200. The parser finds an empty placeholder and returns nothing.
What happens next decides whether you lose money. A naive pipeline reads an empty result as no change and keeps the previous value. The listing shows $159.00 in every view, export and rule, the chart stays a smooth line, and the one honest signal, the age of that number, is nowhere on screen.
What a silent failure looks like
- The last good price sits on screen with no age beside it.
- One domain of eleven stopped, so the overall total barely moves.
- The history chart is interpolated straight across the gap.
- The alert channel is quiet, because no price changed.
- It surfaces when somebody opens the competitor site by hand.
What scrape monitoring shows instead
- Every price carries its capture time. Stale values are marked stale.
- Coverage and freshness are broken out per domain and per category.
- A gap in collection renders as a gap. Nothing is interpolated.
- The degradation itself raises the alert.
- You are told before you notice.
Why totals hide it: track eleven competitor domains, let one go dark, and overall coverage falls to about 91 percent, because 10 / 11 = 0.909. That reads like rounding. It is every price from one competitor being a week old.
Coverage and freshness, the two measures scrape monitoring reports
- Coverage
- The share of tracked product-competitor pairs that returned a valid, plausible price in the most recent collection cycle. Coverage answers whether the number exists.
- Freshness
- The age of the newest good observation for each pair, measured against the refresh interval your plan expects. Freshness answers whether the number is from today.
Coverage, worked. A store tracks 4,200 product-competitor pairs and 4,061 returned a valid price last night, so coverage was 4,061 / 4,200 = 0.967, or 96.7 percent. The 139 that did not are listed and grouped by cause.
Freshness, worked. On the Growth plan the expected interval is 12 hours, so a pair whose newest observation is 31 hours old has missed two cycles. Freshness is the share of pairs inside 1.5 times that interval, 18 hours here, reported with the oldest pair per category so nothing hides in an average.
| Coverage | Freshness | What is actually happening | What we do |
|---|---|---|---|
| High | High | Healthy. Prices exist and they are from this cycle | Nothing. This is the normal state |
| High | Low | The dangerous state. Values present but old, usually a source serving cached pages | Zero-variance detection marks the source degraded and the prices stale wherever they appear |
| Low | High | Something broke recently and cleanly. What arrived is current | Regeneration and re-discovery run automatically, and failing pairs are listed by cause |
| Low | Low | A source has failed for more than one cycle without repair | An incident opens, you are alerted, and affected pairs leave repricing until they recover |
A dashboard that reports only coverage reads green in row two, which is the row that costs money.
Data quality — source health
Coverage
98.8%
of tracked URLs
Checks today
1,106
Auto-healed (7d)
7
▲ no data gaps
Human queue
2
awaiting review
| Source | Method | Coverage | Last full pass | Status |
|---|---|---|---|---|
| Voltbay | Structured data | 100% | 38 min ago | Healthy |
| Harborline | Domain recipe | 98.4% | 1 h 12 m ago | Self-healed Recipe regenerated 3 h ago after a layout change |
| PrimeDeck | Marketplace API | 99.6% | 22 min ago | Healthy |
| Casa & Kin | Domain recipe | 96.1% | 2 h 04 m ago | Degraded 12 URLs returning 404 — queued for re-discovery |
| Belmont Direct | Structured data | 100% | 51 min ago | Healthy |
Incident log
- Today 04:12HarborlinePrice selector returned null on 214 URLs.New extraction recipe generated and validated — live 04:19
- Today 01:50Casa & Kin12 product URLs returned 404.Re-discovery queued via GTIN lookup
- Yesterday 19:31PrimeDeckRate limit reached.Backed off and completed the cycle 22 min late
Self-healing extraction, mechanism by mechanism
Automatic repair is not one feature. It is four mechanisms catching four different breakages, and it is worth knowing which is doing the work.
- 1
Structured data first, so most redesigns change nothing
Where a retailer publishes schema.org Product markup, price, currency and availability are read from it. That is the data the site hands to search engines, so it survives cosmetic redesigns. A per-domain recipe is the fallback.
- 2
Recipe regeneration when a layout changes
When a domain's parse-failure rate jumps in one cycle, the recipe is regenerated from a fresh render of sampled pages, then validated against recent known-good prices. If it reproduces them within a plausible band it is promoted. If not, nothing is written.
- 3
Identifier-based re-discovery when a URL moves
The most common breakage after a redesign. The old address 301s to a category page or returns 404. Rather than drop the listing, the product is re-discovered on the retailer's own catalogue by GTIN, UPC, EAN or MPN, and the new URL attaches to the same match with a fresh confidence score. History continues on one series.
- 4
Plausibility validation before anything is written
Every candidate price is checked against the listing's own history and against peer listings. A $0.00, a shipping fee, a financing instalment where the shelf price was, or a fortyfold overnight jump is quarantined. A quarantined value never reaches a chart, an index or a rule.
- 5
A human queue when automation fails
Some sites cannot be repaired by pattern. When regeneration fails validation twice, the source escalates to a person and the incident stays open in your account meanwhile. Automation that admits defeat beats automation that keeps writing.
Failure modes, detection, and automatic response
| Failure mode | What it looks like | How it is detected | What happens automatically |
|---|---|---|---|
| Layout change | A redesign moves the price into a different element | Parse-failure rate for the domain jumps in one cycle | The recipe is regenerated and validated against known-good prices before it may write |
| Price rendered by script | The HTML holds a placeholder and the price arrives after load | A static read returns no price and no structured data is present | The page is re-fetched with full rendering. If still missing, regeneration runs, then the human queue |
| Product URL moved | The old address 301s to a category page or returns 404 | HTTP status, plus an identifier mismatch on the page landed on | The product is re-discovered by GTIN, UPC, EAN or MPN and the new URL joins the same history |
| Different product at the same URL | The address resolves but now sells something else | Identifier and title stop agreeing with the stored match | Confidence drops, the pair leaves repricing and analytics, and it is queued for review |
| Bot mitigation returning HTTP 200 | A challenge or interstitial page served with a success status | No offer markup and no plausible price node in the response | The fetch retries on another profile and schedule. Repeated failures open an incident rather than write a null |
| Wrong number captured | Shipping, a subscription rate or a financing instalment where the shelf price was | Plausibility bands against its own history and peer listings | The value is quarantined rather than stored, and regeneration is triggered |
| Frozen source | Every request succeeds and every price is identical, cycle after cycle | Zero price variance across a domain while the category moves | The source is marked degraded and you are alerted, though coverage still reads 100 percent |
| Currency or locale switch | The page renders in a different currency or region | The currency code stored with the amount stops matching the source profile | The observation is held out of the market average, not converted silently into a USD figure |
The detection column is the one to interrogate in any evaluation. Repair is common. Detecting a failure that produces a plausible wrong number is not. More on the fetch layer in price scraping.
Rows three and four are why matching belongs to data quality. A URL is a location, not an identity. When the identity behind a URL changes, the honest response is to drop confidence and stop using the pair, not keep charting whatever price is now there.
Product matching — confirmation queue
| Your product | Matched at | Method | Confidence | Action |
|---|---|---|---|---|
| Aurora H7 Noise-Cancelling Headphones — SandGTIN 009100010713 | Voltbay | GTIN exact | 94% | Confirm or correct |
| Aurora Buds ProGTIN 009100014284 | Harborline | Title + attributes | 97% | Auto-confirmed |
| Aurora Buds Pro — BlackGTIN 009100017855 | PrimeDeck | Image + title | 94% | Confirm or correct |
| Aurora Buds Pro — Midnight BlueGTIN 009100021426 | Casa & Kin | GTIN exact | 99% | Auto-confirmed |
| Aurora Buds Pro — SandGTIN 009100024997 | Belmont Direct | Title + attributes | 90% | Confirm or correct |
Matches at or above 95% confidence are applied automatically. Anything below is queued, and every correction you make is fed back into matching.
Why we show you our own incident log
Every vendor claims high accuracy, and none of those claims are checkable, because you cannot audit a figure handed to you about data you did not collect. What is checkable is whether a vendor tells you when something broke. So the incident log lives in your account.
- What broke. The domain and the failure mode, in the plain terms used above.
- When it started and when it was restored. Both timestamps, so you can check whether a number you used on Wednesday sat inside the window.
- How many products were affected. Scope in pairs, not a severity colour. Fourteen pairs and 1,400 pairs are different conversations.
- Whether history was backfilled. Some outages recover by re-reading pages that still show the same price. Many do not.
- Whether it is still open. Affected pairs stay out of repricing until it closes.
What we do not claim
- Not 100 percent coverage, and nothing behind a login. Some sites cannot be read reliably, and we say so and stop rather than serve degraded data quietly. No member pricing, no negotiated B2B rates: if a shopper cannot see it, we do not collect it.
- No retroactive capture. Backfill works only when a page still shows the price it showed during the outage. A moment that passed uncollected stays uncollected.
- Detection is not omniscience. A new failure mode on one domain can run a cycle before it is caught. What we commit to is that it surfaces as an incident, not as a confident wrong number. Evidence capture for MAP protection is held to the same rule.
Data quality is one of six modules, all included on every plan. See how they fit together on the product overview, or how collection itself works in price monitoring.
Check the health board before you trust the prices
Start a trial, connect a store, and watch coverage and freshness on your own competitor set for two weeks. Fourteen days, no credit card.
Frequently asked questions
What is scrape monitoring?
Scrape monitoring is the practice of measuring the health of a price collection pipeline rather than only the prices it outputs. It tracks whether each tracked listing returned a valid price this cycle, how old the newest good observation is, and whether any source has started failing or returning stale values. Its purpose is to catch a feed that stops updating before decisions are made on old data.
What is the difference between coverage and freshness?
Coverage is the share of tracked product-competitor pairs that returned a valid price in the latest cycle, so it answers whether a number exists. Freshness is the age of each newest good observation against the expected refresh interval, so it answers whether the number is current. A source can show 100 percent coverage while serving a cached price that has not changed in nine days.
How do you know when a scraper has silently broken?
Three signals. Parse-failure rate for a domain jumping in one cycle catches layout changes. Plausibility bands against a listing's own history and against peer listings catch a wrong number that still looks like a price. Zero price variance across a whole domain while the rest of the category moves catches a frozen or cached source, which is the failure coverage alone will never show.
What does self-healing extraction actually do?
Four things. Structured product data is read first, so many redesigns change nothing. When a layout does break parsing, the extraction recipe is regenerated and validated against recent known-good prices before it is allowed to write. When a product URL moves, the item is re-discovered by GTIN, UPC, EAN or MPN. When automation fails validation twice, a person takes over and the incident stays visible.
What happens to my repricing rules when a source goes down?
Pairs affected by an open incident are excluded from repricing until they recover, so a rule cannot act on a stale or missing competitor price. Guardrails for margin, cost and MAP floors still apply to everything else. The exclusion is visible on the rule, so you can see exactly which competitors were counted in any proposed change.
Do you interpolate missing prices on charts?
No. A gap in collection is drawn as a gap, and exports return nulls rather than estimates. Interpolation turns a known unknown into a fabricated data point, which is particularly harmful when the series feeds a warehouse or a board deck. If a price existed on a day it was not captured, that observation is simply gone and we say so.
Can I see a history of data incidents on my account?
Yes. The incident log records what broke, the domain involved, the start and restore times, how many product-competitor pairs were affected, whether history could be backfilled, and whether the incident is still open. Accuracy claims cannot be audited by a buyer. A disclosure habit can be, which is the point of showing it.
How quickly are customers told when a source degrades?
Alerting is triggered by degradation, not only by total failure, so a source that misses one cycle or starts returning suspicious values raises a flag rather than waiting for a full outage. Alerts go to email or Slack, and any source that degraded during the week also appears in the weekly digest alongside pricing movement.
Keep reading
- Price scrapingThe fetch and extraction layer underneath this: rendering, structured data, and how sources are maintained.
- MethodologyHow we define coverage, freshness and confidence, and what we refuse to estimate.
- Price monitoring moduleWhat a single check captures, and why every observation is appended rather than overwritten.
- Product matching guideWhy a URL is a location and not an identity, plus bundles, multipacks and refurbished listings.
- How to choose price monitoring softwareThe full evaluation checklist, including the questions above about detection and disclosure.
- Product overviewHow data quality fits with monitoring, MAP, repricing, analytics and integrations on one crawl.
Start monitoring in the next ten minutes
Connect your store, match your catalogue and get your first competitor comparison in the same session.
14 days, no credit card, cancel in one click.