A customer emails on Monday, replies to your Instagram story on Tuesday, and opens a WhatsApp thread on Wednesday about the same broken invoice. To them this is one conversation. To most support stacks it is three unrelated records, handled by three people, none of whom knows the other two exist.
Fixing this is less about buying an omnichannel product and more about getting four decisions right.
1. Pick an identity spine
You need one canonical customer record that channel identifiers attach to, rather than a customer record per channel. In practice that means a person object with a set of verified handles: email addresses, phone numbers, social IDs, and your own internal account ID. Merging on a phone number that appears in two accounts is the classic failure mode, so make merges explicit, reversible and audited.
2. Store events, render threads
Model every inbound and outbound message as an immutable event with a timestamp, a channel, an author and a conversation reference. Threads are then a view over events rather than the storage format. This is what makes it possible to show an agent a continuous timeline while still respecting per-channel rules such as WhatsApp service windows or the read-only nature of a public review.
3. Decide what "one conversation" means
Cross-channel stitching needs a rule, and any rule you pick will be wrong occasionally. A pragmatic default: messages from the same identity within a rolling 72-hour window join the open conversation unless the topic classifier disagrees strongly. Make the join visible in the interface and let agents split a thread in one click. Agents forgive an imperfect automatic merge; they do not forgive being unable to correct it.
4. Normalise capability, not appearance
Channels differ in what they physically allow: character limits, attachment types, formatting, edit and delete semantics, quick replies. Hiding those differences behind a single composer produces messages that render badly. Instead, expose capability metadata to the composer so the agent sees a live character count on SMS, template selection on an expired WhatsApp window, and rich formatting only where it is supported.
What changes once the timeline exists
- Handle time drops because nobody spends the first two minutes reconstructing context.
- Repeat contact rate drops, because the second message about an issue lands on the person already working it.
- Reporting finally works: channel becomes a dimension you can slice by rather than a boundary between separate datasets.
- Automation gets better inputs, a model that can see the whole history resolves far more than one that sees a single email.
The unglamorous part is identity resolution, and it is where most projects underinvest. Get the spine right and the rest of the omnichannel story becomes an interface problem, which is a much easier problem to have.