Skip to content
Price IntelligencePrice Intelligence home

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.

Ashesh DhakalFounder5 min read
Start free trialOpen the live demo14 days, no credit card, cancel in one click.

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. 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. 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. 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.

What each extraction method costs you in reliability
MethodBreaks whenDetection
Structured dataThe site stops publishing markup, or publishes a price that differs from the displayed oneCross-check against the rendered price on a sample of pages
Domain recipeThe site changes its template or runs an A/B test on the product pageExtraction returns null or an implausible value on a burst of URLs from the same domain
Rendered extractionClient-side logic changes, or a challenge blocks the renderRender 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

SourceMethodCoverageLast full passStatus
VoltbayStructured data100%38 min agoHealthy
HarborlineDomain recipe98.4%1 h 12 m agoSelf-healed

Recipe regenerated 3 h ago after a layout change

PrimeDeckMarketplace API99.6%22 min agoHealthy
Casa & KinDomain recipe96.1%2 h 04 m agoDegraded

12 URLs returning 404 — queued for re-discovery

Belmont DirectStructured data100%51 min agoHealthy

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
The data quality view. Coverage and freshness are reported per source, and the incident log shows what broke and what fixed it.

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.

Matching methods in order of precedence
MethodUsed whenTypical confidence
Identifier join (GTIN, UPC, EAN, MPN)Both sides publish a valid identifierVery high — treated as exact
Identifier via product feed lookupYour side has an identifier and the listing can be resolved through a shopping feedHigh
Title and attribute similarityNo identifier available; brand, model and key attributes are comparedModerate — queued for confirmation below threshold
Image similarityBarcode-poor categories such as fashion and private labelModerate, 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.

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.