Anupam Kalita

Making it easier to know you're talking to the same person, no matter which app they used.

Beeper already knows when two chats are the same person. It just doesn't act on that unless you go looking for it.

BeeperIntegrationsMergePeople Layer
Beeper

Problem statement

  • Beeper already has everything it needs to know two chats are the same person. It just doesn't use it consistently.
  • Beeper connects every network you use, but still treats each network as a separate person.
  • Its own search already labels and stacks the same contact across networks the moment you type a name.
  • Merge can join them, but only when its matcher happens to catch the pair, and misses are silent.
  • Beeper's search already labels the duplicate: same person, both networks, stacked together — Beeper computed this for search.
  • But Merge never offered to join them: same pair, on the merge screen. No suggestion, even after importing phone contacts.
  • Note: how search matches this pair internally isn't public. The plan on the sequencing slide treats any name-based signal as a guess needing confirmation, not a fact, regardless of what search does today.

User personas

  • The Cross-Network Professional: runs client and vendor relationships across Slack, WhatsApp and email — often the same person on two of the three. "I have a client thread on Slack and the same client messaging me on WhatsApp after hours. I have to remember which one has the context I need." What breaks today: splits history across two threads for one relationship; can't tell at a glance which network a contact actually replies on.
  • The Everyday Connector: keeps up with family and friends spread across WhatsApp, iMessage and Telegram, by whichever app each person prefers. "My brother texts on iMessage, my cousin only uses Telegram, but a few people are on both — and I keep finding I've been replying to the wrong one." What breaks today: ends up with duplicate contacts for the people who overlap networks; has no single place to see one person, only one app at a time.

The solution

  • One name, one face, used across every network you connect: WhatsApp matched on number (usually answers here), Slack matched on email (answers slowly), Telegram (you confirmed this), Signal not connected (they are here. You are not). One record per person, matched from what Beeper already knows about each network.
  • Merge already joins two chats into one thread, and does it well once you find the right pair. That part is not what I'm proposing to build.
  • What's missing sits one level up: a person, not a chat, as the unit Beeper tracks, matched the moment a shared signal exists, not only when you go looking for it.
  • Merge already suggests matches sometimes, and gets it right. It just doesn't use the same signal Beeper's own search already computes, so two identical pairs get two different outcomes.
  • So the idea isn't a new matcher. It's Beeper deciding a person, not a chat, is what it's organizing, and applying the matching it already has to that unit, consistently.

How I'd sequence it

  • 1. I'd start by reusing the signal, not rebuilding it: Because search already computes the duplicate signal, feeding it into Merge's suggestion engine is one matching function doing the work of two. The cheapest fix with the clearest payoff.
  • 2. I'd trust facts before I'd trust guesses: A shared phone number or email across networks isn't a prediction, it's a fact. I'd let those merge on their own first, since that's the change with the least room to get wrong.
  • 3. Only then would I let it guess, once, and out loud: A same name-and-photo match is a good guess, not a fact, so I'd have it ask a single time and remember the answer, rather than silently deciding on my behalf.
  • 4. And I'd keep one line I wouldn't move for anyone: Never merge on a name alone. A wrong merge shows one person another person's messages. I'd treat that as a privacy incident, not a tuning knob, however good the model gets.
  • This is how I'd reason about priority, not a plan for your team to execute. The point is which fix earns trust first — facts before guesses, and a line that never moves.

Value for users

  • A single view of every contact: No more deciding which app has the message you need. One thread per person, not one per network.
  • No more duplicate-hunting: Matching happens on facts you already gave Beeper — a number, an email — not on you noticing and fixing it by hand.
  • Control stays with you: Nothing merges on a guess. Ambiguous matches ask once; wrong merges don't happen silently.

Impact on growth & business metrics

  • Multi-network adds value instead of clutter: Today, connecting a third or fourth network mostly adds duplicate threads. A working People Layer makes each new network make someone's contacts more complete — which is the actual case for connecting more.
  • The real size of the problem is invisible today: Because misses are silent, Merge usage can look healthy while duplicate contacts stay common. The metric that matters, missed-match rate, likely isn't one Beeper can see yet without instrumenting it.
  • A stronger pitch for the paid, multi-account tiers: Plus and Plus Plus are sized around running more accounts and more networks. A People Layer is the reason to actually use that capacity, instead of a limit you pay to raise.
  • Written from outside, with the app open on my phone. The one thing I'd check first: how many pairs like mine exist that were never suggested.

Want to discuss this in person?

Send me a note about what you read here and I'll get back to you myself.