I've spent the last few weeks going back and forth with two chatbots that never really talked to me. One kept pushing a delivery time further and further away every time I asked. The other one let my order get marked "delivered" when it wasn't, then handed me off between agents who couldn't see what the last agent had already promised — until Zomato's own email team told me the order was fine and I was wrong.
As a UX designer, I know the difference between a bug and a decision. What I ran into wasn't a bug.
What I Was Actually Talking To
Before I get into what happened, it's worth being clear about what's on the other end of that chat window, because it isn't a simple FAQ bot anymore.
Swiggy and Zomato are not companies that lack the technology to solve my problem in real time. They've built a fairly sophisticated AI layer and pointed most of its intelligence at ordering and logistics — and pointed a much shallower, scripted layer at me, the person with a complaint.
And I'm not the only one who's noticed the gap. Independent reporting (Moneycontrol, via Storyboard18) documents the same complaint across both platforms: the chatbot handles standard, scripted situations fine, and stalls — often with no visible way to reach a human — the moment the issue doesn't fit a preset category. That's not an isolated bad day. That's a boundary someone drew on purpose.
Case 1: Swiggy — The Delay That Never Actually Resolves
Here's what happened, in order:
The loop
I know this pattern has a name, because I went looking. UX researchers now catalogue this as "defensive AI" support design, and the mechanisms match what I experienced almost exactly:
Here's why, from a business-metrics standpoint, this is a completely rational thing for Swiggy to build, even though it's terrible for me: every conversation the bot contains — resolves or exhausts, doesn't matter which — is one conversation that never reaches a human agent's queue, never gets logged as a failure, and never costs a refund. Support teams call this containment rate, and it's a real KPI. An ETA-push loop that never escalates is a very efficient way to keep that number high.
As a designer, here's where it breaks, heuristic by heuristic:
Case 2: Zomato — The Order That Was "Delivered" to No One
This one I lived through in more detail, so let me walk it the way it actually unfolded.
The delivery partner marks my order "Delivered." It was not delivered. I contact chat support. An agent calls the rider, who admits on that call that he marked it wrong, and promises delivery in 10 minutes.
Ten minutes pass. Nothing. I try calling the rider directly, but the number Zomato shows is a masked, centralized number, starting with the same prefix Zomato's own support agents call from, so I genuinely can't tell if I'm talking to the rider or someone else. When I do get through, he tells me he's now on a Rapido trip and will take longer.
I go back to Zomato chat. A different agent picks up the thread with zero visibility into what the first agent already confirmed — that the rider admitted the mistake. I'm re-explaining the entire thing from scratch. This agent makes the same 10-minute promise, as if it's the first time it's been made.
The order never comes. The chat times out from inactivity and closes on its own. When I try to reopen it, I don't get an agent — I get a system message along the lines of "query is still not resolved. Please describe your issue in detail," with a text CTA "Add comment," with absolutely no indication anyone is going to read that comment or follow up on it (I tried multiple times by adding comments in detail).
More than 24 hours after I wrote in to their support email, I finally got a reply. It said Zomato found no discrepancy — the order was delivered — flatly contradicting what two live agents had already acknowledged to my face.
The Breakdown, Mapped to What's Actually Broken
The Pattern Underneath Both Stories
Strip the surface differences away — a delay dispute versus a phantom delivery — and I was dealing with the same architecture both times:
The chat layer is built to end the conversation. Not to close the loop on what actually went wrong.
Swiggy ends the conversation by pushing time forward until I stop asking. Zomato ends it by resetting context (new agent, no memory) or letting it expire (auto-close, dead-end comment box) until I stop asking.
Both are containment-first, resolution-second systems. At the scale these platforms operate, that's a defensible cost strategy on paper. In practice, it costs three things UX is supposed to protect:
What gets lost
- Trust — an interface that implies action without follow-through teaches me the interface lies to me.
- Accountability — when an email team can flatly deny what a live chat agent already confirmed, I'm not dealing with one company. I'm dealing with several disconnected departments sharing a logo.
- Escalation as a right, not a favor — refusing a direct, explicit request to speak to a human is the single most hostile move a conversational interface can make. Both platforms, independently, made it.
What I'd Fix