A Tag is a labelled flag on a contact, with optional category, color and description. Contacts can carry any number of tags simultaneously — "VIP", "Hindi speaker", "Refund pending", "B2B account" can all live on the same record without conflict. Each tag has metadata: when it was added, by whom (user, flow, rule, API), and an optional expiry date for time-bounded signals like "Promo recipient — expires in 7 days". Tag history per contact is queryable and never overwritten.
Auto-apply rules are the workhorse. Define a rule like "if last_message_intent = refund_request AND no_resolution_in_24h, apply tag refund-escalation". The rule engine evaluates every relevant event and applies tags deterministically — no human typing, no inconsistency. Rules can also remove tags: "if order_status = delivered, remove tag awaiting-shipment". This is how you keep tags accurate over time without manual hygiene.
Tags are second-class citizens to segments deliberately — they are cheap, fast and human-friendly while segments are the rigorous query layer. Most teams use both: tag liberally to capture signals as they happen ("interested in laptop"), then build segments that combine multiple tags with other filters ("tagged interested-in-laptop AND in segment Active-Last-30-Days"). Tags surface in flows (branch on tag), broadcasts (target by tag), and the contact UI (filter and color-coded badges).
Governance is built in. An admin defines tag categories ("Lifecycle", "Intent", "Channel", "Risk") and decides whether each category is open (anyone can add a new tag value) or closed (only admins). The library page surfaces tags by usage, last-applied recency, and contact count — stale tags get flagged for cleanup. Renames propagate atomically: rename "VIP-Customer" to "VIP" and every contact, segment, flow and rule updates in one transaction. No broken references.