← All posts

We deleted the subject line

Soufiane3 min read

The chat widget used to open with two fields: a subject line marked optional, and a message box.

Nobody filled in the subject. Obviously nobody filled in the subject — it's a chat window. You don't write a subject line before texting someone. The field was there because the thing behind it is a ticket, and tickets have subjects, and that's a fact about our database that had leaked onto a customer's screen.

The cost of an ignored field

You'd think an ignored optional field is harmless. It isn't, for two reasons.

It adds a decision. Every field is a small ask: do I need this? what would I even write? The friction is tiny and it's real, at exactly the moment someone is already mildly annoyed enough to be contacting support.

And when it's skipped, something downstream has to cope. Our inbox fell back to the first forty characters of the message. So agents got a list like:

Hi there, I was wondering if you could…
Hey! Quick question about my last inv…
hello?

Three rows, no information. A subject line's whole job is to let you scan a list and decide what to open, and a truncated greeting does not do that job.

Deleting the field was the easy half

Removing an input is a small diff. The interesting question is what fills the hole, because "no subject at all" makes the scanning problem worse, not better.

So the conversation titles itself. When the first message arrives, a background job reads it and writes a short subject — two to six words, naming the actual problem.

Refund for order #8812
Export stuck at 40%
Can't add a teammate

That's a list you can triage.

The parts that were fiddly

It runs whether or not you use the AI. Titling rides the same event as the reply agent but is deliberately independent of it. A workspace with the agent switched off still needs a readable inbox. That does mean a model call per new conversation for everyone, which we decided was worth it.

It's a completion, not structured output. The reply agent uses structured generation because it needs a confidence score and an escalation flag. A title is one short string, and structured output is the thing small, cheap models handle worst. A plain completion works everywhere.

Models decorate. Ask for a title and you'll get Subject: Refund request, or "Refund request", or a title followed by two paragraphs explaining the choice. There's a small cleaning function that strips prefixes, quotes and trailing punctuation and takes only the first line. Unglamorous, load-bearing.

Humans win ties. The job only picks up conversations that are still untitled, and the database write re-checks that the subject is empty. If an agent renamed the thread while the model was thinking, their title stands. Getting overwritten by a robot two seconds after you typed something is exactly the kind of small betrayal that makes people distrust a tool.

It degrades quietly. No API key, model error, timeout — it falls back to the truncated first message. Which is what the row showed before. Worst case is the old behaviour.

What we'd tell you to copy

Not "add AI titles". The general version: when a field is optional and everyone skips it, that isn't a user problem to nag away with better placeholder text. It's the product asking someone for something they don't have and don't want to produce.

Either it's genuinely needed — in which case make it required and justify it — or something else should produce it. What you shouldn't do is leave it optional, watch it come back empty, and let everything downstream quietly get worse.