Saaya for Campaigns

A million conversations. One Tuesday afternoon.

Bulk dispatch across voice, WhatsApp, and SMS. Retry cascades, channel fallback, opt-out handling, and a live ops dashboard that tells you exactly where every contact stands. Live in fifteen minutes. Built for ops leaders, marketing teams, and anyone who has ever stared at a CSV the size of a city.

The problem

Outbound at scale breaks in the same five places.

You can pay for the dialer. You can pay for the WhatsApp template. The hard part is everything in between.

01Lists rot in days. Numbers go bad, opt-outs pile up, and your CSV from last month already has wrong-number complaints in it.
02Single-channel campaigns leave money on the table. Voice that goes to voicemail should fall to WhatsApp; WhatsApp that goes unread should fall to SMS. Most stacks can’t.
03Retry policies are written by accident. “Three tries, then give up” is not a retry policy — it’s a way to lose 40% of reachable contacts.
04Compliance is the silent killer. One unconsented late-night call to the wrong region and your campaign is in front of a regulator, not a customer.
05Cost per contact only matters if you can measure it. Most teams can’t — the dialer, the WhatsApp BSP, and the CRM each tell a different story.
How Saaya fixes it

A dispatch engine that respects the list.

CSV in, conversations out — across voice, WhatsApp, and SMS, with retry, fallback, opt-out, and audit baked in. One agent identity, one ops view, one consent model.

CSV → conversations

Drop a CSV (or sync from Salesforce, HubSpot, Sheets). Saaya enriches, validates, dedupes against your DNC and prior opt-outs, and queues calls and messages with concurrency caps that respect carrier rate limits.

Retry & channel fallback

Voice no-answer falls to WhatsApp. WhatsApp unread falls to SMS. Each step has its own back-off and time-of-day window. Configure once per campaign, audit every step per contact.

Live ops dashboard

Per-contact status, sentiment, and outcome — in real time. Filter by retry state, by region, by intent. Pause a campaign mid-flight, change the script, resume from where you stopped.

Opt-out & consent first

STOP, UNSUBSCRIBE, “please remove me”, and the silent-hang-up signal all flow into the same suppression list. TCPA-, TRAI-, DLT-, and DNC-aware out of the box.

Real scenarios

The campaigns Saaya runs in production every week.

Not theoretical. The plays already paying for themselves in customer accounts.

Scenario 01

Appointment reminders that actually reschedule

Voice + WhatsApp reminders 48 hours and 4 hours out. If the contact says “can’t make it”, the agent reschedules on the spot against live calendar availability instead of marking them no-show.

38% drop in no-shows · 11% of confirms became reschedules instead of misses
Scenario 02

Payment & renewal chasers

A friendly first nudge on WhatsApp. A voice call on day five if unread. A direct payment link via SMS on day seven. Polite, persistent, and traceable end-to-end.

24% lift in on-time payments · 4× cheaper than agency dialers
Scenario 03

KYC reminders without the spreadsheet

Customers stuck mid-KYC get a multilingual call that walks them through the missing step, sends the doc-upload link, and confirms when the file is received. No human touch unless something genuinely fails.

62% completion on stalled KYC queues in 14 days
Scenario 04

Win-back & satisfaction surveys at scale

Dormant customers get a 90-second voice check-in with a real conversation. Saaya summarizes the why, scores intent to return, and routes hot signals to your CSM team — cold ones to a quiet, polite goodbye.

6.4% win-back rate vs. 1.1% on email-only baselines
Build your agent

The prompt guide.

Outbound is a different beast from inbound. You have ninety seconds before the contact decides whether you are useful or a nuisance — and the prompt is what decides it. We use XML-tagged sections so the persona, the call script, the rebuttals, and the close can each be tuned without touching the others.

Best for live calls

When to use this channel

  • High-intent reminders (appointments, payments, renewals) where a voice nudge converts faster than a message.
  • Surveys and post-purchase NPS — voice gets the texture that a number on a scale will never give you.
  • Win-back of dormant accounts where warmth beats a sequence.

Voice writing rules

  • One or two short sentences per turn. Never read a paragraph.
  • Spell digits and account numbers one at a time: “four-zero-two, eight-one-nine”.
  • Read amounts like a human: “rupees three thousand four hundred”, not “3400 rupees”.
  • Disclose AI status on the first turn where the law requires it (US, EU, India). It builds trust anyway.
  • Pause for at least 800 ms after a question. Hard stop on interruption within 200 ms.
  • On voicemail detection, leave a 12-second message and hang up — no live agent attempt.

Tuning tips

  • Set temperature to 0.4. Outbound voice values consistency over creativity — improvisation gets you compliance fines.
  • Pre-record the opener and listen back blind. If three teammates think it sounds like a telemarketer, simplify.
  • A/B test only the <call_script> block at first. Everything else stays frozen for the first two weeks of a campaign.
  • Add at least three real anonymized exchanges to <rebuttals>. Few-shot consistently beats abstract instructions.
  • Check your time-of-day window per region against TRAI (08:00–21:00 IST), TCPA (08:00–21:00 local US), and any regional rules in the EU. Hardcode them; don’t leave it to ops.

Common pitfalls

  • Calling without a current consent record. The first regulator complaint costs more than the entire campaign.
  • Over-retrying — three voice attempts in a day burns the relationship. Cap at one voice + two messages per contact per 72 hours.
  • Ignoring sentiment drift. A campaign that converts but tanks NPS is a slow churn engine.
  • Reading the DLT template differently from how it’s registered. India regulators check this.
  • Treating voicemail like a live caller. Always detect, leave the 12s message, hang up.
starter prompt · voice
<persona>
You are Riya, an outbound campaign agent at {{company_name}}.
You are calling existing customers who already have a relationship with us —
not cold leads. Tone: warm, brief, helpful. Never salesy. Never pushy.
</persona>

<objective>
Complete the campaign step in under 90 seconds:
- {{campaign_objective}} — for example: "confirm the Thursday 3pm appointment,
  reschedule if needed, and send the location by WhatsApp".
- Always end with a clear, named next step.
</objective>

<consent_and_disclosure>
- On call connect, identify yourself and the company in the first turn.
- For US numbers, disclose AI: "I'm an AI assistant from {{company_name}}".
- For EU numbers, mention call recording before any data collection.
- For India numbers, follow the DLT-registered template language verbatim
  on the first turn.
- If the contact says STOP, REMOVE, "do not call", or any clear opt-out:
  acknowledge once, trigger add_to_dnc(reason="caller_request"), end.
</consent_and_disclosure>

<call_script>
1. Open: "Hi, is this {{contact_first_name}}? This is Riya from
   {{company_name}}. Quick reason for the call — {{one_sentence_reason}}.
   Got a minute?"
2. If yes: deliver the campaign objective in two short sentences.
3. Ask the one question that matters for this campaign
   (e.g. "Are you good for Thursday 3pm, or should I find another time?").
4. Wait. Confirm what you heard.
5. Take the next concrete action via tools. Confirm out loud.
6. Close: "I'll send the details to your WhatsApp now. Anything else
   I can help with before I let you go?"
</call_script>

<rebuttals>
- "I'm busy / call back later":
  Acknowledge, offer two specific times, schedule via schedule_callback.
  Never insist beyond one ask.
- "Why are you calling me?":
  One short sentence with the prior context (e.g. last visit, last order,
  last enrollment). If they still object, end politely.
- "I don't remember signing up":
  Apologize once, confirm the contact info we have, offer to remove them.
  If they confirm removal, trigger add_to_dnc.
- "Are you a robot?":
  Always be honest: "Yes — I'm an AI agent from {{company_name}}. I can
  also connect you to a human if you'd like."
- "Send me an email instead":
  Confirm the email on file, trigger send_email_followup, end politely.
</rebuttals>

<close>
- Recap the action: "I've moved your appointment to Friday at 11."
- Confirm the channel of the follow-up: "You'll get a WhatsApp from us
  in two minutes with the location."
- One last opening: "Anything else before we wrap up?"
- End warmly: "Have a good one — bye now."
</close>

<post_call_actions>
After every call, no matter the outcome, run:
- log_disposition(outcome, reason, sentiment_score, duration_seconds)
- update_crm_record(contact_id, fields)
- If success: trigger the configured follow-up channel (WhatsApp/SMS/email)
- If voicemail: log voicemail_left, schedule the next retry per cascade
- If opt-out: add_to_dnc, suppress all future channels for this contact
- If escalation: handoff_to_human with full transcript and sentiment
</post_call_actions>

<turn_taking>
- Wait at least 800 ms after every question.
- Stop within 200 ms on interruption.
- After 3 s silence: "Are you still there?"
- After 8 s silence: end gracefully with end_call(reason="silence").
- On voicemail beep detection: deliver the 12-second pre-recorded message
  and hang up. Do not attempt a live exchange.
</turn_taking>

<knowledge_grounding>
You answer ONLY from these sources:
- {{campaign_brief}}
- {{customer_record}}
- {{policy_doc}}

If the contact asks something outside the brief — pricing changes, policy
edge cases, account history beyond what's in {{customer_record}} — say:
"That's a great question — let me have someone email you with the exact
answer within a business day." Then trigger send_email_followup.

Never invent offers, discounts, or commitments. Never quote a price that
isn't in {{campaign_brief}}.
</knowledge_grounding>

<tools>
- schedule_callback(contact_id, time_window)
- reschedule_appointment(contact_id, new_time)
- process_payment_link(contact_id, amount)
- send_whatsapp(contact_id, template, vars)
- send_sms(contact_id, template, vars)
- send_email_followup(contact_id, template, vars)
- add_to_dnc(contact_id, reason)
- log_disposition(outcome, reason, sentiment_score, duration_seconds)
- update_crm_record(contact_id, fields)
- handoff_to_human(reason, summary)
</tools>

<escalation>
Hand off to a human immediately when:
- The contact asks for a human at any point.
- The contact mentions a complaint, legal threat, or regulator.
- The contact mentions self-harm, a medical emergency, or violence.
- Sentiment drops below 0.3 for two consecutive turns.
- The campaign objective requires an action outside policy (refund over
  threshold, custom pricing, contractual change).
</escalation>

<hard_rules>
- Never call outside the configured time-of-day window for the contact's region.
- Never ignore an opt-out signal. STOP / UNSUBSCRIBE / REMOVE / "don't call" =
  immediate add_to_dnc plus end_call.
- Never quote a price, discount, or commitment outside {{campaign_brief}}.
- Never argue. One calm restatement, then disengage.
- Always log disposition before ending the call.
</hard_rules>
Copy and paste into Saaya Studio to get a working agent. Tweak the variables in {{braces}}.
Channel matrix

The right channel for the right step.

Saaya runs all three from one campaign config — fall back automatically when the first channel doesn’t land.

Moment in funnelVoiceChatVideo
  • Appointment reminder (T-48h)LimitedBest fitSkip
  • Appointment reminder (T-4h)Best fitGoodSkip
  • Payment / renewal first nudgeLimitedBest fitSkip
  • Payment / renewal escalationBest fitGoodLimited
  • KYC reminder & doc walk-throughBest fitGoodLimited
  • Post-purchase satisfaction surveyGoodBest fitSkip
  • Win-back of dormant accountsBest fitGoodLimited
  • Premium-tier white-glove outboundGoodGoodBest fit
  • Broadcast notification (status, recall, news)LimitedBest fitSkip

Best fit · Good · Limited · Skip — pick the channel that matches the moment.

Outcomes

Numbers Saaya moves on every outbound campaign.

1M+
Calls per campaign
Concurrency capped per carrier and per region.
78%
Lower cost per contact
Versus an agency dialer + BSP stack.
< 0.1%
Compliance complaint rate
Per-region consent and time-window enforcement.
24/7
Ops dashboard, live
Pause, edit, resume mid-flight without losing state.
Stack

Plays nice with the dialer, BSP, and CRM you already pay for.

Saaya is the orchestration layer — the carriers and CRMs underneath stay yours.

Twilio
WhatsAppWhatsApp
PPlivo
EExotel
Salesforce
HubSpot
ZZoho
SSheets
Slack
WWebhooks

Don't see your tool? Saaya speaks REST and webhooks — most stacks are a 1-day plug-in.

Trust

Compliance baked in — not bolted on.

TCPATRAI / DLTGDPRDPDP
  • Per-region time-of-day windows enforced at dispatch — TRAI 08:00–21:00 IST, TCPA 08:00–21:00 local US, EU rules per member state.
  • DLT-registered template enforcement for India: the first WhatsApp/SMS message goes out verbatim, every time.
  • Universal opt-out: STOP, UNSUBSCRIBE, REMOVE, “don’t call”, and silent hang-ups all suppress every channel for that contact, instantly.
  • PII redaction on transcripts before they hit your CRM or analytics.
  • Full audit log per contact per attempt, exportable to CSV or your SIEM.
  • Optional EU/India data residency on the Enterprise plan.
FAQ

Frequently Asked Questions.

Campaigns · Final step

Stop dialing. Start dispatching.

Get an outbound campaign — voice, WhatsApp, or all three — running on your stack inside an hour. Early-bird pricing locked in for life.

Request access for CampaignsTalk to founders

No credit card · 15-min setup · Cancel anytime