Methodology
How our price data is collected and verified
Price Intelligence collects competitor prices by fetching public product pages, reading structured product data where a site publishes it and a per-domain extraction recipe where it does not, validating every value before storing it, and matching listings to your catalogue by identifier first. This page documents that pipeline, including what it gets wrong.
Most vendors describe their data collection as a black box. We publish ours, because the only way to judge a price monitoring tool before you buy it is to understand how it fails.
1. Which pages we fetch
We fetch publicly accessible product pages and marketplace listings. We do not create accounts, log in, bypass access controls, or solve challenges designed to keep automated clients out. We identify our crawler, respect rate limits, and back off when a site signals that it is under load.
Which URLs get fetched comes from three sources: what you import from your store or CSV, what we discover by looking up product identifiers, and what you add by hand. Every tracked URL is attached to a product in your catalogue, so there is no crawling that is not doing work for a specific customer.
2. How a price is extracted
Extraction runs in a fixed order, cheapest and most robust first. This ordering is the single biggest driver of both cost and reliability.
- 1
Structured product data
Most modern storefronts publish schema.org Product markup as JSON-LD, which contains the offer price, currency and availability in a machine-readable form. Where it exists and passes validation we use it, because it does not depend on the page's layout and therefore does not break when the design changes.
- 2
Per-domain extraction recipe
Where structured data is absent, incomplete or contradicts what the page displays, we use a recipe specific to that domain: a set of rules describing where the displayed price, was-price, availability and seller sit. The recipe is generated once per domain and then executed deterministically, so the ongoing cost is per-domain rather than per-page.
- 3
Rendered-page extraction
For sites that assemble price on the client, we render the page before extracting. This is the slowest and most expensive path and we use it only where the first two do not work.
| Method | Breaks when | Detection |
|---|---|---|
| Structured data | The site stops publishing markup, or publishes a price that differs from the displayed one | Cross-check against the rendered price on a sample of pages |
| Domain recipe | The site changes its template or runs an A/B test on the product page | Extraction returns null or an implausible value on a burst of URLs from the same domain |
| Rendered extraction | Client-side logic changes, or a challenge blocks the render | Render timeout, empty result, or challenge page detected |
3. Validation before anything is stored
An extracted number is not a price until it passes checks. A value that fails is not written, and the previous observation is not overwritten with a guess.
- Currency and format — the value parses as a monetary amount in the expected currency for that locale.
- Magnitude against history — a price that moves more than a configured threshold from the last observation is held for a second confirmation rather than published immediately. This catches a strikethrough price being read as the sale price.
- Coherence with availability — a price on a listing marked out of stock is stored but excluded from position and repricing calculations.
- Cross-field agreement — where both structured data and the rendered page are available, they must agree. Disagreement is an incident, not a coin flip.
Repeated validation failure on a domain triggers recipe regeneration. If the regenerated recipe also fails validation, the source is marked degraded, a human review task is created, and you are alerted. We would rather tell you a source is broken than show you a stale number that looks fine.
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
4. How listings are matched to your products
Matching is where competitor price data most often becomes quietly wrong, so it runs in order of decreasing certainty and every match carries a score.
| Method | Used when | Typical confidence |
|---|---|---|
| Identifier join (GTIN, UPC, EAN, MPN) | Both sides publish a valid identifier | Very high — treated as exact |
| Identifier via product feed lookup | Your side has an identifier and the listing can be resolved through a shopping feed | High |
| Title and attribute similarity | No identifier available; brand, model and key attributes are compared | Moderate — queued for confirmation below threshold |
| Image similarity | Barcode-poor categories such as fashion and private label | Moderate, used alongside title rather than alone |
Matches at or above 95% confidence are applied automatically. Below that they enter a confirmation queue. Every correction you make is fed back and improves subsequent matching for your catalogue.
When a product URL changes or a listing is delisted, we do not treat the match as lost. Matches are keyed to the product identity rather than to the URL, so the listing is re-discovered and the match repointed without a gap in your price history. The full reasoning is in the product matching guide.
5. How often data refreshes
Refresh frequency is a plan setting: daily on Starter, twice daily on Growth, four times daily on Scale, and hourly on Enterprise. Within a plan, refresh is prioritised — products you have flagged, products under an active repricing rule, and products with recent competitor movement are checked first, so the freshest data is on the SKUs where it matters.
Every observation is timestamped and stored append-only. We never overwrite history, which means a price you saw last month is still there next year and an audit of a repricing decision is always possible.
6. What we are explicit about not knowing
- Cart-only and coupon pricing. Where a site shows one price on the product page and a lower one at checkout, the advertised price is what we capture. We flag known coupon patterns but we do not claim to catch every one.
- Personalised pricing. If a retailer shows different prices to different visitors, we observe one of them, not all of them.
- Volume in the market. We measure prices, not sales. Any elasticity figure derived from our data uses your volumes, not a competitor's, which we cannot see.
- Intent. We can tell you a seller is below MAP. We cannot tell you whether it was deliberate.
7. How we source facts on this website
Separately from product data, we publish research and vendor comparisons. The rules we hold ourselves to there: every competitor fact comes from that vendor's own public pages and is dated; third-party estimates are labelled as estimates with their source; we do not publish market statistics we cannot attribute; and we do not use customer testimonials, review scores or logos we have not earned. Where a page contains a worked example rather than measured data, it says so.
See the pipeline running
The interactive demo includes the data quality view, the incident log and the matching confirmation queue, with a full sample catalogue.
Frequently asked questions
Do you respect robots.txt?
Yes. We honour robots.txt directives for our crawler, we identify ourselves in the user agent, and we rate limit per domain. Where a site asks us not to fetch a path, we do not fetch it, and the affected coverage shows in your data quality view rather than silently disappearing.
How accurate is the price data?
Accuracy has two components and they fail differently. Extraction accuracy is high because validation rejects implausible values rather than storing them. Match accuracy is the weaker link, which is why every match carries a confidence score and anything below 95% is queued for you to confirm. A tool that reports one accuracy number for both is hiding the harder problem.
What happens if a competitor blocks you?
The source is marked degraded, the affected coverage drops visibly in your dashboard, and you are alerted. We do not attempt to circumvent access controls. If a site becomes permanently uncollectable we tell you so you can decide whether to substitute a different competitor.
Can I see the raw observations behind a number?
Yes. Every price in the product links to the observation that produced it, with the timestamp, the source URL, the extraction method and the validation result. The same data is available over the API and in CSV export on every plan.
Do you sell or share the price data you collect?
No. Data collected for your catalogue is yours and is not resold, pooled into a product sold to others, or shared with other customers. Aggregate research we publish is derived and anonymised, and we will always say so on the page.
Keep reading
- Data qualityThe customer-facing side of everything on this page.
- Product matching guideThe hardest problem in the category, explained in depth.
- Is web scraping legal?The legal shape of collecting public price data.
- Price scrapingThe extraction stack and its failure modes.
- SecurityWhat we hold, where it lives, and what we do not claim.
- ComparisonsWhere our sourcing rules are applied to other vendors.
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.