Every escalation creates a second enquirer record in the CRM
In short
Duplicate enquirer records are made at the moment of the write, not by a weak matching algorithm. An assistant opening a contact on the first message holds only a display name and a channel handle, so it creates a new person every time — and that human reappears as an applicant and a student under 2 more identifiers. Defer the write until a key exists, or stage it.
Key takeaways
- The defect is the timing of the write. Nothing downstream can recover a key that did not exist yet.
- Email is not an identity in this domain: families share 1 address and agents reuse their own.
- 1 person becomes 3 records because enquirer, applicant and student live in 3 id spaces.
- Write to a staging entity by default and promote to a contact only when a key resolves.
- Name normalisation is a policy decision about the institution's conventions, not a string function.
The duplicates are created at the moment of the write. An assistant that opens a CRM contact on the first inbound message has a display name and a channel handle and nothing else, so it cannot match, so it creates. Every subsequent escalation from the same person repeats the act, and no matching rule added later can recover a key that did not exist when the row was made.
It shows up as 3 separate complaints that nobody connects: contact counts rising faster than genuine enquiry volume, families receiving the same nurture mail twice in a week, and an advisor opening a record that holds a third of a conversation they know went on longer. All 3 are the same defect seen from different desks.
Pull the duplicate clusters with the write that made them
The point of this check is not to count duplicates. It is to see, for each cluster, which key was available at the instant the second row was written — because that is what names the fix.
- Export every contact created in the last 90 days with its created-at timestamp, the integration or user that created it, the channel, and the raw name, email and phone as captured.
- Group candidates 3 ways and keep the groups separate: on normalised email, on the last 8 digits of the phone, and on a normalised name plus programme of interest. Different keys expose different causes, and merging the groups hides that.
- For each cluster, sort by created-at and record what identifiers the earliest row held versus the later ones. A first row with no email and a second row with one is a deferred-identity problem, not a matching problem.
- Tag each cluster by creating source: assistant, web form, agent portal, import, staff entry. If 1 source dominates, the whole investigation collapses to that integration.
- Count records inside clusters larger than 1, not clusters. A person fragmented into 4 rows is 1 duplication problem and 4 pieces of duplicate mail, and the second number is what operations feels.
- Sample 20 clusters and read them. About a fifth will turn out to be genuinely different people, and knowing your own false-positive rate before writing a matching rule is what stops the rule merging 2 siblings.
Five moments where the key was missing
| Cause | What the cluster looks like | The check | The fix |
|---|---|---|---|
| Written on the first message | Rows created seconds into a conversation, most with no email and no phone | Count contacts whose created-at is within 60 seconds of the first message and which hold no contact detail | Defer the write, or write to a staging entity |
| Email treated as identity | Either 2 people merged into 1 row, or 1 person split across a personal and a school address | Count addresses attached to more than 1 given name, and people holding more than 1 address | Composite key: address plus name plus programme, never address alone |
| 3 id spaces for 1 lifecycle | The same human as an enquirer, an applicant and a student, with no link between the 3 | Follow 20 enrolled students backwards and see whether their original enquiry is attached | A durable person id issued once and carried forward |
| Agent-submitted records | Clusters sharing 1 phone or 1 address across many unrelated names | Group by contact detail and count distinct surnames on each | Store agent contact details on the agent, not on the applicant |
| Normalisation never agreed | Near-identical names differing by case, accent, spacing or word order | Compare raw against normalised names and count the pairs that only collide after normalising | A written normalisation policy, applied at every entry point |
No component behaved badly. A record was created before anybody knew who it was for, and everything downstream faithfully preserved that ignorance.
One person, three id spaces, no thread between them
The most expensive duplicates are not 2 rows a week apart. They are the same human appearing as an enquirer in the spring, an applicant in the autumn and a student the following year, in 3 systems that each issue their own identifier and none of which was told the 3 are one person. The enquiry record is orphaned first, which is why nobody can answer whether the open day converted anything.
- Enquiry identity is self-asserted. Whatever the person typed, unverified, possibly a nickname, frequently a parent acting on their behalf.
- Applicant identity is issued by the application route. A direct portal account, an agent submission, or a national application service that issues its own applicant identifier — and a person who applies twice may hold more than 1.
- Student identity is issued at enrolment by the student information system, usually a completely separate number space, often with its own email address created at the same moment.
- The join between them is a decision nobody is asked to make. Pick which id is durable, issue it at the earliest point identity is confirmed, and carry it forward as an attribute of the later records rather than replacing them.
Defer, match or stage: choosing where the write goes
There are 3 designs, and the choice is a business decision about what you lose rather than an engineering preference.
| Strategy | What it does | What you give up | Use it when |
|---|---|---|---|
| Defer the write | Hold the conversation in the assistant's own store; create nothing until an email, a phone or a reference is captured | Anonymous conversations never reach the CRM, so demand signal from browsers is invisible | Marketing does not need anonymous volume and data minimisation matters |
| Match then write | Search for an existing person on a composite key first; create only on a confident miss | Latency in the conversation, and a threshold somebody has to own and tune | A reliable search endpoint exists and volumes justify the tuning |
| Stage then promote | Always write, but to an interaction or staging object that is not a contact; promote when a key resolves | A second object to model, and a promotion job to run and monitor | Escalations must never be lost and identity often arrives late |
Staging is the right default for an assistant. It keeps the transcript, it never loses an escalation during a peak, and it stops the contact table filling with rows that represent nobody. It also gives the merge queue somewhere to send rejects instead of leaving them in the live table — the small piece of software that makes any of this operable, and the kind of thing we scope as an MVP and product build rather than a platform replacement.
Normalising a name is a policy decision, not a string operation
Every institution recruiting internationally has to decide, in writing, how names are held — and until it does, each entry point invents its own answer and the duplicates follow automatically.
- Word order. Family name first is correct in several of the regions most institutions recruit from, and a form labelled first name and last name silently reverses it for a large share of applicants.
- Transliteration. A name written in 1 script on a passport and another on an email signature is 2 strings for 1 person, and the mapping between them is not reversible. Where the same content has to survive 2 languages, the pipeline question is the same one as the translated answer that contradicts the English policy page.
- Diacritics and case. Strip them for the comparison key, never in the stored value: a student's name displayed without its accents is a small, repeated insult that also breaks their document checks.
- Honorifics, patronymics and generational suffixes. Store them as separate attributes rather than letting them contaminate the name field and split the person.
- Compare on a derived key, store the original. Normalisation belongs in a comparison column so the record still shows what the applicant wrote — the same principle as a system quietly rewriting the conventions its users depend on, which is the failure in the tutor using notation the course does not use.
What merging the duplicates will not undo
A merge repairs the table. It does not repair what the table already caused, and 3 things survive it. Mail already sent stays sent, and a family that received 2 identical sequences remembers that rather than the merge. Communication preferences and consent recorded against the losing row have to be carried across explicitly, or an unsubscribe silently becomes a resubscribe. And any reporting already published on inflated counts stays published, so the corrected figure needs an explanation before somebody reads it as a collapse in demand.
Volume also makes the underlying fault worse rather than more visible: results week and add-drop week produce the most escalations, the least identity information, and the highest chance that a family is contacting you from 3 devices and 2 addresses. Duplicate rate belongs on the pre-peak list in readiness checks before results day and add-drop week, measured before the surge rather than reconstructed after it.
None of this touches the read side. Whether the assistant's answers are correct is a corpus problem with its own method, in preparing a catalogue and handbook set for retrieval. Both sit under admissions, enrolment and student-services assistants, within our education and edtech work.
Frequently asked questions
Short answers to the follow-ups this page tends to raise.
Why is our chatbot creating duplicate contacts in the admissions CRM?
Because it writes the contact before it has anything to match on. On the first message the assistant holds a display name and a channel handle, neither of which identifies a person, so the create path runs every time. The repair is to move the write later — defer it until an email, phone or application reference is captured, or write to a staging object and promote it to a contact only once a key resolves.
Can we just deduplicate on email address?
No, and in admissions it is actively unsafe. One family address covers siblings applying in consecutive cycles, one counsellor address appears on dozens of applications, and one agent's address appears on all of theirs. Keying on email alone merges different applicants into a single record and can put one applicant's status in front of another's household. Use a composite key and route anything uncertain to a human merge queue.
How do we link an enquiry to the application it eventually becomes?
Decide which identifier is durable and issue it at the earliest point identity is confirmed, then carry it forward onto the applicant and student records as an attribute. Retrofitting the link later means probabilistic matching across 3 id spaces with different data quality in each, and the enquiry record is usually the one with the least to match on.
Should the assistant write to the CRM at all during a conversation?
Write the interaction, not the person. A transcript, a channel, a timestamp and whatever identifiers were captured can be stored safely against a staging or interaction object from the first message. Creating a contact is a separate, later decision that should require a resolved key — which keeps escalations from being lost while keeping the contact table meaningful.
- admissions CRM
- deduplication
- integration
- diagnosis
The work behind this page
Builds from our portfolio that this page draws on.
AskVault
An AI internal knowledge-search platform that answers employee questions from your own docs — grounded in citations, with knowledge gaps surfaced and deflection tracked.
Productivity AIChurn Radar
An AI customer-success platform that flags at-risk B2B accounts before they churn and prescribes the save-play to run.
Customer SuccessRead next
- Applicants ask where their application is, and the assistant quotes the handbookThe highest-volume question in an admissions inbox is about one specific application, and a corpus of policies can never answer it. The missing component is an authenticated lookup with an identity check in front of it.diagnostic
- A conditional offer, and the sentence an assistant may say about itThe offer is a contract with a checklist attached. Software can read the checklist back accurately and cheaply; the moment it decides whether a result satisfies an item, it has made an admissions decision.definition
- Award letter line items an assistant may read but must not explainFive kinds of line, each meaning something slightly different at every institution that prints one. That variance is why an assistant should quote rather than explain.definition
- The assistant is answering with last year's fee scheduleWhen an enrolment assistant quotes a superseded year, the model is behaving correctly and the index is wrong: both years are in there, nothing marks one as current, and the older file usually retrieves better.diagnostic
- The Hindi answer and the English policy page say different thingsBack-translate a fixed set of high-stakes answers and compare them against the source page. Numbers, conditions and hedges are where the divergence lands, and each pattern points somewhere different.diagnostic
- What a deferral changes in the record — and what it does notA deferral looks like a date change and behaves like a re-issue: 7 things are bound to the intake term, and moving it re-dates each of them.definition
Working on something in this space?
Tell us where you are in a sentence or two. We'll tell you honestly whether we're the right team, and what a sensible first slice of the work looks like.
Start the conversation