Prices updated recently ยท 377 products tracked across 64 brands

How We Test + Verify Protein Products

The scraping methodology, retailer sources, spec verification process, and what we deliberately do not test on ProteinPrice.com.

Last updated 21 May 2026 · Applies to the live catalog of 377 products

"Testing" in supplement publishing usually means one of two things: a brand pays a lab to confirm what is already on its own label, or an editor tries the product and writes a review. We do neither as the spine of the site. ProteinPrice is a price and value engine. Our job is to verify, every day, that the retailer prices feeding into the Value Score are real and that the label specs we rank against are accurate. This page is the full account of how that verification works, what we do not do, and how to flag a discrepancy.

12
Retailers
377
Products
Daily
Refresh
48h
Stale flag

Price verification methodology

Every price you see on a ProteinPrice product page started its life as a number rendered on a retailer's live product page within the last 48 hours. Brands do not submit prices to us. We do not buy a syndicated price feed that brands also have access to. The path from a retailer's HTML to our ranking looks like this:

  1. Targeted scraper hits the retailer's product detail page. Each SKU in the catalog is mapped to canonical product URLs at every retailer where it is sold. The scraper requests the page on a schedule (see refresh cadence below), identifies itself in its User-Agent string, and respects robots.txt directives.
  2. Parser reads structured data first. Where the retailer publishes schema.org Product markup or JSON-LD (most major US retailers do), the parser reads the structured offers.price, offers.priceCurrency, and offers.availability fields directly. This is faster, more accurate, and less brittle than visual scraping.
  3. Visual fallback for retailers without structured data. Where no structured price block is present, the parser falls back to retailer-specific CSS selectors. These selectors are versioned and re-validated when a parse error rate crosses a threshold.
  4. Sanity range check ($5 to $500). Any returned price outside this window is rejected as a parsing error. Protein tubs do not retail for $1 or $5,000. A returned value of $0.00 or $9,999.99 is almost always a layout change or a "From $14.99" lure that the parser misread.
  5. Swing rejection (more than 50% move requires corroboration). If the new value is more than 50% above or below the prior verified value for that SKU at that retailer, we require at least one other retailer to have moved in the same direction before accepting the change. A lone $89.99 spike on one retailer while every other retailer holds at $39.99 is suppressed.
  6. Cross-retailer outlier rejection (more than 30% from median). Once all retailers have been scraped for a given cycle, any single value sitting more than 30% from the cross-retailer median is rejected. This catches stale list prices, wrong-SKU matches, currency-conversion glitches, and bundle-vs-single misclassifications.
  7. Accepted values write to the catalog and the audit log. Values that survive every check are written into the live products feed and appended to price_history-YYYY-MM.jsonl at /data/. The history file is append-only and never rewritten.
  8. Last-success timestamps update. Each retailer slot on each product carries a UTC timestamp of its last verified scrape. These timestamps are visible in the public JSON and surface live at /scraper-status/.

What this means in practice: when a price disappears from a product page, it is usually our safeguards refusing to publish a number we do not trust. We treat "no price" as a safer answer than "wrong price."

Retailer sources

The catalog is scraped from twelve US retailers. We chose this set deliberately: it covers mass-market, specialist sports nutrition, warehouse club, brand-direct, and one large drop-shipper, so that every major price point in the protein category gets at least one independent comparison.

Amazon
Mass-market
Walmart
Mass-market
Target
Mass-market
Costco
Warehouse club
iHerb
Specialist
GNC
Specialist
Bodybuilding.com
Specialist
Vitacost
Specialist
Muscle & Strength
Specialist
Tiger Fitness
Specialist
MyProtein US
Brand-direct
Transparent Labs
Brand-direct

Retailer slots are not all equal in coverage. Mass-market sites carry a wide protein selection but rotate SKUs aggressively, so we expect some products to drop in and out. Brand-direct sites carry only that brand's catalog but tend to have the most reliable spec data. Costco and Walmart in some protein categories do not have an affiliate program, which is fine: they are scraped and ranked exactly the same way, and they win the "Best Price" slot whenever the math says so.

The full retailer roster, with last-scrape health visible per retailer, lives at /retailers/. Live scraper health (last success, error counts, status code distribution) is published openly at /scraper-status/ so anyone can audit which retailers are healthy on any given day.

Refresh cadence

The default cycle for the full catalog is daily, scheduled overnight US time so that morning rankings reflect the prior day's close. Several categories run more frequently:

"Daily refresh" is the published cadence we hold ourselves to. Per-product, per-retailer last-success timestamps are the proof: every product page surfaces them and the live status board at /scraper-status/ aggregates them across the fleet.

Spec verification (protein, servings, ingredients)

The Value Score depends on three numbers per SKU: protein per serving, servings per container, and the best verified retailer price. The first two come from the product label and the brand's official product page, not from a lab.

We scrape what brands publish on their labels. We do not lab-test what is inside the tub. This is the most important boundary on the site. If the published protein content turns out to be inaccurate, we will reflect a confirmed correction once the brand or a third party has demonstrated it, but ProteinPrice is not a contract lab and never markets itself as one.

What we deliberately do NOT test

Just as important as what we do is what we do not. Drawing the boundary publicly avoids over-promising:

If those are the things you came here for, ProteinPrice is not the right resource. We try to be honest about that up front rather than pretend otherwise.

Brand communication

Brands occasionally contact us about coverage. Here is how that works in practice:

Reporting inaccuracies

Live scraped data is messy. Retailer pages change layouts. Bundles get listed as singles. Subscribe-and-save toggles flip and show a different number. SKUs get accidentally mapped to similar-looking variants. The only way we catch these quickly is reader feedback.

We aim to acknowledge corrections within one business day and resolve within five. Persistent issues (a scraper that keeps misreading bundle pricing, for example) get a permanent fix in the parser, not just a one-off override.

Methodology changelog

When the verification methodology itself changes, we log the change here rather than rolling it out silently. Examples of changes that would land here: tightening the outlier threshold from 30% to 25%, adding a new retailer to the scrape pool, removing a retailer whose data quality dropped, or moving the stale-flag window from 48 to 36 hours.

For the upstream ranking methodology (how scraped prices and spec data are combined into the Value Score itself), see /how-it-works/. For the policies governing rankings, recommendations, and corrections, see /editorial-standards/.