osmTalk Docs
Cookbook

Outbound Sales

Qualify cold leads from a CSV. Book demos. Handoff hot leads to a human.

A campaign that calls a list of prospects, qualifies them with 2-3 questions, books a demo with the qualified ones, and pushes everything to your CRM.

Goal

  • Call cold leads from a CSV
  • Open with a friendly personalized intro
  • Disqualify if they're not the buyer / don't have budget
  • For qualified leads: book a 30-min demo slot
  • Save lead status to your CRM via webhook

Premium — gpt-5.4 + Deepgram nova-3 + ElevenLabs Sarah. More expensive but you only pay per minute, and the voice quality directly affects pickup → qualification conversion.

For Indian-language outreach: Premium (India) variant.

System prompt (copy-paste)

You are Arjun, a sales development rep at CloudSync — we sell project-management software to mid-size IT consultancies (50-500 people).

You're calling {{first_name}} at {{company}}. Their LinkedIn says they're a {{title}}.

Your job, in order:
1. Open warmly: "Hi {{first_name}}, this is Arjun from CloudSync. Got 2 minutes?"
2. If they say no or sound busy: "Totally understand — can I send a quick email instead?" then use the save_lead tool with status=callback_requested.
3. If they say yes:
   a. Confirm they're the right person: "Are you the one who picks productivity tools for {{company}}'s engineering teams?"
   b. If not: ask who is, save their name and end politely.
4. Qualify in this exact order:
   - Pain: "What's slowing your team down with [their current tool] today?"
   - Budget: "Are you currently evaluating new tools, or is this more of a future conversation?"
   - Timing: "When would you ideally roll something new out?"
5. Decide:
   - QUALIFIED (has pain + budget + Q1/Q2 timing): "I'd love to show you a 20-min demo — what's a good time this week or next?"
     Get the slot, then call save_lead with status=qualified + slot=<time>.
   - NOT QUALIFIED: "Got it, doesn't sound urgent. Mind if I check in next quarter?"
     Call save_lead with status=not_now.
6. Always thank them by name before hanging up.

Hard rules:
- NEVER spend more than 4 minutes on a call.
- If they say "remove me from your list" or "don't call me again" — IMMEDIATELY say "I'm sorry, I'll take you off the list right now" and call save_lead with status=opt_out. Don't argue.
- Never invent product features or prices. If asked, say "I'll have our solutions consultant share that on the demo."
- Don't read the variables aloud — just speak the values naturally.

Tone: warm, confident, brief. Match the prospect's energy. Stop talking the moment they start.

Welcome message

Hi {{first_name}}, this is Arjun from CloudSync. Got 2 minutes?

Dynamic variables (per lead, from the CSV)

Your campaign CSV needs these columns:

phone,first_name,company,title
+919876543210,Arjun,Acme Industries,Engineering Manager
+919876543211,Priya,BlueLeaf Pvt Ltd,VP Product
+919876543212,Vivek,Cool Foods,CTO

Every column becomes a {{variable}}. Required: phone. Everything else is optional.

Settings

SettingValueWhy
Max call duration240 secSales calls run long; cap to control cost
Allow interruptionsOnProspects will cut in often
Enable voicemail detectionOnSave 40% of cost on calls that hit voicemail
Voicemail message(see below)Leave a short callback ask
Enable call recordingOnTrain + review qualifications
Enable post-call analysisOnAuto-extract qualification status

Voicemail message

Hi {{first_name}}, this is Arjun from CloudSync. I was hoping to chat about CloudSync for {{company}}. I'll send a quick email follow-up, but if you'd rather chat, call us back at +91-XXXXXXXXXX. Thanks!

Tools

1. save_lead (HTTP tool)

Posts the qualification outcome to your CRM.

Configure → Actions → HTTP Tools → + Add

FieldValue
Namesave_lead
Description"Save the lead outcome to the CRM. Call this exactly once at the end of every call, after the qualification decision is made."
MethodPOST
URLhttps://crm.yourcompany.com/api/leads
HeadersAuthorization: Bearer SECRET
Parametersstatus (enum: qualified/not_now/callback_requested/opt_out, required), pain (string), budget_signal (string), slot (string), notes (string)
SilentOn (don't read the API call aloud)
Wait message(leave blank — silent)

2. Post-call analysis (auto-extracts everything to your webhook)

Configure → Advanced → Post-Call Analysis → On

Schema:

NameTypeRequiredDescription
qualifiedbooleanyesDid the lead express budget + timing match?
pain_pointstringnoWhat slowing-down problem did they mention?
current_toolstringnoWhat tool are they using today (if mentioned)?
demo_slotstringnoIf they booked a demo, what time?
dispositionenumyesOne of: qualified / not_now / callback_requested / opt_out / no_decision

Plus:

  • ✓ Include summary
  • ✓ Include sentiment
  • ✓ Success criteria: "The agent qualified the lead and either booked a demo OR captured a callback time."

Set the org default webhook URL under Settings → Webhook so qualified leads auto-fire into your CRM.

Campaign setup

  1. Campaigns → + New Campaign
  2. Name: "Q2 mid-size IT outreach"
  3. Pick this agent + your outbound phone number
  4. Max concurrent: 5 (good middle ground — won't trip your provider rate limits)
  5. Schedule: Mon-Fri, 10 AM-6 PM, in your prospects' timezone
  6. Retry policy: 3 attempts, 2 hours apart, retry on no_answer + busy
  7. Webhook URL: your CRM endpoint (will receive campaign.lead_completed events)
  8. Upload your CSV
  9. Start

How to test (before sending to 1,000 real prospects)

In the agent page, click Simulate (top right).

Mock turn 1 (user): "Hi, who's this?" Mock turn 2 (user): "I'm the VP of Product, yeah." Mock turn 3 (user): "Our biggest issue is everyone using different task trackers." Mock turn 4 (user): "We have budget approved for Q2 — about 100 seats." Mock turn 5 (user): "Friday at 3 PM works."

Run simulation. Confirm the agent:

  • Asks pain → budget → timing
  • Books the slot
  • Says it'll call save_lead

Save this as a test case so you can re-run after every prompt edit.

Typical cost

A 3-minute qualified call:

LLM (gpt-5.4, ~1800 tokens):       ₹4.50
STT (3 min):                        ₹1.50
TTS (ElevenLabs Flash, ~900 chars): ₹3.40
SIP (3 min):                        ₹4.23
Post-call analysis (gpt-4o-mini):  ₹0.05
─────────────────────────────────────
Total:                              ~₹17.50/call

At a 60% answer rate × 30% qualification rate × 50 calls/day = ~9 qualified leads/day for ~₹800.

Common mistakes

MistakeFix
Agent over-talks the prospectAdd to prompt: "Stop talking the moment the prospect starts — even mid-sentence."
Agent never disqualifiesThe 3-step qualification (pain → budget → timing) is too soft. Be explicit about what "qualified" requires.
Voicemail rate is 80%Calling outside your prospects' working hours. Switch dialing window to their local timezone.
Webhook didn't fireCheck Settings → Webhook → Default URL. Webhook only fires if the analyzer ran (postCallAnalysis must be on).
Opt-out wasn't honoredConfirm save_lead is called with status=opt_out AND you've added the number to your DNC list.

What's next