Importing Customers into Shopify Without Creating Duplicates

By The Twinfold teamPublished 9 min read
Short answer

Shopify's customer CSV import treats email and phone as unique, so exact repeats are skipped and only the last row with a repeated email or phone is imported. It doesn't catch near-matches such as a capitalized, plus-tagged or dotted Gmail address. To import without duplicates, normalize the file, remove repeats inside it, compare it with an export of your current customers, and import only the people who are genuinely new.

Key takeaways
  • Shopify's customer CSV import creates a profile for each email address in the file and skips rows whose email or phone number repeats, importing only the last one.
  • The importer matches exact emails and phone numbers only, so jane.doe@gmail.com and JaneDoe+news@gmail.com become two separate customers.
  • Checking Overwrite existing customers that have the same email or phone number replaces all of that customer's data, including import tags.
  • The safest import file contains only people who don't already exist in your store, checked against a fresh customer export with normalized emails and phones.
  • Tagging the import lets you find every imported profile afterward with a customer segment and check for duplicates the import created.

To import customers into Shopify without duplicates, clean the file before Shopify ever sees it. Shopify's customer import only recognizes exact repeats of an email or phone number, so a person already in your store as jane@example.com comes back as a second customer if the file says Jane+news@Example.com or a dotted Gmail variant. Normalize the emails and phones in your file, remove repeats inside it, compare it with a fresh export of your current customers, and import only the people who are genuinely new.

This guide covers what the importer does with repeated and existing customers, the cleanup steps that prevent duplicates, and how to check the result afterward.

Does Shopify's customer import check for duplicates?

Partly. The importer enforces Shopify's rule that each customer's email and phone number are unique, but it matches them exactly, character for character, and it ignores everything else.

Shopify's help page on importing customer lists says a customer profile is created for each email address in the file. It also says customers with duplicate email addresses or phone numbers are skipped and aren't tagged, and that only the last profile with the duplicated email or phone is imported. In practice that means three things:

  • Repeats inside the file collapse to the last row. If one person appears three times with the same email, you get one profile with the details from the last row, and the earlier rows are dropped, not combined.
  • Shared phone numbers drop people. If a household or a small business shares one number in the Phone column, only one of those people is imported with it. Shopify's suggestion for a file with repeated emails or phones is to remove them from the CSV before importing and add them to profiles later, or merge profiles afterward.
  • Near-matches pass straight through. Different capitalization, a "+tag" or extra dots in a Gmail address are different emails to the importer. Each becomes its own customer.

The importer also doesn't compare names or addresses, so "Jane Doe, 12 Elm St" with a new email is a new customer even if she has ordered from you ten times.

What happens when an imported customer already exists?

That depends on one checkbox. During the import, Shopify offers Overwrite existing customers that have the same email or phone number, and the two choices behave very differently.

Situation in your fileOverwrite uncheckedOverwrite checked
Brand new email and phoneNew profile createdNew profile created
Same person twice in the file, same emailOnly the last row is importedOnly the last row is imported
Exact email or phone of an existing customerExisting profile isn't updated (as merchants report)Existing profile's data is replaced by the row, including tags
Capitalized, plus-tagged or dotted variant of an existing emailNew profile created, a duplicateNew profile created, a duplicate
Same name and address, different emailNew profile created, a duplicateNew profile created, a duplicate

Shopify's help page warns that if you overwrite existing customers, all of that customer's data is replaced, including the import tags. Merchants in the Shopify Community describe the practical effect: trying to add a tag to existing customers with a file that only had email and tag columns, they found that overwriting would blank the address, phone and existing tags, while leaving it unchecked didn't add the tags at all.

So the checkbox doesn't prevent duplicates either way. The last two rows of the table are where import duplicates come from, and only cleaning the file handles them. Leave Overwrite unchecked for a migration unless you deliberately want the file's version of each matching customer to win. For adding tags or a few fields to people you already have, bulk editing in the admin is the safer tool: Shopify's help page says it can edit first name, last name, tags, email, email marketing consent and metafields.

How to prepare a customer CSV so it doesn't create duplicates

The work happens in a spreadsheet before you click Import. Plan an hour or two for a few thousand rows.

  1. Export what you already have. In the Shopify admin, go to Customers > Export, choose All customers, tick Customer tags under Fields included, and pick a CSV format. Exports over 50 customers are emailed to you.
  2. Start from Shopify's template columns. Map your old platform's columns to Shopify's names: First Name, Last Name, Email, Phone, the Default Address columns, Accepts Email Marketing, Accepts SMS Marketing, Note and Tags. The Email column must exist even if some values are blank.
  3. Add a normalized email key to both files. Lowercase it, remove anything from a plus sign to the @, and for Gmail and Googlemail remove the dots before the @. In Google Sheets, with the email in column C: =IF(C2="","",IF(REGEXMATCH(LOWER(C2),"@(gmail|googlemail)\.com$"),SUBSTITUTE(REGEXREPLACE(LOWER(REGEXEXTRACT(C2,"^[^@]+")),"\+.*",""),".","")&"@gmail.com",REGEXREPLACE(LOWER(TRIM(C2)),"\+[^@]*@","@")))
  4. Add a phone key to both files. Digits only, and for North American numbers the last 10 digits, so +1 (555) 010-2000 and 555.010.2000 compare equal. With the phone in column M: =IF(M2="","",RIGHT(REGEXREPLACE(M2&"","[^0-9]",""),10))
  5. Remove repeats inside the import file. Sort by the email key and count each key with COUNTIF. Where one person has several rows, combine them into one by hand: keep the best address, join the tags, and keep the most careful marketing consent value. Don't let the importer silently pick the last row for you.
  6. Compare against your export. For each import row, check whether its email key or phone key appears in the export, for example =COUNTIF(Existing!N:N,N2)>0. Then sort the rows into three buckets, covered in the next section.
  7. Set marketing consent honestly. Shopify's help page asks you to enter no in Accepts Email Marketing for anyone who unsubscribed, never opted in, marked you as spam or bounced, and to set SMS and WhatsApp consent from each channel's own history.

If your old platform stored dotted and undotted Gmail addresses as separate contacts, step 3 is where you catch them. Our guide to Gmail dots, plus addresses and duplicate customers explains which variants really reach the same inbox.

Which rows should you import, update or leave out?

Only the rows that match nobody should go into the import. Everyone else is already a customer and needs a decision, not a new profile.

BucketHow you spot itWhat to do
NewNeither the email key nor the phone key appears in the exportImport it
Exact matchThe raw email or phone already exists in ShopifyRemove from the file; update the existing profile in the admin if the file has something newer
Likely matchKeys match only after normalizing, or the same name and address appears with a different emailRemove from the file; add the extra detail to the existing profile, or import and merge deliberately
Shared contactOne phone or email belongs to several people, such as a household or a company inboxKeep the shared value on one profile only, or leave it off and add it later
JunkTest sign-ups, role addresses such as info@ or admin@, obvious typosLeave out

A worked example shows why the middle rows matter. Say you're moving 4,000 newsletter contacts into a store that already has 2,500 customers. After normalizing, 120 of the 4,000 rows are repeats inside the file, 650 match an existing customer's exact email or phone, and 90 match only after normalizing. Importing the raw file would give you 650 rows that are not applied (or overwritten if you tick the box), 120 people collapsed to whichever row came last, and 90 new duplicates. Importing the cleaned file gives you 3,140 new customers and no new duplicates, and the 90 likely matches go on a short list for a staff member to check.

How to run the import and check the result

Import a small batch first, then the rest, and tag both so you can find every imported profile later.

  1. In the Shopify admin, go to Customers and click Import.
  2. Click Add file and choose your cleaned CSV. It must be UTF-8 and 15 MB or smaller; split larger lists into several files.
  3. Leave Overwrite existing customers that have the same email or phone number unchecked.
  4. Check Add tags to customers in this csv and use these tags to create a segment, and use a dated tag such as import-2026-11.
  5. Click Import customers. Start with 10 to 20 rows, open a few of the new profiles to confirm names, addresses and consent landed correctly, then import the full file.

Afterward, open the segment for your import tag and compare its count with the number of rows you imported. A lower count means rows were skipped, usually for a repeated email or phone you missed. Remember that skipped rows aren't tagged, so you'll find them by comparing the file with a fresh export, not inside the segment.

Then check the whole list for duplicates, because the import can still pair up with profiles you didn't think to compare against, such as POS profiles with only a phone. Our guide on how to find duplicate customers in Shopify walks through the export-and-formula method, and any pairs you confirm can be combined with Customers > [customer] > More actions > Merge customer, as covered in how to merge duplicate customers in Shopify.

What the customer CSV can't bring over

Some data doesn't travel in a customer CSV at all, and trying to force it in is a common source of messy profiles. Shopify's help page lists these limits:

  • Passwords. Passwords can't be migrated from another store. Customers sign in again or create accounts in Shopify.
  • Order history. The Total Spent and Total Orders columns aren't imported, and orders can't be imported with the customer file. Use a migration app or the Order API, and import products first, then customers, then historical orders, as Shopify's migration guide recommends, so orders attach to the right customers.
  • Engagement history. Opens, clicks and bounces don't import. Shopify suggests recording engagement level in Tags (for example "very engaged" for contacts active in the last 3 months) and segmenting on it.
  • Most metafield types. Only boolean, date, date and time, integer, decimal and single line text metafields work in the CSV, and the metafield definition must already exist.

If historical orders arrive through a migration app, its own matching rules decide whether orders attach to the customers you imported or create new ones. Check the app's documentation and run a small test, because a second wave of duplicates can appear at this stage.

How Twinfold helps

Twinfold is a Shopify app by NewClick (independent, not made by Shopify) for the step after an import: finding the duplicates that got through anyway. It doesn't clean your CSV or change how Shopify imports.

Scan for duplicates reads your whole customer list through Shopify's bulk export, and scanning is free on every plan. Groups show Why they match: Email variant (the same address after lowercasing, removing a "+tag", and removing Gmail dots), Same phone (one profile's phone found on another profile's address, with matching names) or Same name and address. Values shared by more than 20 customers are ignored, so a shared company phone doesn't glue strangers together. Every merge is previewed with Shopify before you confirm it, and merges can't be undone, so a scan right after an import is the moment to review the High and Medium confidence groups while the import is fresh in your mind.

Frequently asked questions

Does Shopify check for duplicate customers when you import a CSV?

Only for exact matches. Shopify treats a customer's email and phone number as unique, so the importer skips rows that repeat an email or phone and imports only the last one. It doesn't compare near-matches, so a capitalized, plus-tagged or dotted Gmail version of an existing email is imported as a new customer.

What happens if an imported customer already exists in my Shopify store?

If you leave Overwrite existing customers that have the same email or phone number unchecked, the existing profile isn't updated; merchants in the Shopify Community report that those rows are simply not applied. If you check it, Shopify replaces all of that customer's data with the row in your file, including tags, so blank cells can wipe fields.

Can I import customers into Shopify without an email address?

The Email column must be present in the CSV, but Shopify's help page says the value can be blank, so you can import rows that only have a phone number or a name. Profiles without an email are harder to deduplicate later, so keep a phone number or address on them where you have one.

Can I import order history with the Shopify customer CSV?

No. The customer CSV imports customer details only. The Total Spent and Total Orders columns aren't imported, and order history needs a migration app or the Order API. Shopify recommends importing products first, then customers, then historical orders, so orders attach to the right customers.

Sources

  1. Shopify Help Center: Importing and exporting customer lists
  2. Shopify Help Center: Migrate to Shopify
  3. Shopify Community: Add tags from a CSV without overwriting customers
  4. Shopify Community: Import customer tags without overwriting existing data