Graine AI

Scheduled calls

Calls booked for later — by the agent during a conversation, by the customer from your app, or by your team in the dashboard — rung on the customer's phone at a good time in their own time zone, with the rules that protect them and every outcome recorded.

"Call me back tomorrow at six." A scheduled call is a call booked for later and rung when it falls due — in your app through hosted ringing, or on the phone for a caller who booked it on a phone call. Three ways to book, one set of rules:

Booked byHowWhen it is allowed
The agent, during a conversationIt books when the customer asks to be called back, and tells them the time it booked, in their time zoneThe agent, during a conversation is on
The customer, in your appYour app calls scheduleCallUsers, from your app is on
Your team, in the dashboardAgent → Calls & scheduling → Schedule a callAlways, for anyone who can place calls

An in-app call rings the customer's devices through hosted ringing, so it needs your push credentials uploaded, and an app on iOS, Android or Flutter 0.7.0 or React Native 0.41.0 (calls 0.2.0) — the versions with scheduleCall and hosted ringing. A callback the agent books on a phone call is an ordinary scheduled phone call to the caller's number.

How it works

The agent"call me tomorrow at six"Your appscheduleCallYour teamSchedule a callBookedlead time, days aheadcalls already waitingcalling window, if thecustomer chose the timecredit, agent onWhen it is duecredit, agent onnot more than 10 min latethe customer's hours,in their time zonequiet hours · how oftenRingtheir newest devicefor the ring timeoutonce more after a miss,if you allow itOutcomethe call's status · Call History · your webhooksoutside the hours: moved to the next opening

Three ways in, checked when booked and again when due, rung on one device at a time.

Set it up

Agent → Calls & scheduling — also on Embed & Widgets → Calls.

Agent, Calls & scheduling: The agent, during a conversation and Users, from your app switched on with their limits; the name on the incoming call, Asha from Acme; ring for 45 seconds, once more after 10 minutes, at most 3 times a day; and quiet hours from 9 pm to 8 am

Who may book a call

SettingValuesDefault
The agent, during a conversationOn or offOffGives the agent the means to book a call back
Users, from your appOn or offOffLets your app call scheduleCall
At most this many upcoming calls per user1 to 103Booked and not yet rung
Booked at most this far ahead1 to 30 days14
With at least this much notice2 to 1,440 minutes5

How it rings

SettingValuesDefault
Name on the incoming callUp to 40 charactersThe agent's nameWhat the customer's phone shows when it rings
Ring for20 to 60 seconds45How long a ring lasts before it is missed
After a missed call, ring once more after0 to 120 minutes; 0 never10One more ring after a missed one — never after a decline
Ring each user at most1 to 10 times a day3
Quiet hoursA start and an end, or none21:00 to 08:00No ring the agent or your team booked falls in them, in the customer's time zone

Save call settings saves both.

The agent's calling window applies to every scheduled call, in the customer's time zone, which your app's SDK reports.

In-app call audio

SettingValuesDefault
In-app call audioWebRTC (recommended) or StandardWebRTC, where your app includes itHow the audio of every call travels, both when a customer calls the agent and when they answer a call you rang. WebRTC is steadier on weak networks. Standard puts every call on the standard audio path, whatever your app chose — use it only if a network your customers are on blocks WebRTC

In-app call audio shows once the agent is set up for your app or website, and is saved the moment you change it. Apps pick up the change the next time they start.

Booking

By the agent

With The agent, during a conversation on, the agent can book a call back when a customer asks for one. It is told the current time where the customer is, books a time with its offset, and hears back the confirmed time — or why it could not book — in plain words, which it passes on: "Done — I'll call you tomorrow at 6 pm."

In your app, the call is for the signed-in customer when this device is one of theirs (Identity and users), otherwise for this install. On a phone call, it is for the caller's number.

Say in the prompt when the agent should offer a call back, and what to say about it. It can only book within your rules.

From your app

With Users, from your app on:

const client = useGraineClient();
const call = await client.scheduleCall({ at: "2026-10-14T18:00:00+05:30", reason: "Talk through my order" });
const upcoming = await client.scheduledCalls();      // this customer's, or this install's
await client.cancelScheduledCall(call.id);

What each method returns and every error it can raise is on the SDK reference → Scheduling; schedulingRules tells your booking screen which times will be accepted before you ask. A time the customer chooses is checked against the calling window when it is booked, and refused outside it with a message you can show; quiet hours do not apply to it — they asked. reason is up to 120 characters; it reaches the agent when the call connects and never travels in the push.

From the dashboard

Agent → Calls & scheduling → Scheduled calls lists every booked call with its status, and Schedule a call books one: for an in-app customer by their identifier, or for a phone number. Listing needs a role that can view calls; booking and cancelling, one that can place calls.

Scheduled calls: an upcoming call with Cancel, a missed and a completed one, each with who booked it, then Find calls for a user ID and the Schedule a call form for an app user

What every booking must pass

  • no sooner than With at least this much notice, and no further ahead than Booked at most this far ahead;
  • no more than At most this many upcoming calls per user already booked for them;
  • your workspace has credit and the agent is on;
  • at most 10 bookings an hour from one install, within your workspace's own limit.

What happens at the time

  1. Credit and the agent. With no credit, or the agent switched off, the call is held — still scheduled — for up to 10 minutes, and expires after that.
  2. Not stale. A call more than 10 minutes past its time expires instead of ringing late.
  3. The customer's hours. The calling window, in the customer's time zone, and quiet hours for a call the agent or your team booked. Outside them, the call moves to the next opening if that is still within Booked at most this far ahead, and expires if not. If the time zone cannot be read, the call does not ring.
  4. How often. No ring within 6 hours of the customer declining one, and no more than Ring each user at most allows.
  5. A device. The customer's devices seen in the last 30 days, newest first — or the one install it was booked for. None: no_device.
  6. Ring. The newest device rings for Ring for; a dead device is skipped for the next one. Unanswered, the call is missed, and rings once more after After a missed call, ring once more after, if you set one.

When the customer answers, the agent hears who_called as scheduled and the call's reason as call_reason, with the variables the booking carried.

Statuses

StatusMeans
scheduledBooked, waiting for its time — or held for credit or the agent
ringingRinging on the customer's device
answeredPicked up; the conversation is on
completedThe conversation ended
declinedThe customer declined it
missedNobody answered within the ring timeout
failedIt could not connect
cancelledCancelled by the customer, your app or your team
expiredIt could not ring in time: stale, held too long, or no opening left within the days ahead
no_deviceThe customer had no device to ring

Your webhooks get call_declined, call_missed and call_expired beside the call's own events, and every rung call is in Call History.

Errors

codeWhen
scheduling_offUsers, from your app is off
too_soonSooner than With at least this much notice allows
too_farFurther ahead than Booked at most this far ahead
outside_windowThe time the customer chose is outside the agent's calling window
too_many_pendingThe customer already has At most this many upcoming calls per user booked
identity_requiredBooking for a customer needs their identifier
device_limitThis install is not one of the customer's devices
not_foundCancelling a call that is not theirs, or does not exist
invalid_requestA time without its offset, a reason over 120 characters, or another malformed field
rate_limitedToo many bookings from this install — honour Retry-After
unavailableGraine could not take the booking just now — try again

Troubleshooting

What you seeCheck
The agent never offers a call backThe agent, during a conversation is off, or the prompt never says when to offer one
Calls end no_deviceHosted ringing is not set up, or the app never registered the device — Hosted ringing
A call rang later than bookedIt fell outside the customer's hours or in quiet hours, and moved to the next opening
A call expiredIt was held for credit or an Off agent for more than 10 minutes, or no opening was left
A customer was not rung after decliningBy design: nothing rings within 6 hours of a decline

Where next

On this page