· 4 min read · Siva Sethu Saravanan S
Event logs over integrations
Why FlowDesk models every support channel as an append-only log, and what that bought us a year later.
Every helpdesk starts the same way: connect email, then chat, then a contact form. Each connection gets its own tables, its own sync job and its own bugs. By the fourth channel you are maintaining four products.
FlowDesk took a different route. Every inbound message, whatever its source, becomes one row in an append-only log.
The shape of an event
type ChannelEvent = {
id: string;
tenantId: string;
channel: "email" | "chat" | "form";
conversationKey: string;
occurredAt: string;
payload: unknown;
};
Adapters are thin. They translate a provider's format into a ChannelEvent and append it.
Nothing else in the system knows where a message came from.
What it bought us
- New channels in a day. An adapter is around 150 lines.
- Replay. A bad classifier release was fixed by replaying two hours of events.
- Debuggability. "What happened to this ticket?" is a single ordered query.
What it cost
Two extra weeks before the first demo, and a habit of thinking in projections rather than rows you update in place. For a product that lives or dies on integrations, that was a cheap price.