AI & Automation

Zara AI Calling Workflow

An AI voice agent can hold a sales conversation. That is a demo. Turning it into something a business runs on means deciding when it dials, what happens on every outcome, who owns the follow-up, and who is allowed to switch it off. That workflow is what I built.

10+ campaigns in production · 25,000+ clients targeted each · 3 markets

Zara AI calling workflow: 25,000+ clients targeted per campaign across 10+ campaigns and 3 markets

The problem

A campaign meant working through a client list of roughly 25,000 people. The sales floor could not dial that many inside the window a campaign ran, and no amount of scheduling fixed it, because the constraint was simply how many calls a person can place in a week. Whoever did get reached was recorded by hand, and the follow-up lived in someone's memory or a note. The ceiling was never the pitch. It was the dialling.

What I owned, and what I did not

A colleague ran the initial research into whether a voice agent could hold a sales conversation at all. I designed and built the workflow that turned that capability into an operational system: how a campaign starts, how calls are paced, what happens on each outcome, how a follow-up becomes a task somebody owns across both CRMs, Propforce and Jarvis, and how the business stops the whole thing.

Put plainly, the agent answered the phone. The workflow decided when it rang and what happened afterwards. The second half is where the engineering was.

How it runs

BEFORE SALES AGENT DIALS BY HAND OUTCOME ON PAPER FOLLOW-UP REMEMBERED Roughly 25,000 clients per campaign, against a team that could place a few hundred calls a day. AFTER PRODUCT & BUSINESS TEAM enable or disable per campaign, or on a trigger. No deployment. CAMPAIGN client segment QUEUE paced, retried ZARA AI places the call, holds the conversation CALL STATE answered, missed, declined, voicemail FOLLOW-THROUGH transcript analysed · CRM task assigned WhatsApp sent on missed or follow-up CALLBACK SCHEDULED BACK INTO THE QUEUE

Reconstructed from the system as I built it. No internal diagram or screenshot is reproduced here.

The sequence

  • A campaign is defined against a client segment and enters a queue rather than firing at once, so volume is paced and failures are retried instead of being dumped on the telephony provider.
  • Zara AI, the voice agent, places the call and holds the conversation.
  • Every call resolves to a state, not a note. Answered, missed, declined, voicemail. That state is what everything downstream branches on, which is the difference between a workflow and a script.
  • Answered calls are transcribed and analysed for intent and outcome, rather than filed somewhere nobody reads.
  • A follow-up becomes a task in the CRM, assigned and tracked against the same client record the sales team already works from.
  • Missed calls and follow-ups go out over WhatsApp, so the client hears something even when the call did not land.
  • Callbacks are scheduled back into the queue, which makes the whole thing a loop rather than a one-shot blast.

The switch the business owns

Product and business teams could enable or disable autocalling themselves, per campaign or on a trigger such as a new client entering the system, with no deployment and no engineer in the loop.

This is the decision I would defend hardest, because it is the one that is easy to skip. An automation only engineering can stop is not an operational tool, it is a liability. Campaigns get paused for reasons engineering never sees: a public holiday, a regulatory question, a pricing change, a market going quiet for a week. If stopping the calls requires a release, the system gets used nervously or quietly abandoned. Putting the control where the accountability already sat is what made it something the business ran, rather than something it tolerated.

Where it ran

In production before I left DubizzleLabs. More than 10 campaigns across Saudi Arabia, the UAE and Pakistan, each targeting 25,000 or more clients and running a week or longer.

To be precise about that number: 25,000+ is the size of the client list a campaign targeted. It is not a count of completed calls, and I do not have a verified figure for those. The workflow's job was to make a list that size reachable at all.

What it was built on

The workflow services were NestJS and TypeScript over PostgreSQL, with a message queue pacing call initiation and carrying retries. They integrated into the CRM side, Node.js and TypeScript over SQL with OpenSearch for lookup across the client base, so a call outcome landed on the record the sales team was already working from.

Nothing about it ran as a parallel system, and that was deliberate. An automation that keeps its own separate record of the truth creates reconciliation work that eventually costs more than the dialling it saved.

What I took from it

The interesting problem was never the model. It was that a human workflow has implicit steps nobody writes down: the rep who knows not to call during prayer times, the one who tries twice before giving up, the one who notices a client is already in another campaign. Automating the call is easy. Finding those unwritten rules, and deciding which ones the system has to encode and which belong to a person, is the actual work.

Back to all work