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
Recommended preset
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 MumbaiSettings
| Setting | Value |
|---|---|
| Max call duration | 90 sec |
| Enable voicemail detection | On |
| Voicemail message | (see below) |
| Enable end-call detection | On |
| Allow interruptions | On |
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
| Field | Value |
|---|---|
| Name | update_appointment |
| Description | "Reschedule an appointment to a new slot. Call only after the caller confirms a specific new time." |
| Method | POST |
| URL | https://your-clinic.com/api/appointments/{{appointment_id}}/reschedule |
| Parameters | new_slot (string, required) |
cancel_appointment
| Field | Value |
|---|---|
| Name | cancel_appointment |
| Description | "Cancel the upcoming appointment. Only call after the caller explicitly asks to cancel." |
| Method | POST |
| URL | https://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-002Then 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:
| Field | Type | Description |
|---|---|---|
confirmed | boolean | Did they confirm attendance? |
rescheduled_to | string | If they rescheduled, the new slot |
cancelled | boolean | Did they cancel outright? |
disposition | enum | confirmed / 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/callAt 100 reminders/day → ₹150/day (~₹4500/month). Equivalent to a fraction of one part-time receptionist.
Common mistakes
| Mistake | Fix |
|---|---|
| Bot calls people at 9 PM | Set windowEnd correctly in the campaign schedule |
| Bot doesn't actually update your CRM | Confirm the update_appointment HTTP tool URL is your real endpoint, not a placeholder |
| 70% voicemail rate | Move the dialing window 1-2 hours later when people are off work |
| Voicemail message cut off | Keep under 15 seconds spoken (~30 words). Test it. |
| Reminders go to wrong appointments | The appointment_id variable must match your CRM's primary key. Test with 1 row first. |
What's next
- Voicemail detection — saves 40%+ on voicemail-heavy lists
- Campaigns — schedule, retry, monitor
- Webhooks — close the CRM loop