The scheduled-calls list
Book, list and cancel the user's calls from your own screens: the booking rules and their checks on the device, scheduleCall, scheduledCalls and cancelScheduledCall, every status a call moves through, who booked it, and the chat's upcoming-calls card — on every platform.
Every booked call — by the agent in a conversation, by the user from your app, by your team in the dashboard — is one list per user. Your app can read it, cancel from it, and book into it with a screen of its own (or let the SDK's sheet do the booking).
What it needs in the dashboard
| Where | Setting | Value |
|---|---|---|
| Agent → Calls & scheduling → Who may book a call | Users, from your app | On — and its three limits |
| Agent → Calls & scheduling → Who may book a call | The agent, during a conversation | On, for "call me tomorrow at 6" in a conversation |
| Agent → Calling Window | The agent's hours | Applied in the user's own time zone |
| Agent → Calls & scheduling → Scheduled calls | — | Your team's view of every call, and Schedule a call |
What to do, in order
- Read the rules —
schedulingRules: whether users may book, the earliest and latest times (earliest(now),latest(now)), how many may wait, the call name. No request: it comes with the agent's settings. - Book with a time and an optional reason (120 characters). → The SDK refuses
on the device first —
scheduling_off,too_soon,too_far— then Graine checks the calling window and the calls already waiting. - List the user's calls — upcoming first.
- Cancel one whose
canCancelis true. → Its status becomescancelled. - Follow the status as the time comes:
scheduled→ringing→answered→completed, ordeclined,missed,failed,expired,no_device.
| Status | Means |
|---|---|
scheduled | Booked; nothing has rung yet. canCancel is true |
ringing | The phone is ringing now |
answered, completed | The user answered; the conversation is over |
declined | The user declined. Nothing rings them again for 6 hours |
missed | Nobody answered. One more ring after your delay, if set |
failed | It could not ring or connect |
cancelled | Called off before it rang |
expired | More than 10 minutes late (held by quiet hours or the window), or no opening left |
no_device | No app device of the user's seen in the last 30 days — a browser cannot ring |
source says who booked it: agent, app (your app), dashboard or api. A
status or source newer than your SDK arrives as unknown, carrying its word.
The code, platform by platform
The chat's card, for a screen of yours: graine.chat.upcomingCalls (published),
chat.refreshUpcomingCalls(), chat.cancelUpcomingCall(id:).
Troubleshooting
| What you see | Why | Fix |
|---|---|---|
scheduling_off before any request | Users, from your app is off, or the settings have not loaded | Turn it on; wait for the settings |
too_soon / too_far | Outside earliest(now) … latest(now) | Offer only times in that range |
outside_window | Outside the agent's Calling Window in the user's time zone | The message names a time that works |
too_many_pending | The user has the most calls waiting | Cancel one first |
rate_limited | More than 10 bookings in an hour from one install | Wait retryAfterSeconds |
A call ended no_device | The user has no app device seen in 30 days | They open the app signed in, once |
The full rules, holds and webhooks: Scheduled calls · SDK reference → Scheduling.

