A chat box was the smallest thing on the roadmap

How a routine messaging ticket on a creator marketplace turned into a product — and why generic chat was the wrong shape for the job.

A marketplace client came to us with a request that sounded routine. Brands and creators needed to talk to each other without leaving the platform. Add messaging.

It was the smallest item on the board. We scoped it the way you scope a small item — look at the off-the-shelf options, wire one in, get back to the parts of the roadmap that looked hard. We looked at CometChat. We looked at the others. We expected to be done in a sprint.

We were wrong about which part was hard.

The conversation is the transaction

Here’s what we missed. On a brand–creator marketplace, the conversation isn’t a feature sitting beside the transaction. The conversation is the transaction. Everything before the thread is discovery and everything after it is delivery, but the deal itself — the brief, the rate, the deliverables, the timeline, the revisions, the “can you also do a story post,” the yes — happens in the thread and nowhere else. There is no separate contract flow where the real agreement gets made. The thread is the agreement, written incrementally by two people working it out as they type.

The thread isn’t sitting next to the marketplace. It’s where the marketplace happens.

Once you see that, the messaging layer stops looking like a UI problem. If the deal lives in the thread, then the thread has to be somewhere the platform can stand behind — where identity is real and the boundaries of the relationship hold. A chat window that moves text between two people doesn’t do that. It moves text.

There’s an uncomfortable corollary too. If the thread leaves the platform, the marketplace goes with it. Not the messages — the deal. A rate agreed over WhatsApp is a rate the platform never sees, on work it never touches, for a match it made.

Why generic chat was the wrong shape

The chat products on the market are good products, and they are all built to make conversation better: richer, faster, stickier. That’s the right goal when chat is the whole product. It’s the wrong goal when chat sits inside a commercial relationship the platform is answerable for.

We needed a messaging layer that knew this participant was a brand and that one was a creator, and that the two weren’t interchangeable. That knew what a brand may legitimately send, and when. That treated the platform’s boundary as something enforced at the moment a message is sent rather than audited after it lands, because by then whatever you were trying to prevent has already happened. Off the shelf, those things are configuration around the edges — moderation as a checkbox, roles as metadata. We needed them at the centre, because they were the product.

What we built

So we built one, and it came out shaped by a single idea: the thread carries a relationship the host platform owns, and our job is to protect that relationship rather than capture it.

That idea decides most of the architecture on its own:

  • Identity models parties rather than users, with roles the platform defines and the messaging layer respects.
  • Guardrails are a control the host sets rather than a moderation feature we run, because how tightly the boundary holds is a commercial decision, not a content one.
  • Writes are governed and reads are not: the send is the moment a boundary is either enforced or lost, so writes pass through a path where policy runs before a message is accepted, while reads and live updates go direct over realtime with row-level security — a read can’t cross a boundary, so it shouldn’t pay the cost of pretending it might.
  • Events go back to the host, because deal state belongs in the host’s system; we report what happened, the host decides what it means.
  • Operators get review access rather than participant access, since a support team investigating a dispute needs to see a conversation without becoming part of it.

None of that is clever. It’s what falls out of taking one idea seriously.

Where we go next

Which is also what decides where we go next. If the thread carries the deal, then the platform — not us — should get to define what the deal is. We don’t know what “brief accepted” or “milestone approved” means on your platform, and we shouldn’t. What we can do is hand you the primitives: events you define and post into the conversation, hooks your backend listens to and acts on. You encode the relationship; the thread carries it.

That isn’t a step toward becoming a generic chat box. Generic chat gives every platform the same conversation. We want to give each platform a conversation that means what it means there. It’s also why this won’t stay a marketplace product. A patient and a provider are a different shape from a brand and a creator — different parties, different boundaries, different rules about what can be said and when — but underneath it’s the same problem: two parties in a bounded relationship, inside a platform that’s accountable for it.

The chat box was the smallest thing on the roadmap. It turned out to be the thing everything else hangs from, because chat was never the product. The relationship was.

T-Chat is live with early marketplace partners. If you’re building a platform where the conversation carries the deal, we’d like to hear how you’re thinking about it. Free sandbox, no card.