Why doesn't Shopify recognize my returning customers even when the email matches?

Two orders from the same person, same email address, and Shopify still treats them as strangers. Here's what actually causes the split and how to fix it without guesswork.

customersanalyticsduplicate profilescustomer accountsattribution

What's going on

A customer places two orders using what looks like the exact same contact details, but your Shopify admin shows them as two separate customer profiles, or one order shows no linked customer at all. Their order history looks split, your 'returning customer' count is quietly wrong, and if you're running loyalty, subscription, or personalization apps, those can misfire too because they're reading a customer identity that Shopify itself never unified.

This isn't cosmetic. It throws off repeat-purchase rate and lifetime-value numbers in your analytics, it can cause loyalty points or subscription perks to land on the wrong profile, and it makes customer service slower because an agent pulling up 'the customer' by email doesn't see the full order history.

The good news is that Shopify's matching logic is understandable once you know where to look, and the fix for existing duplicates is a free, built-in admin action. Preventing it from recurring depends on identifying which of a few common causes is actually happening in your store.

Why it happens

Shopify links an order to a customer profile using an exact match on identity fields, primarily email (and phone, if collected), captured at the moment of checkout. It does not do fuzzy matching. A customer who checks out as a guest on one order and creates or logs into an account on another can end up as two separate profiles even though a human would call the contact details identical, because the underlying identifiers used at checkout time weren't identical strings.

Common silent differences include capitalization, a stray trailing space pasted from an autofill or a phone keyboard, and email subaddressing such as [email protected] versus [email protected], which many providers treat as the same inbox but Shopify treats as two different email strings. None of these are visible at a glance in the orders list.

Layered on top of Shopify's own matching, apps that manage loyalty points, subscriptions, or personalized recommendations often maintain their own separate notion of 'who this customer is,' tied to a browser cookie, local storage, or their own database row, rather than always reading Shopify's canonical customer ID. When a customer switches devices or checkout paths, the app's own recognition can break independently of what the native admin shows.

5 ways to fix it

1

Compare the two order records field-by-field before assuming a bug

Open both orders in admin and check the exact email string (copy it into a text editor to spot trailing spaces, autocorrect changes, or different capitalization), whether one order shows a linked customer profile and the other shows 'No customer' or a second profile, and whether one was placed as a guest and the other while logged into an account. This single check usually reveals which of the causes below actually applies to your case, so you fix the right thing instead of guessing.

2

Use Shopify's built-in Merge customers tool for the free, native fix

From Customers, select the two duplicate profiles and choose Merge customers (available on all plans). This combines order history, total spent, and tags into one profile and keeps the record you choose as primary; it does not, however, prevent the split from happening again on the next order, so treat it as a cleanup step, not a permanent fix. If you're seeing this repeatedly, check Settings > Checkout to see whether guest checkout is enabled alongside account creation, since that combination is the most common cause of split profiles.

3

Check for email subaddressing or autocorrect variants, not just typos

Shopify matches customer profiles on the exact email string, and it does not strip plus-addressing (e.g., [email protected] vs [email protected] are treated as different customers) or normalize case consistently across every code path. If your two 'identical' orders differ by a tag, a dot, or capitalization the customer added themselves at checkout, that's enough to create a second profile even though a human reads both emails as the same person.

4

Audit any app that creates its own customer identity (loyalty, subscriptions, personalization)

Apps that manage rewards, subscriptions, reviews, or personalized recommendations often keep their own customer ID tied to a cookie, browser session, or their own database rather than reading Shopify's customer_id. If a customer switches devices, clears cookies, or checks out as a guest once and with an account another time, the app can lose the thread even though Shopify's own orders admin shows both purchases fine. Check the app's own dashboard or its 'customer matching' settings if it's driving the analytics or attribution number you're questioning.

5

Review attribution and analytics settings if the issue is reporting, not the customer profile itself

Shopify's Customers report and Analytics first-time vs. returning customer counts are calculated from the customer_id attached to each order, not from a live email lookup. If two orders were never merged into one profile, both can be counted as first-time purchases in your reports even after you've fixed the underlying profiles going forward, because historical orders don't retroactively recalculate. Re-pull reports after merging, and note that recently placed orders may take a short refresh cycle to reflect a manual merge.

Bottom line

Most of the time this comes down to two orders never sharing a Shopify customer_id, either because guest checkout ran alongside logged-in checkout, the email string differed by a character Shopify doesn't normalize, or an app kept its own separate identity. Start with Shopify's free Merge customers tool and an email-string comparison before suspecting any app; if the mismatches keep recurring at volume, a store audit or a lightweight customer-data-hygiene guide is more useful than another app bolted onto the problem.

Still Stuck?

Browse the rest of the problem library, run a free storefront scan to catch issues like this automatically, or email us and we'll work out a custom solution for it.