osmTalk Docs
Cookbook

Appointment Reminder

Auto-call tomorrow's appointments. Confirm, reschedule, or cancel.

The day before each appointment, your agent dials the patient/customer, confirms they're coming, and reschedules or cancels if they can't.

Goal

  • Call everyone with an appointment tomorrow
  • "Hi, just confirming your dental cleaning tomorrow at 3 PM. Will you be there?"
  • If YES → "Great, see you then."
  • If NO → ask why, offer to reschedule
  • If voicemail → leave a brief message

Fast — speed matters; reminder calls are short.

For Indian-language: Fast (India).

System prompt

You're calling {{first_name}} to confirm their {{appointment_type}} appointment tomorrow at {{appointment_time}} at {{location}}.

Open: "Hi {{first_name}}, this is a reminder from {{location}} about your {{appointment_type}} appointment tomorrow at {{appointment_time}}. Can you still make it?"

If YES: "Great, see you then!" — end the call.

If NO or "can I reschedule":
  - "No problem. What works better — same time on Thursday, or 11 AM Friday?"
  - If they pick a slot: call `update_appointment` with the new slot, then "All set. See you then."
  - If neither works: "OK, I'll have someone call you to reschedule. Anything specific you'd like them to know?"

If they want to cancel outright:
  - "OK, I'll cancel that for you." Call `cancel_appointment`. "Want to reschedule now or get a callback?"

If they ask anything else (price, what to bring, etc.):
  - Brief answer based on the prompt context. If you don't know, say "Let me have the front desk call you back with that."

Rules:
- Maximum 60 seconds total.
- Speak naturally. Don't read variables aloud — speak the values.
- If they pick up but say "wrong number" or sound confused: apologize, end the call.

Welcome message

Hi {{first_name}}, this is a reminder from {{location}} about your {{appointment_type}} appointment tomorrow at {{appointment_time}}.

Dynamic variables (per appointment)

CSV columns:

phone,first_name,appointment_type,appointment_time,location
+919876543210,Arjun,dental cleaning,3 PM,Greenleaf Dental Mumbai
+919876543211,Priya,checkup,11 AM,Greenleaf Dental Mumbai

Settings

SettingValue
Max call duration90 sec
Enable voicemail detectionOn
Voicemail message(see below)
Enable end-call detectionOn
Allow interruptionsOn

Voicemail message

Hi {{first_name}}, this is a reminder about your {{appointment_type}} appointment tomorrow at {{appointment_time}} at {{location}}. If you need to reschedule, please call us back at +91-XXXXXXXXXX. See you tomorrow!

Tools

update_appointment

FieldValue
Nameupdate_appointment
Description"Reschedule an appointment to a new slot. Call only after the caller confirms a specific new time."
MethodPOST
URLhttps://your-clinic.com/api/appointments/{{appointment_id}}/reschedule
Parametersnew_slot (string, required)

cancel_appointment

FieldValue
Namecancel_appointment
Description"Cancel the upcoming appointment. Only call after the caller explicitly asks to cancel."
MethodPOST
URLhttps://your-clinic.com/api/appointments/{{appointment_id}}/cancel

Both tools use {{appointment_id}} (passed as a dynamic variable from the campaign CSV) so each call updates the right record.

Campaign setup

This is a recurring use case — run daily as a campaign.

CSV generation (cron job in your app)

Every evening, your backend should generate a CSV of tomorrow's appointments:

phone,first_name,appointment_type,appointment_time,location,appointment_id
+919876543210,Arjun,dental cleaning,3 PM,Greenleaf Dental Mumbai,APT-001
+919876543211,Priya,checkup,11 AM,Greenleaf Dental Mumbai,APT-002

Then create a campaign via API:

curl -X POST https://api.osmtalk.com/api/campaigns \
  -H "Authorization: Bearer $OSMTALK_API_KEY" \
  -d '{
    "name": "Reminders for 2026-05-13",
    "agentId": "agent_xxx",
    "phoneNumberId": "pn_xxx",
    "maxConcurrent": 10,
    "schedule": {"timezone": "Asia/Kolkata", "windowStart": "16:00", "windowEnd": "20:00"},
    "retryPolicy": {"maxAttempts": 2, "backoffMinutes": 90, "retryOn": ["no_answer", "busy"]}
  }'

Upload the CSV → start the campaign. Done by 8 PM.

Webhook to update your records

Set Settings → Webhook → your endpoint. Every call ends with a webhook so your CRM knows who confirmed, rescheduled, or no-answered.

Use post-call analysis to extract structured outcome:

FieldTypeDescription
confirmedbooleanDid they confirm attendance?
rescheduled_tostringIf they rescheduled, the new slot
cancelledbooleanDid they cancel outright?
dispositionenumconfirmed / rescheduled / cancelled / no_answer / voicemail

Typical cost

A 30-second reminder call:

LLM:                ₹0.15
STT (30 sec):       ₹0.25
TTS (~200 chars):   ₹0.50
SIP (30 sec):       ₹0.35
─────────────────────
Total:              ~₹1.50/call

At 100 reminders/day → ₹150/day (~₹4500/month). Equivalent to a fraction of one part-time receptionist.

Common mistakes

MistakeFix
Bot calls people at 9 PMSet windowEnd correctly in the campaign schedule
Bot doesn't actually update your CRMConfirm the update_appointment HTTP tool URL is your real endpoint, not a placeholder
70% voicemail rateMove the dialing window 1-2 hours later when people are off work
Voicemail message cut offKeep under 15 seconds spoken (~30 words). Test it.
Reminders go to wrong appointmentsThe appointment_id variable must match your CRM's primary key. Test with 1 row first.

What's next