The chat widget — Show them where their ticket has got to
Every conversation shows Received the moment it lands — that one is automatic and needs no setup, because it is true the instant the record exists.
Beyond it, progress comes from the Select field your team already works in the grid. In the Widget view, pick that field and write what each option should say to a customer: In progress might read Working on it; Tier 2 might read Escalating to a specialist. Moving the card is then the same act as telling the customer — there is no second status to keep in step.
Publishing is per option, and blank means never shown. Leave Spam, Waiting on legal or Duplicate empty and a visitor sitting on one of those simply keeps seeing the last published state. An option you never label can never leak.
When a published status changes, the visitor sees it in the header and gets a line in the conversation saying so. It is the one "something happened" signal an async conversation has between messages — and unlike a typing indicator, it is true.