Tutoring parent updates over iMessage from your program's own number
ZeroSettle lets a tutoring center or music school send parents session recaps, worksheet photos and schedule changes over iMessage from the program's own number, from $49/month on Pro. Tutors' personal numbers stay private, and parents see the program's name and photo instead of a bare number. Each parent texts the number once at enrollment, so every later update is part of an ongoing conversation that never counts toward the daily new-contact limit. A schedule change to 120 families goes out one message at a time and takes about 4–10 minutes.
Key takeaways
- What parents get: blue-bubble recaps, worksheet photos and schedule changes from one program number that shares the program's name and photo.
- Who it fits: tutoring centers, test-prep companies, music schools and after-school programs whose parents mostly use iPhone.
- Price: Pro is $49/month for one number to start, with unlimited messages with people who message you first. Growth, for several numbers working as one, is from $599/mo. There is no per-message fee.
- Main limit: a number sends one message at a time, normally 2–5 seconds each. Parents who texted first never count toward Pro's 5 new contacts a day.
- Unanswered rule: on every plan, after 2 unanswered messages to a parent, a third is refused until they reply, and a tapback counts as a reply.
- What it does not do: no group chats, no SMS fallback for Android families and no read status in the API. Text parents and guardians, never minors.
Who uses iMessage for parent updates?
Tutoring centers, test-prep companies, music schools and after-school programs can use a ZeroSettle number to reach parents in Messages. 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.
- Unread email: a newsletter is easy to skip, while a two-line recap with a photo takes seconds to read.
- Quiet churn: families drop out without warning. A weekly thread shows the coordinator which families have gone quiet.
- Personal numbers: tutors' numbers end up in parents' phones and leave with the tutor. A program number keeps every thread in the program's console.
Programs that need to text students, run a class group chat or reach many Android families should read when ZeroSettle is not a fit. More workflows are in 50 ways businesses use iMessage.
How iMessage for parent updates works, step by step
The parent starts the thread at enrollment. Tutors and coordinators then work in that thread, and your code sends schedule changes family by family.
- Enrollment. The confirmation page has an
sms:link with a prefilled message. The parent taps Send, so the program is a known sender from the start: links in its later texts are tappable, and its replies avoid Apple's Unknown Senders filter, which screens senders a person hasn't interacted with. ZeroSettle shares the program's name and photo with the first reply, and that reply should also say who is writing. - After each session. The tutor sends a two-line recap and a worksheet photo (up to 5 MB) from the console. ZeroSettle re-encodes HEIC photos and anything over 2048 px to JPEG. Photos go only to parents who have replied, which every parent who enrolled through the link has.
- Reschedules. The parent replies, and the coordinator, or any teammate invited to the console, confirms in the same thread. A signed webhook can also pass each reply to your scheduling system as
message.received, about 1–2 seconds after the line gets it. - Schedule changes. "No class Monday, holiday" goes out through
POST /api/imessage/send, one call per family, the same one-at-a-time loop used to offer open shifts. A number sends one message at a time, normally 2–5 seconds each, so 120 families take 4–10 minutes. - Privacy and branding. Tutors never hand out their own numbers. Every update comes from the program's number under one name (up to 64 characters) and one photo, such as the logo (a JPEG or PNG under 3 MB), set in the console (what parents see).
- Several numbers. A larger program can split families across several numbers (Growth includes 3+, and Pro can add numbers), for example by giving each campus's enrollment link its own number. Numbers in one line group share one name and photo, and each family always hears from the number its conversation is on. A second group can carry its own name, such as the music program's.
Example conversation: parent updates
A weekly recap, a worksheet photo and a reschedule in one family's thread:
- Tue 6:40 PM
- Quillmark Tutoring: Hi Mrs. Chen! Weekly update for Ethan: he nailed fractions this week, 9/10 on the practice set.
- Quillmark Tutoring: Photo: Ethan's fractions worksheet❤️
- Parent: that's amazing, he was so stuck last month. Can we move Thursday to Friday?
- Quillmark Tutoring: Friday 4:30 with Mr. Cho works. Booked 👍
The parent's ❤️ on the photo arrives as a reaction.received event, and it counts as a reply for the unanswered-message rule below. Your own code can send photos and tapbacks through the API too.
Setup: an enrollment sms: link and family-by-family sends
A tutoring program needs an sms: link on the enrollment confirmation page and a short script for schedule changes. Recaps and reschedules happen in the console and need no code.
The enrollment link
<a href="sms:+18055550100&body=Hi%20Quillmark!%20Updates%20for%20enrollment%20E4821%20please">
Text us for session updates
</a>
Use an opaque enrollment code, not the student's name, and print the same link as a QR code on paper forms. On Android the link opens the SMS app, so keep email for those families. Placement ideas are in how to get customers to text you first.
The schedule-change script
# holiday_notice.py: tell each enrolled family about a schedule change, one family at a time
import os, time, requests
BASE = "https://portal.zerosettle.io"
TOKEN = os.environ["ZEROSETTLE_TOKEN"]
FAMILIES = [("+18055550123", "Ethan"), ("+18055550124", "Maya")] # your roster: (parent's number, student's first name)
def send(to: str, text: str) -> str:
while True:
r = requests.post(f"{BASE}/api/imessage/send",
headers={"Authorization": f"Bearer {TOKEN}"},
json={"to": to, "text": text}, timeout=90)
if r.status_code == 200:
return "sent"
code = r.json()["error"]["code"]
if code != "line_busy":
return code # e.g. recipient_opted_out: never retry
time.sleep(2) # one send at a time per line; retry after 2 s
for parent, student in FAMILIES:
result = send(parent, f"Quillmark: no session for {student} on Monday, Oct 12 (holiday). "
"Reply here if you'd like to make it up another day.")
if result != "sent":
print(parent, result) # follow up with these families another way
Each call returns once the line hands the message to Apple. If a tutor sends from the console while the script runs, the two sends queue behind each other, and one that waits about 12 seconds returns line_busy, which the loop retries after 2 seconds. Every family gets its own message, so no parent sees another family's number. The send reference in the docs lists the send error codes.
Limits and consent for parent updates
Parent updates rarely hit ZeroSettle's new-contact limit, because each parent texts the program first. What matters is send speed and the unanswered-message rule.
| Situation | Pro | Growth |
|---|---|---|
| New-contact limit, parent texted at enrollment | Never counts | Never counts |
| New-contact limit, program texts a family first | 5 a day | 50 a day, 3 per 15 min |
| Unanswered messages to one parent | 2, then 403 awaiting_reply | 2, then 403 awaiting_reply |
| Sending | One at a time, normally 2–5 s each | One at a time per number, normally 2–5 s each |
Source: ZeroSettle iMessage API docs, "Errors, limits, and compliance".
The limit math for one term
- Fall enrollment, 60 new families: none count if they use the enrollment link. If the coordinator texts them first instead, Pro's 5 a day means twelve days to reach all 60 (Growth's 50 a day, two days), and links in those first texts aren't tappable until each parent replies.
- The unanswered-message rule: a recap and its photo sent within 5 minutes count as one message, and a holiday notice is a second. If the parent hasn't replied, next week's recap is refused with
403 awaiting_replyuntil they reply, and a tapback counts. This applies on Pro and Growth.
Parents and guardians only
Text only parents and guardians who gave you their number at enrollment for these updates, never minors, and keep the enrollment record. ZeroSettle's terms say content sent through the service "may not be encrypted" and that ZeroSettle "cannot guarantee communication privacy", so share only the grades and details a parent needs. A summer-camp offer is promotional: send it only to parents who agreed to hear about programs, and never before 8 am or after 9 pm in the family's time zone. Consent rules vary by place and situation; this isn't legal advice, so check your enrollment forms with counsel.
"We'll stop Thursdays" is an opt-out
Any text with the word STOP in it, or a clear request like "take me off your list", opts that parent out of every number on your account, so "we'll stop Thursdays for the summer" does too. Sends to them then return 403 recipient_opted_out until they text START on its own as the whole message. If they ask to resume some other way, ZeroSettle can clear the opt-out (how STOP works).
When ZeroSettle is not a fit for parent updates
ZeroSettle is the wrong tool for a tutoring program in these cases:
- You need to text students who are minors. Don't. Text the parents and guardians who opted in, and let the recap say what the student worked on. An adult student, such as an 18-year-old in test prep, can opt in with their own number like any other adult.
- You want a class group chat. There are no group chats. Every thread is one family and the program.
- Many families use Android. iMessage reaches iPhone and other Apple products, while Android phones get RCS or SMS. ZeroSettle has no SMS fallback. You can check whether a number is on iMessage before texting it, and the check sends nothing.
- Emergency closures must reach everyone instantly. A 120-family notice takes minutes and misses Android families. Keep your existing alert system.
- You need proof each parent read a policy change. The API reports
message.sentandmessage.failed, not read status.
For one-to-one work with adult clients, see coaching client check-ins.
How much does iMessage for parent updates cost?
A tutoring program pays the monthly plan price and nothing per message. Messages in both directions are unlimited: the console counts them but never caps them.
| Plan | Price | Fits |
|---|---|---|
| Pro | $49/month | One number to start, 5 new contacts a day, unlimited messages with people who message you first, self-serve, no setup fee |
| Growth | From $599/mo | 3+ numbers working as one, dedicated support, set up after a demo |
Both plans are billed monthly with a 30-day money-back guarantee on the subscription. Compare plans or get a number.
Frequently asked questions
Can both parents get the updates?
Yes, as two separate threads. There are no group chats, so each parent taps the enrollment link on their own phone and gets their own copy of each recap. A parent who uses iMessage with an email address, on an iPad for example, can be reached at that address.
Can several tutors answer from the same number?
Yes. The account owner invites teammates to the console, and they all see and answer the same conversations from the program's number.
Will parents see the tutor's name?
No, they see the program's name and photo, and iOS can show the program as "Maybe: Quillmark Tutoring" before they save the number. The exact display depends on their phone and contact settings. Tutors can sign recaps with their first name.
What happens to a family's thread when a tutor leaves?
Nothing changes for the family. The conversation is on the program's number, ZeroSettle keeps messages indefinitely for now, and the next tutor picks up the same thread in the console.
Sources
- ZeroSettle iMessage API docs: "Send a message", "Attachments", "Customer support" (the
sms:link), "More than one number" and "Errors, limits, and compliance". Checked October 8, 2026. - ZeroSettle plans and FAQ, zerosettle.io: Pro and Growth prices and inclusions, and how the business name appears. Checked October 8, 2026.
- ZeroSettle iMessage API Terms of Service, section 13 (engagement privacy disclaimer). Last modified September 28, 2026.
- What is the difference between iMessage, RCS, and SMS/MMS?, Apple Support. Checked October 8, 2026.
- View conversations from unknown senders in Messages on your iPhone, Apple Support. Checked October 8, 2026.