[{"data":1,"prerenderedAt":238},["ShallowReactive",2],{"learn-lesson-matching-products-across-sites-identifiers-first-gtin-ean-mpn":3},{"course":4,"lesson":67,"index":205,"outline":206,"prev":236,"next":237},{"slug":5,"order":6,"level":7,"time":8,"card_text":9,"seo":10,"hero":16,"outcomes":26,"who":35,"syllabus":46,"faq":49,"lessonCount":66},"matching-products-across-sites",5,"You have data from more than one site","6 lessons, about 70 minutes","Collecting prices is the easy half. Deciding that this product on your site and that product on a competitor's are the same thing is where price monitoring actually succeeds or fails. Identifiers, fuzzy matching, variants, confidence scores and how to measure your match rate without flattering yourself.",{"title":11,"description":12,"keywords":13,"og_title":14,"og_description":15},"Matching Products Across Sites: A Free 6-Lesson Course","How to match the same product across different retailers. GTIN and EAN matching, fuzzy title matching, variants and multipacks, confidence scoring, review queues, and measuring match rate honestly. Free, ungated.","product matching, product data matching, gtin matching, ean barcode matching, fuzzy product matching, sku mapping, competitor price matching, product catalogue matching","A free course on matching the same product across different retailers","Six written lessons on product matching: identifiers first, fuzzy matching when there is no barcode, variants and multipacks, confidence scores and review queues.",{"badge":17,"title":18,"subtitle":19,"cta_primary":20,"cta_secondary":23},"Course five","Match the same product across different sites","A price comparison is a claim that two things are the same thing. Almost every disappointing price monitoring project fails here rather than at collection: the prices were fine and the matches were not. This course is about doing the matching properly — leaning on identifiers where they exist, being honest about confidence where they do not, and measuring the result in a way that does not flatter you.",{"label":21,"url":22},"Start with lesson one","/learn/matching-products-across-sites/why-matching-is-the-hard-part",{"label":24,"url":25},"See the data a run returns","/custom-scrapers",{"title":27,"items":28},"What you will be able to do",[29,30,31,32,33,34],"Explain why matching, not collection, is where price monitoring projects fail","Use GTIN, EAN, UPC and MPN correctly, including the checks that stop a bad identifier poisoning a match","Build a defensible fuzzy match for the majority of products that carry no usable barcode","Handle variants, bundles and multipacks without silently comparing a three-pack to a single unit","Attach a confidence score to every match and route the uncertain ones to a human","Measure your match rate with a denominator that tells the truth",{"title":36,"for_title":37,"for":38,"not_title":42,"not_for":43},"Who this is for","Written for",[39,40,41],"Pricing and e-commerce teams who have competitor data and cannot trust the comparisons","Developers building the matching layer and looking for the failure modes before they find them in production","Anyone evaluating a price monitoring vendor who wants to ask better questions than \"how many sites do you cover\"","Not written for",[44,45],"Teams who do not yet have data from more than one source — collection comes first, see course one or three","Anyone expecting a machine learning tutorial. The techniques here are mostly deterministic, because deterministic matches are the ones you can defend to a pricing manager.",{"title":47,"intro":48},"The six lessons","Lessons two and three are the mechanics. Lesson four is the one that catches most teams out, and lesson six is the one that stops you believing your own numbers.",{"badge":50,"title":51,"description":52,"items":53},"FAQ","Before you start","The questions that come up as soon as somebody looks closely at a match table.",[54,57,60,63],{"title":55,"description":56},"What match rate should I expect?","It depends almost entirely on the category, and anyone who quotes you a single number across all categories is not being careful. Electronics and groceries carry barcodes and match well. Fashion, furniture and bikes are hard because the same frame is sold under different model names with different component specs. We have seen a real project stall at 18% on bicycles, which was a correct measurement of a genuinely hard category rather than a broken system.",{"title":58,"description":59},"Can I just match on product title?","You can, and you will get a result that looks plausible and is wrong often enough to be dangerous. Lesson three is about doing it properly when there is no alternative, which there frequently is not. The important part is not the string algorithm — it is attaching a confidence score and refusing to auto-publish the weak ones.",{"title":61,"description":62},"Should a human be in the loop?","Yes, for the middle band. The strong matches do not need a person and the hopeless ones do not deserve one. The value of a review queue is entirely in how well you have sorted it, which is lesson five.",{"title":64,"description":65},"Is this specific to Scrapewise?","No. Lesson five mentions how we structure a review queue, and that lesson is labelled. The rest is method and applies to a spreadsheet, a Python script or any vendor's matching engine.",6,{"slug":68,"nav_title":69,"title":70,"summary":71,"time":72,"needs_account":73,"seo":74,"blocks":78,"takeaways":196,"next_step":201},"identifiers-first-gtin-ean-mpn","Identifiers first","Identifiers first: GTIN, EAN, UPC and MPN","What each identifier means, how to validate one before trusting it, and the three ways a correct-looking barcode still produces a wrong match.","11 min",false,{"title":75,"description":76,"keywords":77},"GTIN, EAN, UPC and MPN: Product Identifiers for Matching","How product identifiers work, the check digit that validates a barcode, where retailers publish them, and the three ways a valid identifier still produces a wrong match.","gtin, ean barcode, upc code, mpn manufacturer part number, product identifier matching, barcode validation check digit",[79,84,120,125,130,137,143,151,181,191],{"type":80,"paragraphs":81},"prose",[82,83],"If two listings carry the same valid barcode, they are the same product, and you are done in one comparison. Nothing else in product matching is that cheap or that certain, so the first thing to build is the identifier path — even though it will only cover part of your catalogue.","The confusion worth clearing up first is that these are not competing standards. They are mostly the same number written at different lengths.",{"type":85,"title":86,"headers":87,"rows":92},"table","The identifiers you will meet",[88,89,90,91],"Identifier","What it is","Length","Reliability for matching",[93,98,102,106,111,116],[94,95,96,97],"GTIN","The umbrella term — GTIN-8, 12, 13 and 14 are all GTINs","8 to 14 digits","Highest, when valid",[99,100,101,97],"EAN","European article number, the common retail barcode","13 digits",[103,104,105,97],"UPC","North American equivalent; a GTIN-13 with a leading zero","12 digits",[107,108,109,110],"MPN","Manufacturer part number — the maker's own code","Free-form","High with the brand, meaningless without it",[112,113,114,115],"ASIN","Amazon's internal identifier","10 characters","Only within Amazon",[117,118,109,119],"Retailer SKU","The shop's own code","None across retailers",{"type":121,"variant":122,"title":123,"text":124},"callout","note","UPC and EAN are the same number","A 12-digit UPC is a 13-digit EAN with a leading zero. If you store them in different columns and compare them as strings, every US-to-EU match will silently fail. Normalise everything to 13 or 14 digits on the way in and the problem disappears before it exists.",{"type":80,"title":126,"paragraphs":127},"Validate before you trust",[128,129],"Every GTIN carries a check digit, computed from the preceding digits. It exists so a scanner can tell a misread from a real code, and it works just as well for telling a scraped mistake from a real code.","Validating costs microseconds and removes a whole class of silent corruption: a truncated field, a number that was actually a model code, a cell that picked up a stray character. Any identifier that fails the check digit should be discarded rather than used, because a wrong identifier is more dangerous than no identifier — it will match confidently to something arbitrary.",{"type":131,"title":132,"intro":133,"language":134,"code":135,"caption":136},"code","Check digit validation","The standard GS1 modulo-10 calculation, normalised for any GTIN length.","python","def valid_gtin(code: str) -> bool:\n    \"\"\"True if code is a syntactically valid GTIN-8/12/13/14.\"\"\"\n    digits = \"\".join(c for c in code if c.isdigit())\n    if len(digits) not in (8, 12, 13, 14):\n        return False\n    body, check = digits[:-1], int(digits[-1])\n    # Weights alternate 3,1 from the rightmost body digit leftwards.\n    total = sum(int(d) * (3 if i % 2 == 0 else 1)\n                for i, d in enumerate(reversed(body)))\n    return (10 - total % 10) % 10 == check\n\n\ndef normalise(code: str) -> str | None:\n    \"\"\"Pad to 14 digits so UPC-12 and EAN-13 compare equal.\"\"\"\n    if not valid_gtin(code):\n        return None\n    return \"\".join(c for c in code if c.isdigit()).zfill(14)","Normalising to 14 digits is what makes a 12-digit UPC and the same product's 13-digit EAN compare as equal.",{"type":80,"title":138,"paragraphs":139},"Where retailers actually publish them",[140,141,142],"In descending order of how often it works: the JSON-LD Product block, where gtin13, gtin, sku and mpn are standard fields; a microdata itemprop; a specifications table on the page; and the product feed, if the retailer publishes one.","Expect patchy coverage and expect it to vary wildly by sector. Groceries and electronics are good. Fashion and furniture are poor, often because the item genuinely has no manufacturer barcode. That is not a gap you can engineer away, which is what lesson three exists for.","One practical note if you are pulling these out of structured data: an array in a JSON-LD path needs to be addressed as its own segment. A product with variants will put the barcodes under something like hasVariant with each entry carrying its own gtin13, and a path that does not account for the array returns the first one for everything.",{"type":144,"title":145,"intro":146,"items":147},"list","Three ways a valid identifier still produces a wrong match","The check digit proves the number is well-formed. It does not prove it is the right number for this listing.",[148,149,150],"Reused codes. Small manufacturers reuse barcodes across generations. The same EAN can be last year's model at one retailer and this year's at another.","Bundle codes. A retailer sells a drill plus a case under the bare drill's barcode because that is what their system had. The identifier is valid, the products are not equivalent.","Copy-paste errors in the retailer's own catalogue. A listing carries the barcode of a neighbouring variant. Rare individually, guaranteed across a hundred thousand rows.",{"type":85,"title":152,"intro":153,"headers":154,"rows":159},"Worked example: four codes, two products","Four identifiers exactly as four retailers publish them, covering two distinct products. All four are valid, all four are the same kind of number, and a plain string comparison matches none of them to anything at all. Left-padding everything to fourteen digits makes A equal B and C equal D — and that single step is what stops US and European catalogues failing to match in complete silence.",[155,156,157,158],"Source","Published as","Form","Normalised to GTIN-14",[160,165,168,173,177],[161,162,163,164],"A, a European retailer","4006381333931","EAN-13","04006381333931",[166,164,167,164],"B, another European retailer","GTIN-14, already padded",[169,170,171,172],"C, a US retailer","036000291452","UPC-A","00036000291452",[174,175,176,172],"D, the same US product elsewhere","0036000291452","the EAN-13 form of that UPC",[178,179,179,180],"A plain string comparison","","matches none of the four to each other",{"type":144,"title":182,"intro":183,"items":184},"What usually goes wrong","Identifiers are the one tier of evidence that can be certain, which is exactly why the failures here are so damaging.",[185,186,187,188,189,190],"Comparing identifiers as strings without padding. A 12-digit UPC and the 13-digit EAN of the same item differ by one leading zero and nothing else, and the match simply never happens.","Trusting an identifier because it is the right length. Validate the check digit: a transposed pair of digits produces a number that looks perfect and refers either to something else or to nothing.","Treating an MPN as globally unique. It is unique within a manufacturer, so it needs the brand beside it to mean anything, and two brands both using \"100\" is entirely ordinary.","Assuming coverage. Fashion and furniture frequently publish no barcode on the page at all, so an identifier-first strategy returns almost nothing there — a scoping fact rather than a bug.","Accepting an identifier match with no sanity check. Reused codes, bundle codes and plain catalogue errors all pass the check digit; comparing title overlap and the price ratio catches all three for almost no effort.","Taking the first identifier on the page. Related-product carousels and accessory blocks publish codes of their own, and the one you want is inside the main product block.",{"type":80,"title":192,"paragraphs":193},"The cheap guard that catches all three",[194,195],"After an identifier match, compare the two titles and the two prices. If the titles share almost no words, or the prices differ by more than roughly a factor of two, flag it rather than publishing it.","This is a handful of lines and it catches every one of the failure modes above, because all three produce a match that is confident and visibly implausible. An identifier match that disagrees with every other signal is not a strong match — it is a strong contradiction, and that is worth a human's attention rather than an auto-publish.",[197,198,199,200],"GTIN, EAN and UPC are the same number at different lengths — normalise to 14 digits or US-to-EU matches fail silently.","Validate the check digit and discard anything that fails. A wrong identifier is worse than none.","Coverage is patchy and sector-dependent; fashion and furniture often have no barcode at all.","Sanity-check every identifier match against title overlap and price ratio — reused codes, bundle codes and catalogue errors all pass the check digit.",{"text":202,"label":203,"url":204},"Next: the majority of your catalogue, which has no usable barcode at all.","Lesson 3: when there is no barcode","/learn/matching-products-across-sites/when-there-is-no-barcode",1,[207,213,214,220,225,231],{"slug":208,"navTitle":209,"title":210,"summary":211,"time":212,"needsAccount":73},"why-matching-is-the-hard-part","Why matching is hard","Why matching is the hard part","The same object is described differently by every retailer that sells it, and the differences are not noise — they are deliberate.","10 min",{"slug":68,"navTitle":69,"title":70,"summary":71,"time":72,"needsAccount":73},{"slug":215,"navTitle":216,"title":217,"summary":218,"time":219,"needsAccount":73},"when-there-is-no-barcode","No barcode","Matching when there is no barcode","Normalisation, blocking, scoring on multiple signals, and why the string similarity algorithm matters far less than everyone assumes.","12 min",{"slug":221,"navTitle":222,"title":223,"summary":224,"time":219,"needsAccount":73},"variants-bundles-and-multipacks","Variants and packs","Variants, bundles and multipacks","The highest-scoring wrong matches all live here. Normalising to a comparable unit, and knowing when two things are genuinely not comparable.",{"slug":226,"navTitle":227,"title":228,"summary":229,"time":72,"needsAccount":230},"score-confidence-and-build-a-review-queue","Confidence and review","Confidence scores and a review queue worth using","Why one score is not enough, how to set the two thresholds, and how to order a queue so an hour of human attention is worth having.",true,{"slug":232,"navTitle":233,"title":234,"summary":235,"time":72,"needsAccount":73},"measure-your-match-rate-honestly","Measure it honestly","Measure your match rate honestly","The denominator everyone picks is the flattering one. Precision, recall, a hand-labelled sample, and what to do with a number you do not like.",{"slug":208,"navTitle":209,"title":210,"summary":211,"time":212,"needsAccount":73},{"slug":215,"navTitle":216,"title":217,"summary":218,"time":219,"needsAccount":73},1791047867324]