Methodology
How WheyCompare ranks products and where the numbers come from.
The value metric
We rank by price per kg of actual protein for whey, and price per kg of powder for creatine. Both numbers use the cheapest in-stock price across all retailers we track.
Whey: $/kg of protein
$/kg protein = price ÷ (size_grams × protein_percentage / 100 / 1000)
Where protein_percentage comes from the product label: protein_per_serve ÷ serving_size × 100. A 1kg WPC at $35 with 24.5g protein per 30g serve scores $42.86/kg protein (35 ÷ (1000 × 81.6% ÷ 1000)).
This matters because two whey products at the same per-kilo price can have very different actual-protein-per-kilo. WPI typically sits 88-92% protein, WPC 75-82%, blends and mass-gainers much lower. Cheapest sticker price is often the worst value when you compare on protein.
What happens when we can't verify a product's protein density
Not every retailer publishes a clean nutrition panel. When we can't verify the protein percentage for a whey product, we keep it out of the public leaderboard and route it to an internal review queue so we can enter the numbers by hand. The row stays hidden until verified — better to show fewer products with trustworthy rankings than to mix in rows ranked on a weaker basis. Real protein density caps (WPC 70-85%, WPI 86-94%, hydrolysed 85-94%, blends 50-80%) are enforced server-side so marketing copy like "100% whey isolate" can't inflate the ranking.
We classify each automatic extraction as high (extracted from an explicit nutrition table), medium (derived from per-serve numbers in marketing copy), or low (the extractor was uncertain). Low-confidence extractions are treated as unverified and routed to manual review. The badge appears near the nutrition panel on each product page so you can tell what we trusted.
Creatine: $/kg of powder
Most creatine is sold as monohydrate at ~100% purity, so we compare on $/kg of powder. For HCl, buffered, or other forms we flag the subtype on each row, since per-gram potency varies.
Where the data comes from
We scrape product pages directly from each retailer's site once a day at 03:00 Sydney time. For each product page we extract: price, size, flavour, protein per serve, serving size, stock status, and ingredients.
Pages that haven't changed since the last scan are skipped via a content hash, so we only re-extract when something actually moved.
When the extracted data doesn't match a known canonical product, it lands in a manual review queue rather than being silently dropped.
What we don't do
- We don't reorder rows for advertisers, sponsors, or affiliate partners. The leaderboard is sorted by value, full stop.
- We don't rank whey products whose protein density we haven't verified — they stay out of the leaderboard until the numbers are confirmed, rather than appearing on a weaker basis alongside the verified rows.
- We don't artificially restrict the list to retailers we have affiliate deals with. Retailers without affiliate programs are included on equal footing.
What can go wrong
- Stale prices. We update once a day. Flash sales between scans aren't reflected until the next morning.
- Wrong protein percentage. If a retailer's product label HTML is unusual, the protein per serve can be misread. We surface obvious outliers in the admin queue, but a few may slip through. If you spot one, let us know.
- Multi-flavour pricing. Most retailers sell every flavour at the same price; some charge more for limited-edition flavours. We show "from $X" when prices vary across flavours.
Source code
WheyCompare is one developer's project. If you find a bug or want to know exactly what we scrape, ask.