Methodology
Last updated: August 22, 2026
This page describes exactly how HomeGadgets collects, matches and publishes prices, including the parts that are incomplete. It is written against the code that is actually running, not against our intentions for it. Where the two differ, this page follows the code.
The short version: we track online retailer advertised prices from Canadian retailers’ own public product pages, we attach an offer to a product only when a manufacturer identifier says it belongs there, we rank by price and nothing else, and we would rather show you a gap than a guess.
Coverage, as measured right now
- Retailers counts distinct retailers that recorded an in-stock offer in the last 30 days, after removing retailers whose data we have deliberately parked. Stated exactly, that is: a distinct retailer with at least one offer priced above zero in CAD and flagged in stock, seen within the last 30 days.
- Brands counts brands with at least one product that passes the display gate. A product you can actually open. We hold rows for more brands than this; publishing that larger number would advertise pages nobody can reach. The figure above is rounded down to the nearest ten, so it understates rather than flatters.
- We currently track 20,000+ SKUs and display 12,000+ of them with a live in-stock offer you can open today, properly catalogued and verified. The gap between those two numbers is exactly the set of pages that would otherwise be dead ends, so we do not publish the larger one as if it were the smaller.
How often prices are checked
Prices are refreshed at least weekly.
An offer expires after 14 days. If a retailer has not re-confirmed an offer within 14 days, it stops counting toward “available at N retailers” and stops rendering as a buy link.
We have real time price tools under development since all retailers update their prices continuously. If our information is wrong it is because the retailer changed its prices after we verified its offer. Always confirm on the retailer’s own page before buying.
How an offer is attached to a product
This is the part that makes a price comparison either trustworthy or worthless. If a comparison site attaches offers by product name, it will eventually put a 55-inch TV’s price on the 65-inch model, a lens kit’s price on the bare camera body, or a cyan ink cartridge’s price on the magenta one, and every one of those errors looks completely normal on the page.
Our resolution order is: barcode, then exact manufacturer part number, then a short list of declared reformatting rules, then nothing. Concretely:
- 1. GTIN / UPC. When the retailer publishes a barcode, we validate its check digit and resolve on that. An exact barcode match outranks everything else. An invalid barcode is discarded, never stored.
- 2. Exact manufacturer part number. The manufacturer’s own published part number, compared exactly. An exact match always wins over any looser comparison, so a longer part number can never be absorbed into a shorter, different one.
- 3. Declared, guarded tolerances for how retailers reformat a part number. Retailers drop separators, add a regional packaging suffix, or append an internal lot code to a manufacturer’s part number. Rather than guess, we hold a written-down set of transformations, per-brand conventions where a brand uses a separator inconsistently in its own catalogue, and shared reformatting rules whose collision proofs are recorded, and apply them after exact matching has already failed. A brand with no declared convention is compared verbatim. These are the honest middle ground between “exact only” and “close enough”, and they are why the next point matters so much.
- 4. Ambiguity is a stop, not a tiebreak. Wherever an identifier resolves to more than one candidate product, we attach nothing. There is no “pick the most popular one”. On top of that, several specific traps are refused outright before any tolerance can fire: a screen-size mismatch on a TV, a bundle part number that would land on one of its components, and a natural-gas/propane pair where the fuel suffix was dropped. An unprovable match is not a match.
- 5. If an identifier was captured and matches nothing, we stop there. We do not fall back to comparing names. The correct outcome is a gap in our catalogue that a manufacturer pass later fills, not a price on the wrong product.
Variants and duplicate listings
A different manufacturer part number is a different product until a written per-brand rule proves otherwise. That is the whole variant policy, and everything else follows from it:
- Never merged: colour, capacity, screen size, gas type, mount, generation, and bundles or kits. These are different things to buy at different prices.
- Merged only when declared: a regional or carrier-locale suffix, and only where a per-brand rule states that this specific suffix is region-only for that brand.
- Gas ranges and cooktops: where a model exists in both natural-gas and propane versions and a retailer has dropped the fuel suffix, we quarantine the listing instead of guessing. A propane price shown on a natural-gas appliance is a confidently wrong answer, which is worse than a missing one.
The same discipline runs the other way. When two of our own product records turn out to be the same manufacturer part number, they are merged and their offers re-pointed, so a single product does not appear twice with half its offers each.
Open-box, refurbished and marketplace offers
The main price table contains new items sold by the retailer itself, and nothing else. That is the comparison, and it is the only thing that can set the best price we show.
- Two independent tests decide the table an offer lands in: is it new, and is the retailer itself the seller? Both must be true for the main table. A marketplace seller can list a brand-new item and a retailer can sell an open-box unit directly, so keying on only one of those would misfile both.
- Open-box, refurbished, used and third-party-marketplace offers appear in a separate, labelled table below the main one, each tagged with what it is. Marketplace offers are off by default.
- They are never eligible for the headline price, the price range, or the deal score. That restriction lives in the same file as the table split, so the price basis cannot drift away from what you see.
- The test fails closed: any offer whose condition is not literally “new”, including one we cannot classify, is pushed to the second table, never promoted into the first.
- The structured data we publish for search engines carries the real condition per offer, so a refurbished unit is never described to Google as new.
Availability, and where we are uncertain
We store four availability states, not two: in stock, out of stock, special order (orderable, not on hand), and call for pricing (a real product behind a quote or minimum-advertised-price gate). Collapsing those four into a yes/no would misrepresent a large part of the appliance market, where “ships in 4–8 weeks” is a normal, buyable state.
The rule we want everywhere is to read the retailer’s own published purchase state from the product page: orderable language wins first, explicit unavailable language next, then a working add-to-cart control. A disabled cart button reads as out of stock; a priced product with a quote form instead of a cart reads as special order, not as unavailable, because some retailers legitimately sell without a cart at all.
Where we are uncertain, stated plainly:
- Not every collector reads the page’s own stock signal yet. That shared rule is a gated standard for new collectors, but 72 older collectors sit on a recorded exemption list for exactly this check (measured 12 August 2026). They set availability from something weaker than the page’s own purchase control. The list is allowed only to shrink: a collector removed from it cannot be added back, and a new collector cannot join it at all. Until a given collector is converted, read its “in stock” as “this retailer listed the product and did not say otherwise”.
- We do not hide a product because we are unsure. Hiding it would silently shrink the comparison and you would never know a retailer was missing. Instead: an individual offer whose availability we could not normalise is not rendered at all, and the product stays visible as long as some other retailer confirmed it.
- We do not let uncertainty set a price. A headline price can only come from an offer that is first-party, new, explicitly in stock, and carries a real positive number. An offer the retailer marks out of stock never sets the best price, and it leaves the page while another retailer has the product in stock.
When one retailer runs out, we remove only that retailer’s offer. If a retailer says a product is out of stock, or its link to the product has stopped working, and at least one other retailer still has it in stock, that offer leaves the page. The product stays up with the retailers that have it. Special order, backorder and pre-order count as in stock, because the retailer will still sell it to you.
When no retailer has it, the page stays and a clock starts. A product that is out of stock at the last retailer keeps its page, which states the date it went out of stock and shows no price and no buy button. If any retailer has it in stock again, the clock is cleared and the page goes back to normal.
What happens when the clock runs out. For 60 days after the last retailer stopped having it, the page stays up, marked no longer available, with similar items that are in stock in the same category. That is the same 60 days for every kind of product, and it does not depend on whether the record came from the manufacturer or from a retailer. If no retailer has it in stock again by then, its address sends you permanently to the most relevant category page: the brand’s page in that category when there is a full one, otherwise the category itself. The address never answers “not found” or “gone”, and if a retailer lists the product again later, its page comes back.
Canadian dollars only
Every price on this site is a Canadian-dollar price quoted by a Canadian storefront. We do not convert currencies, we do not apply an exchange rate, and we do not show US prices. A converted price is not a price you can pay, and it goes stale the moment the rate moves.
This needs an active guard rather than good intentions. Some manufacturers’ “Canadian” storefronts actually quote US dollars, and because a price is stored as a plain number, a US figure would silently become a Canadian one. Rows from storefronts confirmed to quote in USD are dropped at the single point every collector writes through, for every collector, automatically, and the drop is logged. A storefront is added to that list only once its currency is confirmed, and removed only when it ships a genuine Canadian-dollar price.
Prices exclude taxes and shipping.
The deal score
The deal score compares the current best price against historical prices from the past 90 days across all retailers. 70+ is a good deal, 40-69 is average, below 40 means prices have been lower. It is computed from new, first-party offers only: an open-box, refurbished, used or marketplace price never sets it.
Ranking and independence
Offers are sorted by price, with ties broken alphabetically by retailer name. Nothing else enters the ordering, not commission, not a commercial relationship, not traffic. Some outbound links earn a referral commission, and that has no effect on which retailer is shown first, on the best-price calculation, or on what the on-site AI assistant says. We are not owned by, and do not act for, any retailer or manufacturer.
Corrections
If a price, a specification, or a product match on this site is wrong, tell us and we will fix the collector, not just the row. A wrong row that we patch without finding the cause comes back on the next run. Use the bug report form or contact us. Our standing statement on what the site and the AI assistant can and cannot do is on the limitations page.
* We continuously add and update this roster adding more retailers, products and brands. The three figures above are read from a single measurement, taken against our own database and shared by every page on this site that states a coverage number, so they cannot disagree with one another.