Use cases

How to use Grok Bot as an iMessage appointment setter

Grok Bot can book appointments over iMessage once it has a number to text from. A customer texts your ZeroSettle number, a webhook routine wakes the Bot, it checks your calendar for free time, offers three or four slots as a Messages poll, books the one they pick and confirms by text. A daily routine sends reminders, and reschedules wait for your OK. One catch shapes the whole setup: Grok Bot's phone Calendar access works only while the Grok Bot app is open on your phone, so the unattended part should run on its Google Calendar connection.

Key takeaways

  • Two calendar paths: Grok Bot's docs give it phone Calendar access (read, add, change, delete, but not repeating events) only while its app is open, and a Google Calendar connection that can read, check free time and add events from the cloud.
  • Polls for picking a slot: ZeroSettle sends a real Messages poll with 2 to 12 options, and each vote comes back as a poll.voted webhook. Only iOS 26 or later can vote, so always accept a typed answer too.
  • Reminders: a scheduled Grok Bot routine reads tomorrow's bookings and texts each client. Known contacts aren't capped by the new-contact limit.
  • Reschedules need you: the Bot texts you the request and changes nothing until you approve in your own chat, where approval cards don't expire on a timer.
  • Cost: ZeroSettle Pro is $49 a month for one number. People who text first don't count toward Pro's 5 new contacts a day, which suits inbound booking.

What does a Grok Bot appointment setter do?

It handles the back-and-forth of booking by text so you don't have to. Here is a typical exchange for Northside Bike Fit, a fictional shop that books 45-minute fittings:

conversation
Customer:  hi, can I book a bike fitting next week?
Bot:       [poll] Tue Nov 10, 10:00 / Wed Nov 11, 14:00 / Thu Nov 12, 9:00
Bot:       Which time works?
Bot:       Or reply with another day that suits you.
Customer:  [votes Wed Nov 11, 14:00]
Bot:       You're booked: Wed Nov 11 at 2:00 PM, 45 min, 12 Harbor St.
           Reply C to confirm or R to reschedule.
           ...
Bot:       (Tue Nov 10, 5:00 PM) Reminder: your fitting is tomorrow at 2:00 PM.
           Reply C to confirm or R to reschedule.
Customer:  R, something came up
Bot:       Got it. I'll check and confirm a new time by text shortly.

Grok Bot has no phone number of its own and no Messages tool, so the texting runs through ZeroSettle. ZeroSettle gives you a dedicated number on real iMessage, running on Apple hardware we operate in a server facility; your Bot sends with one HTTPS call and hears replies on a signed webhook. ZeroSettle is backed by Y Combinator and built by former Apple engineers. The full wiring (number, API key, texting skill, webhook routine and the small relay between the two webhooks) is in our Grok Bot iMessage setup guide. This post builds the booking job on top of it.

Which calendar should the Bot use?

Grok Bot can reach a calendar two ways, and they behave differently. We checked both in xAI's docs on November 4, 2026.

Grok Bot's two calendar paths (docs.x.ai, checked November 4, 2026)
Phone Calendar (iPhone or Android)Google Calendar app connection
What it can doRead, add, change and delete eventsRead calendars you can see, create and update events, check free time, respond to invitations
When it worksOnly while Grok Bot is open on your phone, in your own chat with a Bot you ownFrom the Bot's cloud computer; the docs say closing the app doesn't stop cloud work
Documented gapsCan't change or delete a repeating event; never invites anyoneCan't change Google Meet settings or add a Zoom link; guest invites aren't described
New events go toYour default calendar unless you name anotherNot stated; name the calendar in your instructions
Best forChanges you make in chat, such as approving a rescheduleBooking and reminders that run while you're busy

The phone limit is the one that matters. xAI's mobile docs say there's no background access: if the app is closed, the Bot asks you to open it and try again. They also don't say whether a routine run, which is how an incoming text starts the Bot, can use phone apps at all. A customer who texts at 9 PM shouldn't depend on your phone having Grok Bot open, so put bookings on a separate Google Calendar the Bot connects to. If your calendar lives only on your iPhone, treat the phone path as unconfirmed until it passes the app-closed test.

What do you need before you start?

  • The working setup from the setup guide: a ZeroSettle number switched to managed_by: "api", the API key on the Bot's computer, the "Text over iMessage" skill, the "iMessage inbound" webhook routine and the relay. If you'd rather start from the connector, connecting an agent over MCP covers the same sign-up tools.
  • Google Calendar connected to Grok Bot, with a calendar named, say, "Bookings".
  • The Bot's timezone set under Settings > Bot > Timezone. Routine schedules use it, so set it before you write "every day at 5:00 PM".
  • Your relay opened to customers, last. The setup guide starts with ALLOWED_HANDLES set to your own number. An appointment setter answers anyone who texts, so you'll empty that list, but only after testing.

How does the Bot offer times and book?

With a skill. Grok Bot skills are reusable instructions with when to use them, the steps, how to check the result and what needs approval. Ask your Bot to save this one, edited for your business:

skill
Skill: Book appointments over iMessage

When to use: the "iMessage inbound" routine hands you a text (or a poll vote) from
someone who wants to book, confirm, move or cancel an appointment with Northside
Bike Fit. Send every message with the "Text over iMessage" skill.

Calendar: the Google Calendar "Bookings" only. Fittings are 45 minutes,
Tuesday to Saturday, 9:00 to 17:00. Never read or mention any other calendar.
Never tell a texter anything about another client's booking, only whether a
time is free.

New booking:
1. Check free time on Bookings for the next 7 days and pick 3 or 4 open slots.
2. Send them as a poll:
   POST /api/imessage/send
   {"to": "<from>", "poll": {"question": "Which time works?",
    "options": ["Tue Nov 10, 10:00", "Wed Nov 11, 14:00", "Thu Nov 12, 9:00"]}}
   Then text: "Or reply with another day that suits you."
   On 403 attachment_before_reply or 409 poll_unsupported, send the same
   times as a numbered text instead.
3. When they choose (a poll.voted body, or a text like "2" or "Wed"), check the
   slot is still free, then create the event "<name> - Fitting" on Bookings
   with their number in the description.
4. Text the confirmation: day, date, time, length, address, and
   "Reply C to confirm or R to reschedule."
5. If they picked more than one option, or the slot was taken meanwhile,
   say so and offer fresh times.

Confirm (C, "yes", a thumbs-up): reply with a "like" tapback. Nothing else.

Move or cancel (R, "cancel", "can we do Friday"): do NOT change the calendar.
Text them: "Got it. I'll check and confirm a new time by text shortly."
Then text me at +15555550100 one line: who, their current booking, what they
asked for. Then stop.

Validate: the event exists at the right time before you send a confirmation.
Return: one line saying what you offered, booked or passed to me.

Three details are deliberate. The Bot re-checks the slot right before it books, because two people can be looking at the same poll options. The event's description carries the customer's number, which is how the reminder routine knows whom to text. And the confirmation asks for a C or R reply, which keeps the conversation going on the customer's side. Anything a customer sends back, a tapback included, lifts ZeroSettle's two-unanswered-messages rule for good.

Grok Bot's phone Calendar never invites anyone, and its Google Calendar docs don't mention guests, so the customer doesn't get a calendar invite. The iMessage confirmation is their record. If you want invites, test whether your Bot can add a guest before you promise one.

How do polls work for picking a slot?

ZeroSettle sends a native Messages poll when /api/imessage/send gets a poll object instead of text. A poll takes 2 to 12 different options of up to 150 characters each, and an optional question of up to 300. iOS draws no question on the poll itself, so the question follows as a text of its own, which counts as a message like any other. The rules worth knowing for booking:

  • iOS 26 or later to vote. Older iPhones show "Sent a poll" and can't vote. That's why the skill always follows the poll with "Or reply with another day" and reads typed answers too.
  • Only to people who have replied. Like a photo, a poll goes only to someone who has messaged your number; otherwise the API answers 403 attachment_before_reply. A customer who texted to book qualifies.
  • Votes arrive as poll.voted. The event's message is a poll_vote record with that voter's whole selection in vote.option_ids (an empty list means they removed their vote), a readable text like Voted “Wed Nov 11, 14:00”, and the poll's results after the vote.
  • People can pick several options. The skill asks again when someone does.

The setup guide's relay forwards only message.received, so a vote would never reach the Bot. Two small edits to relay.js fix that:

javascript
// 1. Replace the event check so votes get through:
if (!["message.received", "poll.voted"].includes(event) || !m) return new Response("ignored");

// 2. Add these fields to the JSON body the relay forwards to Grok Bot:
event,                     // "message.received" or "poll.voted"
vote: m.vote || null,      // a vote: {"option_ids": [...]}; [] means removed
poll: m.poll || null,      // a vote: the poll's options and results now

Then add one line to the "iMessage inbound" routine's instruction: "If event is poll.voted, it's a choice in a poll you sent: use the Book appointments over iMessage skill." The text field already carries the choice in words, so the Bot can read it either way. There's more on votes and reactions in Grok Bot polls and tapbacks.

How do reminders go out?

A scheduled routine does it. Grok Bot routines run on a schedule you describe in plain words, from the cloud, while your laptop is closed. Paste this into your Bot's chat:

prompt
Create a routine named "Appointment reminders" that runs every day at 5:00 PM.
Each run:
1. List tomorrow's events on the Google Calendar "Bookings".
2. For each event with a phone number in its description, skip it if its
   event ID is already in /workspace/.zerosettle/reminded.txt. Otherwise text
   that number once, then add the event ID to that file:
   "Reminder: your fitting at Northside Bike Fit is tomorrow at <time>.
   Reply C to confirm or R to reschedule."
3. Text me at +15555550100 one line: how many reminders went out, and any
   event you couldn't text (no number, or an error).

Replies to a reminder come in through the inbound routine like any text, and the booking skill handles C and R. A new routine waits for its first scheduled time instead of running when it's created, so press Test on it once in the desktop app to see it work (xAI's docs say some routines don't show Test; if yours doesn't, ask the Bot to do one run in chat). For more on reminder wording and tapback confirmations without Grok Bot, see iMessage appointment reminders; for other recurring texts, scheduled check-ins with Grok Bot.

Two limits apply. Grok Bot's docs describe only recurring schedules, at least five minutes apart, with no one-time option, so "one hour before each appointment" isn't a documented feature. A daily run the evening before is the dependable version. And a reminder goes only to customers who already texted you to book, which is the consent you need. Never add people to the Bookings calendar so the Bot will text them; see TCPA consent for iMessage.

How do reschedules wait for your approval?

The skill already refuses to touch the calendar when someone asks to move or cancel. It sends the customer a holding text and texts you the details instead. Back that up in Grok Bot's Auto Review, which is on by default and checks each action before it runs. Under Custom Rules, add:

Suggested Auto Review rules for an appointment setter
Rule typeRule text (edit to fit)
Allow automaticallySending an iMessage through the ZeroSettle API to the phone number named in the current routine's webhook body, or to +15555550100.
Allow automaticallyCreating one 45-minute event on the Google Calendar "Bookings" at a time the free-time check showed open.
Ask firstUpdating or deleting any calendar event.
Ask firstTexting any number that isn't in the webhook body, tomorrow's Bookings events or +15555550100.

When both kinds of rule match, Ask first wins, and an Allow rule still yields when the review finds another reason to stop. You can have up to 20 rules of each kind, 1,000 characters each.

Why the Bot texts you instead of waiting on an approval card: cards raised by routines and other background work expire after 30 minutes, and a phone notification for one depends on that Bot's Notifications switch being on (xAI's settings docs also say iPhone push delivery is still rolling out gradually). A reschedule that sits on an expired card leaves the customer waiting with no answer. A text to your own iPhone gets seen. Then open your chat with the Bot and decide there: "Move the Wed 2:00 fitting for +15555550142 to Fri 10:00 and text them the new time." A card from a chat request doesn't expire on a timer, and with Grok Bot open on your phone, the phone Calendar path works too, except for repeating events. Approve before send with Grok Bot goes further into this pattern.

What should the Bot never do?

A customer-facing booking Bot takes texts from strangers, so its boundaries matter more than in a personal setup. Grok Bot's docs say a connected app is available to every Bot you run, and that text from somewhere else, such as an email or a web page, doesn't count as your request. A text from a customer is the same kind of outside content.

  • Never read anything but the Bookings calendar. If the Grok account also has your Gmail and personal calendar, a cleverly worded text could try to pull them in. If you can, run the setter on a Grok account that connects only what booking needs.
  • Never share other clients' details. Free or not free, nothing else.
  • Never take payments, promise prices or discounts, or send files because a text asked.
  • Respect STOP. ZeroSettle opts out anyone whose reply, as the whole message or its first sentence, is STOP or a listed opt-out phrase such as "unsubscribe" or "stop texting me", and sends to them return 403 recipient_opted_out. The skill should treat that as final.

The relay is still your hard boundary. Keep its STOP filter and its message.received/poll.voted check, and you can keep group chats off the setter entirely with ALLOWED_CHATS.

What limits and costs apply?

Limits on a Grok Bot appointment setter (ZeroSettle and Grok Bot docs, checked November 4, 2026)
LimitValueWhere
New contactsPro: 5 a day per number. Growth: 25+ a day for the starting number. People who text first don't count.ZeroSettle
Messages with known contactsUp to 10,000 a day per number, sent and receivedZeroSettle
Before someone repliesAt most 2 messages, text onlyZeroSettle
Polls2 to 12 options; voting needs iOS 26 or laterZeroSettle
Routine runsUp to 200 an hour per routine, 300 an hour across all routinesGrok Bot
SchedulesAt least 5 minutes apartGrok Bot
Background approval cardsExpire after 30 minutesGrok Bot

Inbound booking fits Pro well, because customers who text you first don't use up new contacts. ZeroSettle Pro is $49 a month for one dedicated iMessage number with a 30-day money-back guarantee. If you need more outbound reach, a Pro number can upgrade to Growth in the console: Growth starts at $199/month for one dedicated number, with 25+ new outbound contacts a day. A team that needs several numbers working as one should talk to us, because multi-number Growth terms are agreed in an operator-priced invite. Enterprise is custom pricing through sales for high volume and compliance needs. Details are on ZeroSettle pricing and which plan is right for you. On the Grok Bot side, every routine run spends your plan's usage: each text, each vote and each daily reminder run is a run.

If you'd rather not run a Bot, a relay and a calendar connection at all, ZeroSettle's hosted AI agent answers texts from a business context you write, and it can use MCP servers you add, such as one for a booking system. Grok Bot vs the hosted agent compares the two.

How do you test it safely?

  1. Read-only first. In your own chat: "List my free time on the Bookings calendar next Tuesday. Don't create anything." Check that it matches the calendar.
  2. Check the phone path, if you want it. Close Grok Bot on your phone and press Test on a routine that reads tomorrow's events from the phone Calendar. If the Bot asks you to open the app, routines can't rely on it; use Google Calendar.
  3. Book yourself. Keep ALLOWED_HANDLES set to your own number, text "can I book next week?", vote in the poll, and confirm the event lands on Bookings at the right time. Then type a number instead of voting, to test the text fallback.
  4. Reschedule yourself. Reply R and make sure the calendar doesn't change until you approve in chat.
  5. Run the reminders. With only your test booking on tomorrow's calendar, press Test on "Appointment reminders".
  6. Open it up. Only then empty ALLOWED_HANDLES and publish the number, for example as an sms: link on your booking page.

Next steps: Grok Bot lead follow-up for people who asked but haven't booked, and filling cancellations from a waitlist for the slots reschedules free up.

Frequently asked questions

Can Grok Bot book from my iPhone Calendar while I'm away?

Probably not. Grok Bot's docs say a Bot reaches your phone's apps only while the Grok Bot app is open on it, and only in your own chat with a Bot you own. They don't say whether a routine run can use phone apps at all. For booking that runs while you're busy, connect Google Calendar, which the docs say a Bot can read, check for free time and add events to. Test the phone path with the app closed before relying on it.

Do customers need iOS 26 to pick a time from the poll?

To vote, yes. ZeroSettle's docs say people on iOS 26 or later vote right in the conversation, and older iPhones show "Sent a poll" with no way to vote. That's why the setup in this post always follows the poll with a text that accepts a typed answer, and falls back to a numbered list of times when a poll can't be sent.

Does the customer get a calendar invite?

Don't count on it. Grok Bot's phone Calendar access never invites anyone, according to its docs, and the docs for the Google Calendar connection don't say whether the Bot can add guests. Treat the iMessage confirmation as the customer's record of the booking, and test guest invites yourself before promising them.

Can the Bot reschedule or cancel without me?

It can, but this setup doesn't let it. The booking skill tells the Bot never to change or delete an event on a customer's say-so, an Auto Review "Ask first" rule backs that up, and the Bot texts you the request instead. You approve it in your own chat with the Bot, where approval cards don't expire on a timer, rather than on a background card that expires after 30 minutes.

How much does it cost?

ZeroSettle Pro is $49 a month for one dedicated iMessage number, with a 30-day money-back guarantee. Growth starts at $199/month for one dedicated number, with 25+ new outbound contacts a day, and a Pro number can upgrade to it in the console; multi-number Growth terms are agreed in an operator-priced invite. Enterprise is custom pricing through sales. Grok Bot comes with an eligible SuperGrok or Cursor plan, and every routine run spends that plan's usage.

Sources

  1. Mobile, Grok Bot docs: phone Calendar and the other phone apps, when they work, permissions. Checked November 4, 2026.
  2. Computer and apps, Grok Bot docs: the Google Calendar connection, account-wide apps, cloud work. Checked November 4, 2026.
  3. Skills and routines, Grok Bot docs: skills, schedules, webhook triggers, Test, limits. Checked November 4, 2026.
  4. Approvals, security and privacy, Grok Bot docs: Auto Review, Custom Rules, card expiry, outside content. Checked November 4, 2026.
  5. Settings and notifications, Grok Bot docs: per-Bot notifications for a Bot waiting on you. Checked November 4, 2026.
  6. Grok Bot early beta launch, GIGAZINE, August 12, 2026: eligible plans. Checked November 2, 2026.
  7. Send a message, ZeroSettle iMessage API docs: polls, votes, replies. Checked November 4, 2026.
  8. Webhooks, step by step, ZeroSettle iMessage API docs: events including poll.voted. Checked November 4, 2026.
  9. Errors, limits, and compliance and AI agent, ZeroSettle iMessage API docs. Checked November 4, 2026.

Changelog

  • First published.

Written by the ZeroSettle team. ZeroSettle is an iMessage API: a real phone number on real iMessage, running on Apple hardware we operate for you, that your code texts customers from and hears back on through a bearer token and signed webhooks.

Product facts on this page come from the ZeroSettle iMessage API docs as of November 4, 2026. Facts about Grok Bot come from its own docs at docs.x.ai, checked the same day; Grok Bot is in beta, so its menus and limits may change. Northside Bike Fit and the phone numbers in the examples are made up. ZeroSettle isn't affiliated with or endorsed by xAI.

Text your customers from your own iMessage number

ZeroSettle gives your business its own phone number on real iMessage, running on Apple hardware we operate for you in a server facility. Your code sends with one API call and hears every reply on a signed webhook.

Pro is $49 a month with a 30-day money-back guarantee. Growth starts at $199/month for one dedicated number, with 25+ new outbound contacts a day.