An AI customer journey is a single machine-readable record of one person's contact with your company, assembled by joining data from systems that were never designed to be joined: web analytics, CRM, the support desk, billing, and product telemetry. The join is the product. Everything else is reporting.
That framing is not how the topic is usually taught, and it is the reason most governance work on it lands in the wrong place. The standard treatment maps five stages — awareness, consideration, decision, retention, advocacy — hands each stage an AI capability, and treats governance as something you bolt onto the capability: approve the chatbot, review the churn model, sign off the send. Our position is that the stages are not where the risk sits. A stage is a label on a bucket of events. The risky, expensive, legally exposed object is the operation that decided those events belong to the same human being in the first place, and that operation is invisible in every stage diagram ever drawn.
Pedro Monjo, an enterprise architect at Adobe who writes independently about customer data platform implementations, described the failure plainly in an October 2022 post on profile collapse. We rely on Adobe product documentation later in this article, so his affiliation is worth stating up front. Mobile operators recycle phone numbers. Someone gives you a number, cancels the line, the operator reassigns it, and the next holder gives you the same number when they register. At that point, he writes, "both profiles will be collapsed", and, unlike a shared family tablet, "the individuals have no relationship". Two strangers, one profile, one journey, one set of automated decisions applied to whichever of them the model happened to be looking at.
The short answer: Govern the join, not the stage. Every place where two records about a person are merged into one profile needs a recorded match rule with a confidence level, a named set of permitted purposes, a list of every downstream system the merged profile reaches, and an owner who can unmerge it, because a wrong join sends the wrong person's data everywhere at once, and a deletion request that does not reach the whole join is not a deletion.
Last updated: July 31, 2026.

What an AI customer journey actually is
An AI customer journey is the joined record of one person across every system that observed them, plus the automated decisions taken on that record. It has two halves people routinely conflate: the assembly (matching identifiers, merging records, deriving traits) and the action (scoring, routing, personalising, sending). The assembly is where the errors are made. The action is where they become visible.
The clearest public definition of the assembly half does not come from marketing at all. The US Office of the National Coordinator for Health IT defines patient matching as "the identification and linking of one patient's data within and across health systems in order to obtain a comprehensive view of that patient's health care record", accomplished "by linking multiple demographic data fields such as name, birth date, phone number, and address" (ONC, Patient Identity and Patient Record Matching). Swap "patient" for "customer" and "health systems" for "martech stack" and you have the operation a customer data platform performs thousands of times a second. The vocabulary differs. The mathematics does not.
Two things follow from that definition, and both are usually skipped.
First, the journey is derived, not observed. Nobody hands you a customer journey. You manufacture one by asserting that a cookie ID, an email address, a phone number, a loyalty number, a support ticket requester and a billing account all denote the same person. Every one of those assertions can be wrong.
Second, the journey is stateful across systems you do not control. The joined profile is pushed downstream to email tools, ad platforms, support consoles and agent runtimes. By the time an AI model reads it, the profile has usually been copied several times. We wrote about the general form of this problem in our earlier analysis of the second-copy problem in workplace search; the customer-journey version is the same failure with a legal deadline attached.
| Layer | What it holds | Who usually owns it | What breaks here |
|---|---|---|---|
| Collection | Raw events per system | Each system owner | Consent capture, over-collection |
| Identity resolution | Match rules, identity graph | Data engineering or CDP admin | Wrong merges, missed merges |
| Joined profile | Unified traits, derived scores | Marketing ops or data | Purpose drift, sensitivity jump |
| Activation | Downstream copies in email, ads, support, agents | Channel owners | Deletion gaps, stale data |
| Decision | Model output applied to the person | Whoever owns the model | Unexplained outcomes |
Most programmes of this kind govern the top and bottom rows and leave the middle three to whoever configured the platform. That is the gap this article is about.
The join is the thing you govern, not the stage
Governing the stage means asking whether an email should be sent. Governing the join means asking whether the profile that email is addressed to is one person. The second question controls the first, and almost nobody asks it.
Here is the asymmetry that makes the join the higher-value control point. A stage-level mistake harms one interaction: a badly timed offer, a clumsy chatbot reply. A join-level mistake harms every interaction downstream of it, in every channel, simultaneously, and it does so silently, because the systems consuming the profile have no way to know the merge was wrong. Twilio Segment's own configuration documentation is unusually direct about the blast radius. Describing hard-coded identifier values that leak from development into production, it warns that this "can cause hundreds of profiles to merge incorrectly and can have costly consequences when these spaces are already feeding data into a production email marketing tool or push notification tool downstream" (Segment, Identity Resolution Settings).
Read that again as a governance statement rather than a configuration tip. A vendor is telling you that a single bad default value in one codebase can cross-contaminate hundreds of people's records and push the result into live sending systems. No stage review catches that. No model card catches it. It is caught, if at all, by whoever owns the match rules.
The scale of the surface makes it worse. The 2026 State of Martech report from Scott Brinker's chiefmartec and Frans Riemersma's MartechTribe counts 15,505 commercial marketing technology products, up from 15,384 the previous year, a net increase of 0.79 percent after fifteen years of steep growth (State of Martech 2026). Flat supply does not mean flat stacks. It means churn underneath, and churn is what puts new identifiers into your join without anyone revisiting the match rules. Nine systems is a realistic count for a mid-market B2C journey, and nine systems produce far more than nine joins.
So the governance object is not the funnel. It is the set of match rules that turns scattered events into a person, and the set of pipes that carries the result outward. Name them, count them, put an owner on each, and the rest of customer journey automation becomes a normal engineering problem. Skip that, and you are governing outputs of a process you cannot describe.
Why the stage framing survives anyway
Stage framing survives because it maps to how teams are organised. Demand generation owns awareness, sales owns decision, support owns retention. That org chart is real and nothing here argues for abandoning it. What it cannot do is carry accountability for the join, because the join spans all of them and belongs to none. Ask a room of stage owners who signs off the rule that says a phone number match is sufficient evidence to merge two records, and you will get silence or a name from a different department. That silence is the finding.
Identity resolution is sometimes simply wrong
Identity resolution merges records using two families of rule. Deterministic rules match on exact identifiers — same email, same customer number. Probabilistic rules score partial evidence, such as similar names at the same address on the same device, and merge above a threshold. Real platforms use both, which means every joined profile carries a mixture of certainty and inference that is rarely surfaced to the people acting on it.
The best public measurement of how badly identifier matching degrades in practice comes, again, from healthcare, because healthcare is the only sector that has published at scale on it. A multisite study of 398,939 confirmed duplicate patient record pairs, published in Perspectives in Health Information Management, found that only 4.99 percent of duplicate pairs had no discrepancy in key identifying fields — 95.01 percent had at least one. Middle name was discrepant in 58.1 percent of pairs, Social Security number in 53.4 percent, last name in 23.7 percent, first name in 22.6 percent, and date of birth in 6.2 percent (Why Patient Matching Is a Challenge, PMC4832129). Misspellings accounted for 53.14 percent of first-name discrepancies and 33.62 percent of last-name discrepancies, with swapped name fields accounting for part of the remainder.
Those are records about the same person that failed to match. The mirror error — records about different people that did match — is the one that damages customers, and it is much less studied because it is much harder to confirm.
What the vendors admit in their own documentation
We could not run a false-merge audit on a live customer dataset for this article, so we did the next most useful thing and ran a small documentation survey instead. On 31 July 2026 we fetched the current identity-resolution documentation of three widely deployed joined-profile platforms and recorded whether each one documents wrong-merge risk in its own product docs, in its own words. This is a documentation review, not a deployment test, and it should be read as such.
| Platform | Documents wrong-merge risk? | What it calls it | Evidence |
|---|---|---|---|
| Adobe Experience Platform | Yes, explicitly, with a named feature to prevent it | "graph collapse" | Identity Graph Linking Rules overview, last updated 18 June 2026 |
| Twilio Segment (Unify) | Yes, in configuration guidance, with blocked values and identifier caps as the controls | "profiles to merge incorrectly" | Identity Resolution Settings |
| Salesforce Data Cloud | Could not verify, the help article renders client-side and returned no extractable text through any of our three fetch methods | — | help.salesforce.com identity resolution (HTTP 200, body not extractable) |
Adobe's phrasing is worth quoting because it is the clearest vendor acknowledgement we found that the join fails in the direction that hurts people: "there are possible scenarios where certain data could try to merge multiple disparate profiles into a single profile ('graph collapse')". The same page enumerates the scenarios. Shared devices: "Family computers and tablets", "Public kiosk", and, the one that ought to make every support leader sit up — "Call center personnel log in on a single device on behalf of customers calling customer support to resolve issues." Then invalid identifiers: "instances of users who provide fake values as phone numbers and/or email addresses when registering."
Note what those three scenarios have in common. None of them is a bug. A family sharing a tablet is normal. A call-centre agent handling twelve customers from one browser is the job. A shopper typing a junk phone number to skip a form is ordinary consumer behaviour. The join breaks under completely routine conditions, which is why it needs a standing control rather than a one-off data-quality project.
Segment's controls are the mirror image of the same problem: it recommends blocking identifier values such as -1, null, anonymous and zeroes-and-dashes patterns from being promoted to profile identifiers at all, and it lets administrators cap how many values of each identifier type a single profile may accumulate — defaulting to one user_id and five of everything else. Those caps are a statement about trust. An identifier you allow five of is one you do not believe uniquely denotes a human.
The three failure modes, and who notices each
| Failure | What happens | Who notices first | Typical time to detection |
|---|---|---|---|
| False merge (over-join) | Two people become one profile; each sees the other's history | Support agent, or the customer | Weeks to never |
| Missed merge (under-join) | One person appears as several; journey analytics understate everything | Analytics team | Quarterly reporting |
| Silent re-merge | A previously split profile recollapses after new data arrives | Nobody, usually | Never |
The third row is the one to worry about. Adobe's troubleshooting guidance notes that graphs collapsed before you enable protective settings "will not be affected, until new data is ingested such that the collapsed graph is updated", which means fixing the rule going forward does not repair the history, and the repaired state is not guaranteed to hold. If your remediation plan is "we changed the setting", you have not finished.
The joined profile is more sensitive than any of its parts
A joined customer profile is categorically more sensitive than the sum of the records that made it, and this is the point most data inventories get wrong. The inventory lists each source system with its own sensitivity rating. Web analytics: low. CRM: medium. Support tickets: medium. Billing: medium. Product telemetry: low. Nothing on that list says "high", so the joined store inherits "medium" and gets treated accordingly.
But the join creates information that existed nowhere before it. Billing alone says someone pays monthly. Support alone says someone asked about a medication interaction. Web analytics alone says a browser visited three pages. Joined, they say a named, addressable, contactable individual with a card on file has a specific health concern and is shopping for alternatives, a claim no source system ever made and none of them rated.
GDPR names this effect in Article 6(4), which requires a controller assessing a new purpose to weigh, among other factors, "the nature of the personal data, in particular whether special categories of personal data are processed" and "the possible consequences of the intended further processing for data subjects" (Article 6 GDPR). A join can manufacture a special category from ordinary parts. Nothing in a typical identity-resolution configuration screen prompts anyone to notice.
Practical consequence: rate the joined store on its own merits, not on the maximum of its inputs. If the join makes inference X newly available, X is what you are protecting. The masking question follows from that, which fields are visible to which consumer of the profile, and at what point in the pipe the masking happens. Our earlier work on masking PII inline at the gateway covers the mechanism; the customer-journey application of it is that the mask has to sit between the joined profile and the model, not between the source system and the join.
The derived-trait trap
Joined profiles do not stay joined. They spawn derived traits: propensity scores, lifetime value bands, churn risk, next-best-action labels. These are the outputs most journey programmes are actually built to produce, and they are the most portable objects in the whole system, a single number or label, easy to copy into any tool, stripped of the evidence that produced it.
Once a derived trait leaves the profile store, three properties go with it: which sources contributed, the confidence of the underlying join, and the purpose the source data was collected for. A churn score in an email tool is just a number in a column, and a number in a column looks like nobody's compliance problem.
Treat derived traits as first-class records with their own lineage, not as attributes. We took the same position about meeting and call transcripts in governing the derived record, and the argument transfers exactly: the derivative is often more consequential than the source, and it is always easier to move.
Purpose limitation is what breaks first
Of everything that can go wrong with a joined customer journey, purpose limitation goes wrong earliest and most quietly. GDPR Article 5(1)(b) requires that personal data be "collected for specified, explicit and legitimate purposes and not further processed in a manner that is incompatible" with those purposes (Article 5 GDPR). Read that against what a customer data platform is for. The entire value proposition of a joined profile is further processing. Not necessarily incompatible further processing — but the platform's default posture is that all data is available for all purposes, and the compatibility question is asked, if ever, after the pipe is built.
The concrete version is mundane. A customer emails support to say a delivery went to the wrong address and they are moving house. That message was collected to resolve a delivery problem. Three weeks later it is in the joined profile, it has raised a "life event: relocation" trait, and the trait is feeding a moving-house promotional sequence. Nobody decided to do that. The support desk was connected to the profile store because connecting things is what the project was for.
Article 6(4) sets out the compatibility test for exactly this case: link between original and new purpose, the context of collection and "the relationship between data subjects and the controller", the nature of the data, the consequences for the person, and the safeguards in place. It is a five-factor judgement, not a checkbox, and it has to be made per purpose, which is only possible if you know which purposes each field is reachable from. That knowledge is a property of the join, not of the source system.
Why support data is the usual first casualty
Support data is the highest-quality, highest-intimacy, lowest-consent-clarity data in the stack. People tell a support agent things they would never enter into a form: health conditions, financial trouble, bereavements, disputes with your company. It is collected under an obvious and narrow purpose — help me, and it is technically trivial to join, because the requester's email address is usually the same identifier the CRM uses.
That combination is what makes support data the easiest thing in the stack to repurpose. It requires no new collection, no new consent screen, and no visible change to the customer. The only thing standing between "we connected the help desk to the profile store" and a purpose-limitation breach is somebody having written down what the help-desk fields are allowed to be used for.
| Source | Original purpose, as the customer understood it | Common reuse | Compatibility risk |
|---|---|---|---|
| Support tickets | Resolve my problem | Segmentation, churn scoring, targeting | High |
| Billing records | Take payment, meet tax obligations | Lifetime value, credit-style scoring | High |
| Product telemetry | Make the product work, fix faults | Engagement scoring, upsell triggers | Medium |
| Web analytics | Measure and improve the site | Retargeting, lookalike audiences | Medium to high, consent-dependent |
| CRM notes | Manage the commercial relationship | Model training | Medium, and often forgotten |
Nothing in this section is legal advice, and the compatibility judgement in your jurisdiction belongs to your counsel or DPO. What is an engineering question, and what this article does claim, is that the judgement cannot be made at all unless the permitted purposes are recorded against the join. That is field three of the Join Record below.
Deletion has to reach every system the join touched
A deletion request that stops at the profile store is not a deletion. This is the clearest, most testable, least arguable governance requirement in the whole customer journey, and it is failed routinely.
The statutory language is explicit on both sides of the Atlantic. Under California law, a business receiving a verifiable deletion request must delete the information from its own records, "notify any service providers or contractors to delete the consumer's personal information from their records", and "notify all third parties to whom the business has sold or shared the personal information to delete the consumer's personal information unless this proves impossible or involves disproportionate effort", and service providers must in turn notify their own service providers and contractors (Cal. Civ. Code § 1798.105(c)). GDPR Article 17(2) imposes a parallel obligation to take "reasonable steps, including technical measures, to inform controllers which are processing the personal data" where the data has been made public (Article 17 GDPR).
The obligation is expressed as a fan-out. Satisfying it depends entirely on knowing the fan-out shape, which is another way of saying knowing what the join reaches.
Vendors know this is hard, and the honest ones say so in the docs. Segment's Delete Profile Identifier API carries a warning that is worth reading twice: "This API removes identifiers from Unify systems only. For complete user data deletion across all Segment systems (required for GDPR, CCPA, and other privacy regulations), see Segment's user deletion and suppression guidance" (Delete Profile Identifier API). The same page notes that deletions flow onward to connected systems and warns customers to check that their "analytics workloads (BI tools, data pipelines, ML models) can handle deleted identifiers". Deleting from the join is step one of several, and one API call is not the whole job.
The enforcement case that turned this into a number
The most instructive regulatory decision on partial deletion is the French data protection authority's 2023 action against the adtech company Criteo. On 15 June 2023 the CNIL imposed a €40 million fine following complaints filed in 2018 by Privacy International and noyb. The finding that matters here is not the consent breach that got the headlines. It is the erasure finding. Criteo was held to have fallen short of its Article 17 obligations "by failing to effectively delete personal data upon individuals' requests for erasure, because the company only stopped displaying personalised ads without effectively deleting the personal data of the requestors" (Bird & Bird analysis of the CNIL decision; noyb summary). The same decision faulted Criteo for not ensuring that its publisher partners had obtained user consent on its behalf, which is a reminder that a join's reach can extend to parties you do not operate. France's Conseil d'État upheld the fine on 4 March 2026 (Décision n° 482872; noyb summary).
The statutory language quoted in this section is paraphrased for engineers, not offered as legal advice, and the scope of any specific obligation in your jurisdiction is a question for your counsel or data protection officer. Translate the case into a rule for your own stack: suppressing an identifier from activation is not erasing it, and "we stopped using it" is not a defence that has survived contact with a regulator. If your deletion runbook ends with a suppression list, it ends too early.
We should be transparent about the sourcing here. The CNIL's own English and French press pages for this decision now return "This page is no longer available", because the authority anonymises sanction pages after its publication window expires, and the primary deliberation text on Légifrance (SAN-2023-009) returned HTTP 403 to every fetch method we tried. The Conseil d'État decision itself is reachable and is linked above. The 2023 findings, though, are attributed to legal-analysis and complainant sources rather than to the CNIL's own text. Treat the operative fact — deactivation is not deletion — as well established and the fine's procedural details as second-hand.
The volume is going one way
Deletion is not a rare event you can handle by hand. DataGrail's 2026 Privacy & AI Trends Report found data subject request volume rising for a fifth consecutive year, with deletion requests up 567 percent since 2021, and put the manual cost at upwards of $1.5 million a year for a medium-sized organisation, by applying Gartner's per-request cost estimate to 2025 request volumes (DataGrail, The $1.5M DSR Problem). The $1,524 underneath it is not DataGrail's own measurement: it originates in a Gartner analyst report we could not read, since gartner.com refused every fetch, and every downstream citation we checked traces back to that one document. Treat it as a single-origin estimate of unknown vintage, and the 567 percent rise and the $1.5 million total as DataGrail's own panel, with the usual caution about vendors measuring problems their product solves.
The governance conclusion holds regardless of the exact number. Manual fan-out across nine systems, repeated hundreds of times a year, is not a process. It is a queue that will eventually be handled badly.
Prerequisites: what to have before you join a single record
Before the first identifier is matched, five things need to exist. Not documented perfectly. Existing.
1. An identifier inventory. Every identifier type your systems emit, with the system that mints it, whether it is immutable, and whether it can legitimately be reused by a different person. Phone numbers can. Email addresses can, on corporate domains, when staff turn over. Cookie IDs are shared by whoever uses the browser. This inventory is what makes the next four possible.
2. A blocked-value list. The junk values your own developers and customers actually produce: test accounts, null, -1, anonymous, the office phone number, [email protected]. Segment's defaults are a reasonable starting set; the useful additions come from counting the twenty most frequent values of each identifier in your own production data. If one value appears on more than a handful of profiles, it is not an identifier.
3. A per-identifier cardinality cap. How many distinct values of each identifier a single profile may hold. One user_id. Perhaps one email. Five device IDs in a rolling week. A cap is a cheap, mechanical brake on graph collapse and it is the single highest-value control on this list.
4. A purpose register for each source. One line per source system: what the data was collected for, in language the customer would recognise. Not the legal basis, the purpose. This takes an afternoon and it is the artefact everything in the purpose-limitation section depends on.
5. A named owner for the match rules. One person, with authority to change a rule and to unmerge a profile. If this name does not exist, stop here and get it. Every other control on this list decays without it.
Missing any of the five is a legitimate reason to delay the join. It is not a reason to delay the journey work entirely — you can build stage-level customer journey automation on unjoined data all day, and many teams should, because it is safer and it is where the quick wins are.
The Join Record: five fields per join
The Join Record is our name for the artefact this article argues you are missing. It is one row per join rule — not per customer, not per system, per rule. A nine-system stack typically produces between six and fifteen rules, which makes the whole register something a person can read in one sitting.
Five fields.
| Field | What it records | Failure it prevents |
|---|---|---|
| 1. Match rule and confidence | The exact predicate that merges two records, labelled deterministic or probabilistic, with the threshold if probabilistic | Nobody can say why two records became one |
| 2. Evidence | Which identifier values are treated as sufficient proof, and which are blocked or capped | Junk values collapsing hundreds of profiles |
| 3. Permitted purposes | The purposes this merged data may serve, and the ones it may not | Support data silently becoming marketing data |
| 4. Reach | Every downstream system this join's output lands in, including agent runtimes and warehouses | A deletion that does not reach everything |
| 5. Owner and unmerge path | The named human who can change the rule, and the documented procedure to split a wrongly merged profile | Discovering the merge is wrong and having no way back |
Field five is the one teams argue about and the one we would defend hardest. An unmerge path is not a nice-to-have. Adobe's documentation tells customers to "Contact your Adobe Account Team or Adobe Support if you have an existing sandbox that requires collapsed graphs to be un-collapsed", which is an honest admission that on at least one major platform, undoing a bad merge is a support ticket, not a self-service action. Find out what yours is before you need it, and write the answer in field five even when the answer is "raise a P2 with the vendor".
What the Join Record is not
It is not a data catalogue. Catalogues list fields and tables; the Join Record lists merge decisions, and a stack can have a complete catalogue and zero recorded merge decisions.
It is not a record of processing activities under Article 30. The RoPA is organised by processing activity and written for a regulator. The Join Record is organised by match rule and written for the engineer changing the rule at 4pm on a Thursday. They should agree with each other, and they answer different questions.
The Five-Step Join Walk
The Join Walk is the procedure that produces a Join Record from a stack you have already built. It takes one working day for a nine-system stack with the right three people in a room: whoever administers the profile platform, whoever owns the support desk, and whoever answers deletion requests. Run it on one real customer, end to end. Not a synthetic record, a real one, chosen at random from last month.
Step 1 — Pick the customer and pull every raw record. Take one real person and, from each system independently, export everything keyed to them. Do not use the joined profile to find the records; use each system's own search, with whatever identifier that system knows them by. You will already find discrepancies at this step: a name spelled two ways, a phone number in two formats, an account the CRM has and billing does not.
Step 2 — Reconstruct the joins by hand. Lay the records side by side and write down, for each pair that the platform merged, the identifier that caused the merge. This is the step people expect to take an hour and that takes three. When you cannot determine why two records merged, that is finding number one, and it goes in the register as an unknown rather than being guessed at.
Step 3 — Label every join deterministic or probabilistic, and challenge the probabilistic ones. For each probabilistic merge, ask the awkward question out loud: what else could produce this evidence? Same household. Shared device. Recycled phone number. A call-centre agent's browser. If you cannot rule the alternative out from the data in front of you, the join is a hypothesis, and it should be recorded as one.
Step 4 — Trace the reach. From the joined profile, follow every outbound pipe: email platform, ad platform, support console, data warehouse, BI extracts, any agent or model that reads the profile, any vendor with a webhook. Write each one down. Then ask, for each, whether a deletion issued today would reach it, and how you would prove it did. Expect to find at least one destination nobody in the room remembered.
Step 5 — Fill the purpose column and find the drift. For each field in the joined profile, write the purpose it was originally collected for and the purposes it currently serves. Where those differ, you have either a compatibility judgement to make or a pipe to cut. Do not resolve them in the room. Record them, and route them to whoever owns that decision.
The output is a Join Record with a known number of unknowns. That count is the number to report upward. "We have eleven join rules, we can explain nine, two are unexplained, and four downstream destinations cannot currently honour a deletion" is a sentence an executive can act on. "We take data privacy seriously" is not.
Sequencing the fixes
Fix in this order, because it is cheapest to most expensive and it front-loads the controls that stop new damage.
| Order | Fix | Typical effort | Why here |
|---|---|---|---|
| 1 | Blocked-value list | Hours | Stops the worst collapses immediately, no schema change |
| 2 | Cardinality caps | Days | Mechanical brake on new bad merges |
| 3 | Deletion reach map | Days | Turns an unbounded obligation into a finite list |
| 4 | Purpose register per source | One to two weeks | Needed before any compatibility judgement |
| 5 | Unmerge procedure | Weeks, vendor-dependent | Expensive, and only needed once the rest is stable |
This ordering mirrors the rollout model we use for gateway deployments — observe first, enforce second, optimize third. You cannot sensibly cap an identifier before you have looked at what values it actually carries, and you cannot optimize a join whose reach you have not mapped.
Worked example: one customer, nine systems, one Join Record
The following is a fully assembled Join Record for a mid-market B2C subscription retailer, built on a stack shape that is common in that segment. The company, the customer and the numbers are illustrative — this is a worked example of the artefact, not a case study of a client, and nothing in it should be read as a real engagement.
The stack: web analytics, tag manager, CDP, CRM, support desk, billing, product telemetry, email platform, ad platform. The customer: one person who browsed anonymously for two weeks, created an account, contacted support twice, upgraded, and later asked for deletion.
The joins the walk found
| # | Match rule | Type | Evidence sufficient? | Permitted purposes | Reach | Owner / unmerge |
|---|---|---|---|---|---|---|
| J1 | Same cookie ID within 30 days | Deterministic on a non-unique identifier | No — device is shared | Site analytics only | Analytics, CDP | Web analytics lead / self-service |
| J2 | Account creation links cookie ID to user_id | Deterministic | Yes | Analytics, service, marketing with consent | CDP, email, ads | CDP admin / self-service |
| J3 | Support ticket requester email to user_id | Deterministic | Yes | Service only | CDP, support console | Support ops / self-service |
| J4 | Billing account to user_id via email | Deterministic | Yes | Service, finance | CDP, warehouse | Finance systems / vendor ticket |
| J5 | Phone number match across CRM and support | Deterministic on a recyclable identifier | No | Service only | CDP, CRM | Unassigned — finding |
| J6 | Household address plus surname | Probabilistic, threshold undocumented | No | None agreed | CDP, ads | Unassigned — finding |
| J7 | Derived churn score written back to CRM | Not a join, a derivation | n/a | Retention campaigns | CRM, email, ads, warehouse | Data science / n/a |
What the walk surfaced
Two joins with no owner. One probabilistic rule (J6) whose threshold nobody could produce, feeding an ad platform. One join built on a recyclable identifier (J5) treated as deterministic. One support-to-marketing purpose conflict: J3 is labelled service-only, but the derived score in J7 is trained partly on ticket volume and lands in ad platforms. And a reach map with nine destinations, of which only three had a deletion path that had actually been tested, one is exempt under statutory retention, four were untested or undocumented, and one, the static BI extracts, can never be reached at all. Note that this reach map is a different set of nine from the nine source systems above: it drops web analytics and the tag manager and adds the warehouse and the BI extracts, because reach is measured outward from the join, not inward to it.
The deletion test, worked through
| Destination | Deletion path exists? | Tested? | Time to confirm |
|---|---|---|---|
| CDP profile store | Yes, API | Yes | Minutes |
| CRM | Yes, manual | Yes | Same day |
| Support desk | Yes, API | Yes | Same day |
| Billing | Retained under statutory obligation | n/a | n/a |
| Email platform | Yes, via CDP sync | No | Unknown |
| Ad platform | Suppression only, not deletion | No | Unknown |
| Warehouse | No documented path | No | Unknown |
| Product telemetry | Pseudonymised, path unclear | No | Unknown |
| BI extracts | No, extracts are static files | No | Never |
Four unknowns and one flat "never" out of nine. That table, produced in a day, is a more useful compliance artefact than a fifty-page policy, because every row is falsifiable and each one names a person's next task. The two rows that generally cause the most argument are the ad platform, where suppression is often mistaken for deletion, precisely the error the Criteo decision punished, and the static BI extracts, which are usually nobody's job and are the reason a "completed" deletion can still surface the person's data in a quarterly deck.
What an AI customer journey is not
Four things get called this and are not one. Naming them saves arguments.
It is not a customer journey map. A journey map is a design artefact: a diagram of stages, emotions and touchpoints, drawn by humans to build empathy and prioritise work. It is qualitative, it is aspirational, and it contains no personal data. Customer journey mapping is genuinely useful and completely unrelated to the governance problem in this article. Confusing the two is why "we did journey mapping last year" is sometimes offered as evidence that the join is under control.
It is not a set of stage-specific AI tools. A chatbot on the site, a lead score in the CRM, a churn model in the warehouse and a send-time optimiser in the email tool are four separate systems with four separate governance stories. They become a journey only when something joins their inputs. Until then you have point automation, which is a legitimate and often preferable place to stop.
It is not automated decision-making about a person, considered on its own. Applying a model to an individual and acting on the output raises its own questions of fairness, explanation and contestability, and those questions have their own literature and their own regulatory hooks. This article is upstream of that: it is about whether the record the model reads is about the right person at all. Both matter. They are not the same control.
It is not the same as onboarding. Onboarding is one segment of the journey with a distinct property, the counterparty is a stranger, and the governing question is what you grant them before you have verified who they are. We treated that separately in verify before you grant, and the two controls compose: onboarding governs the first grant, the Join Record governs everything that grant later gets attached to.
Common mistakes when you join the journey
Treating the CDP's defaults as decisions. Every identity-resolution platform ships with defaults: which identifiers merge, how many are allowed, what counts as evidence. Defaults are a vendor's guess about a median customer, not your policy. Inheriting them silently is how a stack ends up with a match rule nobody chose.
Confusing suppression with deletion. Adding someone to a do-not-contact list stops the sending. It does not remove the data, and a regulator has already ruled that the difference matters. Keep both mechanisms and never let one be recorded as the other.
Governing the model and not the profile. Model review boards are now common and they are largely a good thing. They also concentrate attention on the last step of a long pipe. A perfectly reviewed model reading a wrongly joined profile produces a confidently wrong decision, and the review board has no visibility into why.
Letting derived traits escape without lineage. Once a churn score is a column in three systems, its provenance is gone. Attach the join id and the computation date to every derived trait at the point of creation, or accept that you will never be able to explain, retract or correct it.
Assuming the warehouse is out of scope. Analysts copy data. Extracts become files, files become decks, decks live in inboxes. The warehouse is usually the widest part of the reach map and the least governed, precisely because its users are internal and trusted.
Letting agents read the profile with a human's permissions. When an autonomous agent reads the joined profile using a service account that inherits a broad scope, every join becomes reachable by every agent action. Agents need their own identity, scope and expiry, which is the argument we made in owner, scope, expiry for AI agents, and it binds harder here than almost anywhere because the joined profile is the most concentrated personal data in the company.
Six numbers that show the join is under control
Report these six monthly. They are cheap to produce once the Join Record exists, and each one moves for a reason you can explain.
| Number | What it tells you | Healthy direction |
|---|---|---|
| Join rules with a named owner, as a fraction of all join rules | Whether accountability exists at all | 100 percent, and stays there |
| Probabilistic joins with a documented threshold | Whether inference is being made deliberately | 100 percent |
| Profiles exceeding an identifier cardinality cap | Early warning of graph collapse | Trending to zero |
| Downstream destinations with a tested deletion path | Whether a deletion request can actually be honoured | All destinations, retested quarterly |
| Median hours to complete a deletion across the full reach | Whether the fan-out is a process or a queue | Falling, and inside your statutory deadline |
| Unmerge requests raised, and median time to resolve | Whether wrong joins are being found and fixed | Non-zero, which means detection works |
The last row is counterintuitive and it is the one we would push hardest. A company reporting zero unmerge requests is almost certainly not detecting wrong joins rather than not having them. The number to be nervous about is zero.
Where this is still uncertain
Several claims in this article rest on ground we would like to be firmer, and it is more useful to say so than to write around it.
There is no public false-merge rate for marketing profile stores. The 95.01 percent discrepancy figure comes from healthcare duplicate records, and it measures the opposite error — records that should have matched and did not. We use it because it is the best-measured public evidence that identifier data is dirty in ways that break exact matching, and because the ONC's definition of patient matching describes the same operation. We are not claiming marketing joins fail at that rate, and anyone who quotes it that way is misusing it. If you have measured a false-merge rate on a production CDP, that is a number the field genuinely lacks.
Sources a reader would expect were unreachable. Pew's patient-matching research and the GAO's 2019 report on record matching both returned HTTP 403 to every fetch method available here, and the CNIL's own pages for the Criteo decision are anonymised and no longer available, with the Légifrance primary text also returning 403. Where we could not reach the primary source, we said so inline and cited what we could reach. The widely quoted "match rates as low as 50 percent between organisations" figure is excluded for that reason.
The deletion-cost figures are single-origin. The 567 percent rise and the $1.5 million total come from a company that sells software reducing both, and we found no second panel measuring the same thing. The $1,524 unit cost is not DataGrail's own number, but it is not corroborated either: gartner.com refused every fetch and every vendor quoting it is quoting the same unread document. Directionally we believe the picture; we would not build a business case on any of these numbers.
Legal judgement is out of scope. Purpose compatibility, the lawfulness of a specific join, and whether a given retention is required by statute are decisions for your counsel or data protection officer in your jurisdiction. Nothing here is legal advice. What this article claims is narrower and, we think, uncontroversial: those decisions cannot be made about a join whose rules, purposes and reach are not written down.
The one-day Join Walk estimate is a design target, not a measured average. It comes from the shape of the procedure, not from a sample of completed walks. Plan for two days and finish early.
When this whole approach is the wrong fit. If you have one system of record and no joins, a single-product SaaS where the account is the customer and nothing else touches them — you do not have a join problem and this article is overhead. Build the identifier inventory, skip the rest, and revisit when the second system arrives.
Where LeapForce fits
The Join Record is a governance artefact, and artefacts decay unless something enforces them. That enforcement problem is the one LeapForce is built for: when models and agents read the joined profile, every one of those reads should go through a single governed path where identity, scope, policy and cost are checked and the whole thing is recorded. Our AI Gateway is that path, Access & Identity gives every agent that reads the profile its own owner, scope and expiry rather than a borrowed human credential, and Observability & Audit keeps the record of what was read and what was refused. We deploy it the way we recommend you run any of this: observe first, enforce second, optimize third.
To be clear about what we do not do: LeapForce is not a customer data platform and does not perform identity resolution. We do not build your identity graph, we do not set your match rules, and the Join Record is yours to maintain. Per our published build-status convention, the capabilities named here carry per-capability status on the product pages and some are still in development — check the page before you plan around one.
Frequently asked questions
An AI customer journey is a joined, machine-readable record of one person's interactions across every system that observed them — web analytics, CRM, support desk, billing, product telemetry — together with the automated decisions taken on that record. The defining operation is the join: asserting that a cookie ID, an email address, a phone number and a billing account all belong to the same human. Stage models describe what the journey looks like; the join is what makes it exist.
No. Customer journey mapping is a design exercise: humans draw stages, emotions and touchpoints to build shared understanding and prioritise work. It is qualitative and contains no personal data. The joined version is a live data structure holding real people's records, joined by rules, feeding automated decisions. Doing journey mapping tells you nothing about whether your identity resolution is merging the right people.
Run the Five-Step Join Walk on one real customer chosen at random, and look for three signals: profiles holding more distinct values of an identifier than a person plausibly has, probabilistic match rules with no documented threshold, and joins that nobody can explain. Also check your support queue for contacts reporting they saw someone else's details. Adobe documents shared devices, call-centre logins and fake registration values as ordinary causes of what it calls graph collapse, so absence of complaints is not evidence of absence.
That is a compatibility judgement for your counsel or DPO, not a yes-or-no this article can give. GDPR Article 6(4) sets out the test: the link between the original and new purposes, the context of collection, the nature of the data, the consequences for the person, and the safeguards. Support data scores badly on most of those factors because customers disclose things there they would never enter in a marketing form. Whatever you decide, record the decision as a permitted purpose against the join so it is not silently reversed later.
Two things, in this order. Build a blocked-value list by counting the twenty most frequent values of each identifier in production and blocking anything that appears on more profiles than a real person could hold. Then set cardinality caps per identifier. Both are configuration changes measured in hours to days, both stop new damage immediately, and neither requires a schema change or a project. The purpose register and the deletion reach map come next.
Whoever can change a match rule and unmerge a profile, usually the platform administrator inside data or marketing operations. Ownership should sit with the person holding the lever, not the person holding the budget. The purpose column of each row belongs to the source-system owner, and the reach column belongs to whoever answers deletion requests. One owner per rule, several contributors per row.
The Join Walk itself costs about one working day of three people's time for a nine-system stack. The fixes are sequenced cheapest first: blocked values in hours, cardinality caps in days, a deletion reach map in days, a purpose register in one to two weeks. The expensive item is the unmerge path, which is vendor-dependent and may be a support ticket rather than a feature. Set against that, the figure everyone quotes for manually fulfilling a data subject request is roughly $1,524, a Gartner analyst estimate we could not read at source and which reaches us only through vendors selling automation for the problem, DataGrail among them. Treat it as indicative of the order of magnitude rather than a planning number.
One working day is the design target for around nine systems, with the platform administrator, the support-desk owner and whoever handles deletion requests in the room together. That is an estimate from the shape of the procedure, not an average of completed walks. Stacks with heavy custom identity logic or more than a dozen destinations should plan two days.
No. A customer data platform makes joins convenient, visible and configurable, which is genuinely helpful, but joins happen without one — every time a script matches CRM rows to support tickets on email address, every warehouse JOIN on a customer key, every spreadsheet vlookup. Those joins have the same failure modes and none of the tooling. If anything, an ad-hoc join layer needs the Join Record more, because there is no configuration screen to read the rules off.
Because the pilot runs on a clean subset and production does not. The pilot uses a curated segment where identifiers are complete and the reach is one system; production brings recycled phone numbers, shared devices, junk registration values, a warehouse nobody mapped and a deletion obligation with a statutory clock. The work that closes that gap is join governance, and it is rarely in the pilot's scope, so it appears as an unbudgeted surprise at exactly the moment the project needs to show returns.
Yes, in a reduced form, and it is cheaper to do now. A 40-person company usually has four or five systems rather than nine, which means a handful of join rules and a Join Walk that finishes in an afternoon. Start with the identifier inventory and the blocked-value list. The obligations under GDPR and California law do not scale with headcount, and a small stack with a written reach map answers a deletion request faster than a large one with none.
The reach map grows a row that changes shape. A dashboard is read by a person with an audit trail and a working day; an agent reads at machine speed, may write back, and often runs under a service account with broader permissions than any individual holds. Give each agent its own identity with an owner, a scope and an expiry, record what it read as well as what it did, and treat the joined profile as one of the highest-sensitivity resources it can reach, because it is.
Ready to Govern Your AI?
Talk to LeapForce — one controlled layer for every AI tool, connector, model, and agent.
Comments