How to fuzzy match two lists in Excel
- Load both lists. A is the list you want to complete (for example, your CRM export) and B is the reference list (for example, the accounting system). Use Excel, ODS or CSV files, or paste a column straight from Excel.
- Pick the columns to compare. Usually the customer, supplier or product name. Add a column that must match exactly, such as country or postcode, if you have one.
- Click Find matches. Every row of A gets its most similar rows of B, with a score from 0 to 100.
- Review and adjust. Move the threshold, check the close calls, switch to the top 3 candidates to pick another one, and accept or reject any row by hand.
- Download the Excel file. It contains list A with the matched row of B, the score and the status, plus the unmatched rows of each list and a summary of the settings.
Private by design: no upload
Customer, supplier and employee lists are personal or confidential data. Here they are read and matched by JavaScript inside your browser, in a background worker, and never sent to a server. The page only downloads, the first time, its own code and the open-source library that reads Excel files (SheetJS).
You can check it in the Network tab of your browser’s developer tools, or disconnect from the internet after the page has loaded and keep working.
How the similarity score works
Both texts are normalised first, so that differences that do not matter are ignored: accents and case (“JOSÉ” = “jose”), punctuation and repeated spaces, legal suffixes such as Inc., Corp., LLC, Ltd, GmbH, SAS, S.L., S.A. or S.A. de C.V., and, if you want, common words such as “the”, “of”, “de” or “del”. Then three measures are combined into one score:
- Jaro-Winkler rewards characters in the same order and a shared beginning, so it handles typos well (“Microsft” and “Microsoft”).
- Token sort ratio sorts the words before comparing, so “García López, María” and “María García López” are the same.
- Token set ratio detects one name contained in a longer one (“Santander” in “Banco Santander”); the more words are missing, the lower the score.
Two rules keep false matches down: when both texts contain numbers and they differ, the score is multiplied by 0.8; and when each side has a word the other one lacks entirely (“José García López” and “José García Pérez”), it is multiplied by 0.88. These are real scores from this tool:
| List A | List B | Score | Why |
| José García | Jose Garcia S.L. | 100 | Same after removing accents and the suffix |
| Acme Corporation | ACME Corp. | 100 | Case and legal suffix |
| Jon Smith | John Smith | 96 | One missing letter |
| Microsoft Corporation | Microsft Corp | 96 | Typo |
| Müller GmbH | Mueller GmbH | 92 | Different transliteration |
| Banco Santander | Santander | 88 | One name contained in the other |
| José García López | José García Pérez | 80 | Probably two different people |
| Calle Mayor 5 | Calle Mayor 6 | 66 | Different numbers |
| International Business Machines | IBM | 34 | Abbreviations are not expanded |
Fuzzy Lookup is not an option on Mac or the web
Microsoft’s free Fuzzy Lookup add-in was published as a separate download for desktop Excel on Windows. It installs as a Windows add-in, so it cannot run in Excel for Mac, in Excel for the web or on an iPad, and it is not part of Excel itself. Power Query, inside Excel for Windows with Microsoft 365, offers a “Use fuzzy matching” option when merging queries, but it requires building the merge step by step and is not available in every edition and platform.
This tool needs no add-in, no macro and no admin rights. It works in any modern browser on Mac, Windows, Linux or a Chromebook, and it gives you a review table that Fuzzy Lookup does not have: you see every candidate with its score and decide before anything is written.
Fuzzy matching vs VLOOKUP and XLOOKUP
VLOOKUP, XLOOKUP and INDEX/MATCH are exact lookups for text: “Acme Inc.” will not find “ACME, Inc”, and an extra space breaks the lookup. Many people try =VLOOKUP(A2,B:C,2,TRUE) hoping for an approximate result, but that mode is meant for sorted numeric ranges such as tax brackets: on text it returns the closest value that sorts alphabetically before the one searched, which is usually the wrong row. Wildcards ("*"&A2&"*") only help when one text is literally inside the other.
- VLOOKUP / XLOOKUPFast and built in. Only identical values match. No score, no review.
- Fuzzy matchingFinds the most similar value with a score, ignoring accents, case, punctuation, suffixes and word order.
- Best of bothUse the tool to build a mapping column (A → B), then use XLOOKUP on that column for future updates.
If both lists share a reliable ID, you do not need fuzzy matching: merge the two files by that column instead.
Common uses
- CRM vs accountingLink customers in the CRM with the names used on invoices, where one says “Acme Corp.” and the other “ACME CORPORATION”.
- Supplier master dataMap a new supplier list to your vendor master before importing it.
- Product cataloguesPair your product names with a distributor’s price list.
- Events and membershipsCheck sign-ups against a member list when people type their names differently.
- Grant and donor listsFind organisations that appear in two reports under slightly different names.
- Data migrationMatch records from an old system with the new one when there is no shared ID.
Known limitations
- The score is a heuristic. Always review the close calls before you use the result for invoices, payments or legal purposes.
- Abbreviations and nicknames are not expanded: “IBM” does not match “International Business Machines”, and “Bob” scores low against “Robert”.
- Two different people who share a first name and a surname can still score above 80. Add an exact column (city, date of birth, postcode) when you have one.
- Only the 40 most promising candidates of each row (by shared trigrams) are fully scored, and only the top 3 are kept, so a very weak match can be missed in lists full of similar names.
- Accent removal covers Latin scripts; other scripts are compared character by character.
- One sheet per file is used. Formulas are read as their last saved values.