Support

Need help?

Most answers are already written down. For everything else, Oneop does not publish a response time — there is no SLA instrument behind one — so the fastest thing you can do is send a complete first message.

Search the help centreEmail support@oneop.ioOpen your workspace

Worth including

  • The email you log in with
  • The URL of the screen it happened on
  • What you expected, and what happened instead

Goes somewhere else

Architecture

Why your help desk and CRM should share the same customer record

By The Oneop team8 min read

TL;DR

A help desk and a CRM connected by a sync job hold two customer rows keyed on an email address, and an email address is not a stable identity. The two rows drift, merges in one system orphan links in the other, and the support agent answering a refund question cannot see the open deal. One shared row removes the class of failure instead of monitoring it.

A support agent opens a ticket from dana@northwind.example. The help desk shows a contact created eleven days ago with no company, no history and no phone number. In the CRM, the same human has been a named contact for three years, sits under a parent account with four subsidiaries, and has an open renewal worth more than the refund she is currently being told is out of policy.

Nothing is broken, in the sense that no error was logged. The two systems are doing exactly what they were configured to do. The architecture is what is wrong: the ticket’s contact and the CRM’s contact are two rows in two databases, joined at runtime by a string that the customer controls.

The identity key is an email address, and an email address is not a person

Almost every help-desk-to-CRM integration resolves identity the same way: match on the email address, create the contact if no match is found. That rule is simple enough to implement in an afternoon and wrong in at least four common cases.

An email address is a routing label. It is shared (accounts@, support@, orders@), it is transferred (a new hire inherits ops@), it is abandoned (someone changes employer and keeps replying from a personal address), and it is aliased (the same mailbox receives mail at three addresses). A person is none of those things. Keying identity on the label means your customer record splits and merges according to mail routing decisions made by other companies.

The consequence is not a single dramatic failure. It is a steady divergence that nobody is assigned to notice.

Four failure modes of a two-row customer

Failure modeWhat the sync doesWhat the team sees
Shared mailboxThree humans at one company all write from accounts@. Both systems store one contact.Ticket history for three people under one name. A deal owner emails the wrong person.
Identity driftSupport edits the name to “Dana (Finance)” to tell two people apart. The CRM keeps “Dana Whitfield”.Two spellings of one customer. Reports group by the wrong one. Neither is wrong enough to fix.
Merge orphaningA rep merges two CRM contacts. The losing row’s id disappears. The help desk still points at it.Tickets attached to a contact that no longer exists, or silently re-parented to whichever row the next sync matched.
Latency windowA contact is created in the CRM at 14:02. The sync runs hourly.A ticket arriving at 14:09 creates a second contact, which the 15:00 sync then has to reconcile against the first.

The last row is the one that undermines every “our sync is real-time” reassurance. Even a webhook-driven sync has a window, and windows are where duplicates are born. A nightly sync does not promise your systems agree; it promises they will agree tomorrow, and that promise is made by a process that is allowed to fail silently.

The concrete failure: a refund decided without the renewal

Here is the case that actually costs money, assembled from the mechanics above rather than from a story.

A customer’s card is charged twice. She writes to support from her personal address, because she is travelling and her work mail is on a laptop at the office. The help desk finds no contact matching that address and creates one: a new person, no company, no spend history, no account tier.

The agent reads a ticket from an apparently unknown individual asking for a refund of a few hundred currency units. Policy for unknown individuals is to route the request to finance and quote a ten-day window. The agent does exactly that, correctly.

In the CRM, the same human is the economic buyer on a renewal that closes in three weeks. Her company is a parent account with four subsidiaries rolling up beneath it. The account owner learns about the refund request when the renewal call goes badly.

Notice which part of this went wrong. Not the agent’s judgement, not the policy, not the model, not the sync, which performed its documented behaviour. The failure was architectural: the system that had the commercial context and the system that had the conversation were different systems, and the only bridge between them was a string the customer had chosen not to use that day.

A synced copy and a shared row are not the same thing

The distinction worth holding onto: a synced copy is a second row that aims to resemble the first, and a shared row is one row that several modules reference.

Synced copyShared row
IdentityTwo ids, joined by emailOne id, referenced by everything
FreshnessAs fresh as the last successful syncAlways current, because there is nothing to refresh
MergeMust be replayed into the other systemHappens once, and every reference follows
Failure modeSilent divergencePermission errors, which are loud
Operational costA reconciliation process foreverNone

The bottom row is the honest summary. Divergence is expensive precisely because it is quiet. A permission error stops someone and gets fixed within the hour; a contact that has been subtly wrong for eight months gets discovered in a QBR.

What a shared record has to own to be worth the name

Calling something a “single customer view” while it remains a dashboard that queries two systems misses the point. A record that genuinely resolves identity owns three things.

A stable internal id that nothing external can change. Tickets, deals, invoices and tasks reference the id, not the email address. Changing the address changes one field, not the identity.

Its own merge semantics. When two records turn out to be one person, the merge must state which value survives on each field and which linked records get re-pointed at the surviving row. Deals, tickets and invoices do not merge into each other; they move. Seeing the count of records about to move, before committing, is what makes a merge reviewable instead of regrettable.

Resolution at read time, not at write time. If the link between a ticket and a customer is stamped once when the ticket is created, a contact created five minutes later never connects. Resolving the link when the ticket is opened means the record catches up.

How Oneop handles this

In Oneop there is no help-desk-to-CRM integration, because there is nothing to connect. A ticket’s requester resolves to the same CRM contact row that the deal and the invoice reference, and a task can attach to a deal, a contact, a ticket, an invoice or eight other record types through one engine. No field mapping, no nightly reconciliation, and no window in which two systems disagree.

The help desk resolves the customer link when you open the ticket rather than storing it, so a contact created after the ticket arrived still connects. With an email address it matches CRM contacts and finance customers case-insensitively. Without one it will match on name only if exactly one record matches: it fetches two candidates and returns nothing when both come back, so two people sharing a name are never silently linked to the wrong account. No match returns an empty result and a one-click create, not a plausible-looking record.

Merging is where the shared row earns its keep. Contacts, companies and leads have a merge flow that renders the outcome first: which value survives on every field, which value is discarded, and which linked records will be re-pointed at the surviving row. Contacts, deals and activities also run a duplicate check while you type, so most duplicates are never created at all.

Two boundaries worth stating. The Companies module is opt-in, and while it is off, company merge endpoints return 404 and company records are not created automatically during lead conversion. And there is no ticket merge: two tickets about the same thing stay two tickets. What is enforced instead is inbound email dedup, scoped to your workspace, so the same message never opens a second ticket.

When two systems is still the right answer

If your operational truth is genuinely spread across best-of-breed tools that each do something no suite matches, a sync is the only architecture available, and you should run it deliberately: one system is the authority for contact identity, merges only ever happen there, and the sync runs one direction. Bidirectional sync between two systems that both allow merges is a distributed consensus problem that neither vendor has solved for you.

Oneop’s own HubSpot and Salesforce connectors sync bidirectionally for exactly one reason: a migration should run with both systems live rather than as a weekend cutover. That is a temporary state with an end date, not a target architecture.

The general principle is the same one that governs where an AI agent should run: the placement of data relative to the systems that act on it decides what can be guaranteed. Shrinking the number of systems of record beats hiring software to commute between them. If you are deciding how support and sales should share work day to day, the two-channel support operation argument covers the operational half of the same question.

Frequently asked questions

Can't I just sync my help desk and CRM with an integration?

You can, and for many stacks it is the only option. What a sync cannot give you is a single identity: it gives you two rows plus a reconciliation process. Accept that trade knowingly, pick one system as the authority for contact identity, and make every merge and every field edit happen there. Sync problems are cheapest when the sync only ever runs one direction.

What should the customer record own, as opposed to reference?

The record should own identity: the canonical name, the identifying email addresses, the company relationship, and the record's own stable internal id. It should reference everything episodic — tickets, deals, orders, invoices, tasks — by pointing at that id. When episodic objects store their own copy of the customer's name and email, every rename creates a fresh inconsistency.

What breaks first when two systems key on email address?

Shared and changed addresses. A support@ or accounts@ address collapses several humans into one contact, and a person who changes employer takes the old address's history with them into a new company. Both produce records that look correct in each system on its own and only disagree when someone compares them.

Does one shared record mean support agents can see everything?

No, and it should not. A shared record and a shared permission model are different things. The argument for one row is that the data is consistent; who is allowed to read which fields on that row is a separate decision, and a platform that conflates the two has replaced a sync problem with a privacy problem.

Is a bidirectional CRM sync ever useful?

During a migration, yes. Running both systems live while data moves is far safer than a weekend cutover, because you can verify the new system against the old one with real traffic. The mistake is letting the migration architecture become the permanent architecture, because a sync you never turn off is a reconciliation job you have hired forever.

Written by

The Oneop team

Writing from the team that builds Oneop — an AI customer platform with web chat and email on top of a real CRM, help desk, ledger and warehouse.

Related reading

Start on the free plan and see the real thing

No credit card. Free plan, 2 seats.

Free forever · 2 seats · No credit card