DATA · INTEGRATIONS · MARKETING · 30 SEPTEMBER 2025 · 7 MIN READ
CDPs, ESPs and the customer record nobody owns
A CDP does not fix your customer data. It gives the mess a new address, and charges you per profile for the privilege.
Most Shopify stores do not need a customer data platform, because the problem they are trying to solve is not storage — it is that nobody has decided which system holds the authoritative customer record and what key identifies a person. A CDP buys you identity resolution across sources and activation to many destinations, and it is worth real money when you genuinely have several sources and several destinations: multiple storefronts, offline sales, a subscription platform, a helpdesk, a loyalty programme. If your customer data lives in Shopify and one email platform, a CDP adds a per-profile bill, a sync to maintain and a third place for consent to go stale, and the same outcome is available by naming an owner and fixing the join key.
IN SHORT
- The question to answer before buying anything is: which system holds the authoritative customer record, and what field identifies a person across systems?
- A CDP earns its cost when you have many sources and many activation destinations. With one storefront and one email platform, it mostly adds a bill and a sync.
- Email is the join key almost everyone uses and it is unreliable: guest checkout, work and personal addresses, and shared household addresses all break it.
- Shopify’s `customerMerge` mutation consolidates duplicate customers, runs asynchronously and is not reversible — `customerMergePreview` exists so you can see which record survives before committing.
- Consent is data. Shopify’s Customer Privacy API defines four purposes — preferences, analytics, marketing and sale of data — and documents that consent may only be recorded from a visitor interaction, never set on their behalf.
- Every app you distribute through the App Store must answer the `customers/data_request`, `customers/redact` and `shop/redact` webhooks within 30 days, whether or not it stores personal data. A bespoke integration has the same obligation with nobody enforcing it.
The problem is ownership, not storage
Here is the conversation that leads to a CDP evaluation. Marketing cannot segment on lifetime value because the email platform only knows what the app synced. Support cannot see a customer’s subscription because that lives in another tool. Finance has a different count of customers than the store does. Somebody suggests a single view of the customer, and a procurement process begins.
None of those four symptoms is a storage problem. They are all the same problem: four systems each hold a partial customer record, none is designated as authoritative, and the fields they join on do not agree. Buy a CDP and you have five systems, one of which is now authoritative by assumption rather than by decision — and it derives everything it knows from the four that disagreed.
That is not an argument against CDPs. It is an argument for doing the cheap part first, because the cheap part is also the hard part, and no product does it for you.
Where the record actually lives on a Shopify store
Worth writing down explicitly, because most teams have never seen it on one page.
- Shopify holds orders, addresses, the customer account, and marketing consent state for email and SMS. It is the only system that knows what was actually bought and paid for, which makes it the natural authority for transactional truth.
- The email platform holds engagement — opens, clicks, flow membership — plus whatever profile attributes the sync pushed. It usually holds more contacts than Shopify has customers, because it collects from popups and forms too.
- The helpdesk holds the conversation history and, quietly, the corrections: the customer who told support their real email, the address change that never went back to Shopify.
- Subscriptions, loyalty, reviews, the ERP or 3PL each hold one slice and each identify customers slightly differently.
Identity is the whole job
Almost every "single customer view" project fails on the join, and the join is almost always email.
Email is a poor identifier for a commerce business. A guest checkout produces an order with no customer account. A customer who buys with a work address and then a personal one is two people to your stack. Two people in a household sharing an address are one person. Someone changes email provider and becomes a new customer with no history, which is how a loyal buyer ends up in a win-back flow.
Shopify gives you a tool for the specific case of duplicate customer records: the customerMerge mutation. Two things to know before using it at volume. It does not guarantee which of the two records survives — the documented priority runs through an explicit override field, then which record has an email, then account state and marketing consent — so use customerMergePreview and read resultingCustomerId before you commit. And it returns a job rather than a result, because it is asynchronous, with no documented rollback. Merges are one-way. Write the audit trail yourself before you run a batch of them.
The useful discipline, CDP or not, is to define your identity key deliberately and write it down: normalised email as the primary, with a documented rule for guest orders and a documented rule for what you do when a customer tells you two addresses belong to them. A CDP will ask you for exactly this configuration on day one, which is worth knowing in advance — you can do the work without buying the tool, and you cannot buy the tool instead of doing the work.
Consent is part of the record, and it decays
The part of this that is a legal exposure rather than a marketing inconvenience: consent has to travel with the profile, and in a multi-system stack it usually does not.
On the storefront, Shopify’s Customer Privacy API defines four consent purposes — preferences, analytics, marketing, and sale of data — and provides checks for each before you process anything. Its guidance is unambiguous on the point teams get wrong: consent should only be recorded from a visitor interaction such as accepting or declining a banner, and never set automatically on the visitor’s behalf. Any pixel or tag that decides for itself that consent exists is a compliance problem regardless of how the data is later stored.
For marketing state, Shopify holds email and SMS marketing consent on the customer record. If your email platform holds its own subscription state and the two drift, you will eventually send to someone who unsubscribed in the other system. That is not a hypothetical failure — it is the normal end state of a two-way sync nobody reconciles.
Deletion is the test of whether you have a coherent architecture. When a customer asks to be erased, you must be able to name every system holding their data and remove it from all of them. Shopify enforces this on App Store apps: they must implement the customers/data_request, customers/redact and shop/redact topics, complete the action within 30 days unless legally required to retain the data, and do so whether or not the app collects personal data at all — with shop/redact arriving 48 hours after uninstall. A bespoke integration you built yourself carries the same obligation with no reviewer to check it, which makes it the place this quietly goes wrong.
Adding a CDP adds a copy of every profile. If your deletion process is a person remembering to check four dashboards, make it five before you sign.
What Shopify plus one email platform already does
This is the option nobody presents at an evaluation, so here it is. Shopify holds orders, customers, consent state and customer segments. A competent email platform holds engagement and runs flows off Shopify events. Between them you can build the segments that produce nearly all of the revenue attributed to "customer data" work: first-time versus repeat, high value, lapsing on the interval that matches your product’s repurchase cycle, bought category A and not category B, abandoned checkout, subscribed and never purchased.
If nobody at your company can currently build those six segments, buying a CDP will not be the thing that fixes it. The constraint is that the sync between the two systems is incomplete or that nobody owns segmentation — and both are cheaper to fix directly.
We would put the honest threshold roughly here: one storefront, one email platform, one helpdesk, fewer than a handful of tools reading customer data, and a team without a dedicated data person. Below that line, get the Shopify-to-ESP integration right and stop. It is less impressive and it is the correct answer.
When a CDP genuinely earns it
The cases where we would recommend one share a shape: many sources, many destinations, and a real person whose job is to run it.
- Several storefronts or brands, or store-per-country, where the same person shops across more than one and each store has its own customer list.
- Meaningful offline or wholesale revenue that has to be stitched to online behaviour — retail POS, trade accounts, phone orders.
- Customer data that originates outside Shopify: a mobile app, a booking system, a services arm, a support product.
- More than a handful of activation destinations — ad platforms, email, SMS, on-site personalisation, a warehouse or BI tool — where the alternative is that many point-to-point integrations, each with its own idea of who a customer is.
- Someone whose job includes owning it. A CDP with no owner becomes an expensive, slightly stale copy of Shopify within a year.
The cheaper first move
If you do one thing after reading this, do this instead of a vendor demo. Write a single page that names, for every system holding customer data: what it holds, what identifies a customer in it, which direction data flows, and who is accountable for it being right. Most teams cannot complete that page, and the gaps in it are the actual project.
Then pick the authoritative system for each domain — Shopify for transactional truth, one system for consent, one system for identity — and make every other system a consumer of it rather than a peer. Reconcile on a schedule: counts of customers, counts of subscribed contacts, counts of records changed since the last sync. Discrepancies found by a job are cheap; discrepancies found by a customer receiving mail they unsubscribed from are not.
Do that and one of two things happens. Either the problem is solved and you have not bought anything, or the page you wrote is now the requirements document for a CDP evaluation that will go considerably better than it would have last month.
Questions this raises
Do you need a CDP for ecommerce?
Usually not. With one Shopify store and one email platform, Shopify already holds transactional truth and consent state, and your ESP can segment off it — a CDP adds a per-profile cost, another sync and another copy of consent to keep current. A CDP earns its place when you have several genuine data sources, several activation destinations, and someone whose job is to own it.
What is the difference between a CDP and an ESP?
An ESP sends messages and stores the profile data needed to send them. A CDP’s job is upstream of that: resolving identities across multiple sources into one profile and making that profile available to many destinations, including but not limited to email. If you only have one destination, you are paying for a resolution layer you could do with a well-specified join key.
Which system should own the customer record on Shopify?
Split it by domain rather than picking one winner. Shopify should own transactional truth — orders, addresses, what was actually bought — because it is the only system that knows. One system should own consent, and it should be the one your storefront and checkout write to. One system should own identity resolution. Everything else consumes those, and no system should be a peer with an equal claim.
How do you handle duplicate Shopify customer records?
Use `customerMerge`, but preview first. The documented priority for which record survives depends on an override field, which record has an email, and account state and marketing consent — so call `customerMergePreview` and check `resultingCustomerId` before committing. The mutation is asynchronous and there is no documented way to undo it, so record what you merged before you merge in bulk.
Where should customer consent be stored?
In one designated system, written from an actual visitor interaction. Shopify’s Customer Privacy API covers four purposes — preferences, analytics, marketing and sale of data — and is explicit that consent must not be recorded on a visitor’s behalf. Marketing subscription state also lives on the Shopify customer record, so if your email platform keeps its own copy, a reconciliation job is the only thing standing between you and mailing someone who opted out.
What does GDPR require of a Shopify integration?
Practically: know every system holding personal data, and be able to export and erase it on request. Shopify requires App Store apps to implement the `customers/data_request`, `customers/redact` and `shop/redact` webhooks and to act within 30 days, regardless of whether the app stores personal data. A custom integration carries the same duty with nobody reviewing it, so build the erase path when you build the sync, not when the first request arrives.
NEXT STEP
Free store audit
A senior Shopify engineer reviews your storefront, theme performance and checkout, then sends a prioritised list of fixes.
