Use cases

Real estate lead follow-up over iMessage from a business number

ZeroSettle lets a real estate agent or team answer listing inquiries on iMessage from a business number instead of a personal phone. Yard-sign QR codes let buyers text first, and form leads with consent to texts get a link-free opener about that exact home within seconds. After the buyer replies, the agent sends listing photos, a 30-second voice walkthrough and the showing calendar. Pro ($49/month) allows 5 new contacts a day; teams on Growth give each agent a line group with their own name and headshot.

Key takeaways

  • What it is: 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.
  • The real estate flow: buyers text first from a yard-sign QR code, or your code sends a link-free opener to a form lead with consent; photos, a voice walkthrough and the showing link follow the reply.
  • Price: Pro is $49/month for one number, with no setup fee. Growth, for several numbers working as one, is from $599/mo.
  • Main limit: new contacts per number: Pro 5 a day; Growth 50 a day and 3 per 15 minutes. Buyers who text first never count.
  • What it does not do: no SMS fallback for Android buyers, no porting of your cell number, no group thread with co-buyers, and no built-in CRM integration beyond Close.

Who uses iMessage for real estate leads?

iMessage lead follow-up fits solo agents, real estate teams and small brokerages with buyer inquiries from portals, their website and yard signs. The portal's auto-email is easy to ignore, and an agent who texts buyers from a personal phone keeps listing threads between family ones.

A ZeroSettle number moves those threads to a business line showing the agent's or team's name and photo. It does not fit purchased lead lists, which the terms forbid texting without consent, or Android-heavy markets (see when ZeroSettle is not a fit). More industries: 50 ways businesses use iMessage, closest being car dealership leads.

How iMessage for real estate leads works, step by step

There are two ways in: the buyer texts first from a QR code, or your code texts a form lead who gave consent. Prefer the QR route: a buyer who texts first never counts against ZeroSettle's limits and can tap every link you send.

  1. Text-first. The sign rider and flyer box carry a QR code that opens Messages to your ZeroSettle number with “I'm interested in 22 Oak St (ref 2207)” prefilled; the listing page carries a Text button with the same link. The buyer points the iPhone Camera at the code, taps the link that appears, and taps Send.
  2. Your server gets it as a signed message.received webhook event about 1–2 seconds after the line receives it, and reads the ref to find the listing and agent.
  3. Form leads. When a portal or website lead arrives with a mobile number and consent to texts, your code, triggered by the CRM, calls POST https://portal.zerosettle.io/api/imessage/send with a link-free opener naming the agent and the home. A link would show as plain text (why first links aren't tappable), and Screen Unknown Senders (iOS 26 and later) can hide a cold text.
  4. After the buyer replies, send listing photos (image_b64, up to 5 MB, captioned), a 30-second voice walkthrough (audio_b64, up to 6 MB, a native voice bubble) and the showing calendar link, now tappable.
  5. Or let the hosted AI agent answer (Beta, no code). On a line group set to Managed by AI Agent, it answers price, HOA and open-house questions from your business_context, with goal demo_booked and your showing calendar as the link. Form leads start there with POST /api/imessage/agent/start, and inbound texts skip your webhook. You can't reply yourself on that group: sends return 403 managed_by_zerosettle.

ZeroSettle's docs say the hosted agent never invents facts the business context doesn't give, so include list price, HOA dues and open-house times. The Fair Housing Act prohibits housing discrimination because of race, color, national origin, religion, sex, familial status or disability, so have the hosted agent stick to listing facts and, in the business context, send neighborhood questions to a call with you.

On Growth, each agent's line group carries their name and headshot, and their signs carry their number; webhook events carry the line_id, so your code routes each reply to the right agent. A team can run the hosted agent on one shared group, such as the office sign number, while agents' groups stay managed by API.

Example conversation: real estate leads

This thread starts from a yard-sign QR code, so the agent's number is a known sender from the first message.

  1. Today 5:48 PM
  2. Buyer: Hi, I'm interested in 22 Oak St (ref 2207)
  3. Jen Alvarez Realty: Hi! Jen here, the listing agent. It's still available. Are you pre-approved yet, or just starting to look?
  4. Buyer: Pre-approved, hoping to move by spring
  5. Jen Alvarez Realty: Voice message, 0:32
  6. Jen Alvarez Realty: Photo: the renovated kitchen
    That's the kitchen they just redid.
  7. Jen Alvarez Realty: I have Saturday 11am or Sunday 2pm for a private showing.
  8. Buyer: Saturday 11 👍
Illustrative example with a fictional agent. Blue bubbles are sent from Jen Alvarez Realty's number through the API; gray bubbles are the buyer's. The buyer texted first, so nothing here counts as a new contact.

Setup: a QR route plus a CRM-triggered opener

The setup is a QR code per listing, a send call for form leads, and a webhook receiver that verifies ZeroSettle's signature and routes replies by ref. Each QR code encodes a prefilled sms: link, as in the docs' customer support section:

sms:+18055550100&body=I%27m%20interested%20in%2022%20Oak%20St%20(ref%202207)

Any QR generator turns that into a sign image (placement tips: getting customers to text first). The rest is one small service:

python
# leads.py: run with  uvicorn leads:app --port 8100
import base64, hashlib, hmac, json, os, re, time
import requests
from fastapi import BackgroundTasks, FastAPI, Request, Response

BASE = "https://portal.zerosettle.io"
TOKEN, SECRET = os.environ["ZEROSETTLE_TOKEN"], os.environ["ZEROSETTLE_WEBHOOK_SECRET"]
app = FastAPI()
seen: set[int] = set()                    # use your database in production

def verify(secret: str, header: str, raw_body: bytes, tolerance: int = 300) -> bool:
    try:
        parts = dict(p.split("=", 1) for p in header.split(","))
        t, v1 = int(parts["t"]), parts["v1"]
    except Exception:
        return False
    if abs(time.time() - t) > tolerance:
        return False
    expected = hmac.new(secret.encode(), f"{t}.".encode() + raw_body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, v1)

def send(to, line_id=None, **fields):     # None: ZeroSettle picks the line
    return requests.post(f"{BASE}/api/imessage/send", headers={"Authorization": f"Bearer {TOKEN}"},
                         json={"to": to, "line_id": line_id, **fields}, timeout=120).json()

def b64(path):
    with open(path, "rb") as f:
        return base64.b64encode(f.read()).decode()

def on_form_lead(lead):                   # called by your CRM; hold 9 PM to 8 AM leads until 8 AM
    if lead.get("text_consent"):          # else call or email
        r = send(lead["mobile"], lead.get("agent_line_id"),
                 text=f"Hi {lead['first_name']}, it's {lead['agent']} about {lead['address']}. "
                      "Are you pre-approved yet, or just starting to look?")
        return r                          # error.code "new_contact_limit": retry after error.retry_after_s

def notify_agent(msg, ref):               # your CRM; on Growth, msg["line_id"] names the agent's line
    print(msg.get("line_id"), msg["handle"], ref or "no ref: ask which home", msg.get("text"))

def walkthrough(to, line_id, home):       # after the buyer replies
    send(to, line_id, audio_b64=b64(home.voice_m4a), audio_format="m4a")
    send(to, line_id, image_b64=b64(home.kitchen_jpg), text="That's the kitchen they just redid.")
    send(to, line_id, text=f"Pick a showing time: {home.calendar_url}")

@app.post("/webhook")
async def webhook(req: Request, tasks: BackgroundTasks):
    raw = await req.body()
    if not verify(SECRET, req.headers.get("X-ZeroSettle-Signature", ""), raw):
        return Response(status_code=401)
    ev = json.loads(raw)
    m = ev.get("message") or {}
    if ev["event"] == "message.received" and m["id"] not in seen:   # retries repeat the id
        seen.add(m["id"])
        ref = re.search(r"\bref\s*(\d+)", m.get("text") or "", re.I)
        tasks.add_task(notify_agent, m, ref and ref.group(1))   # your CRM
    return Response(status_code=200)      # 2xx within 10 s

Register the receiver with PUT /api/imessage/webhook and store the secret, shown once (webhook steps). A buyer who deletes the prefill arrives without a ref, so ask which home. Set each group's name and headshot with PUT /api/imessage/profile?group=lg_… or in the console; for the CRM side, see connecting iMessage to your CRM.

Limits and consent for real estate leads

Only form leads use ZeroSettle's new-contact allowance, once each; buyers who text from a QR code never count.

ZeroSettle limits for lead follow-up, per number (API docs, checked October 12, 2026)
LimitProGrowth
New contacts per day (3 AM to 3 AM Eastern)550
New contacts per rolling 15 minutesNo separate cap (the daily 5 binds first)3
Unanswered messages to one buyer2, then 403 awaiting_reply
Buyers who texted first, ongoing threadsNot limitedNot limited

Source: ZeroSettle iMessage API docs, “Errors, limits, and compliance”. A new contact is a handle the line delivers a text, voice message or photo to first.

The limit math for one listing's first week

Take a new listing with illustrative numbers: 21 yard-sign texts, 34 open-house visitors who scan a door QR code instead of signing a paper sheet, and 28 form leads with consent to texts.

  • Sign and open-house texts: 55 conversations, 0 new contacts.
  • Form leads: up to 28 new contacts across the week; Pro allows 5 a day per number, so on a busy day the extras wait for the next day's reset (or the team moves to Growth); a form lead who already texted from the sign is an ongoing conversation, not a new contact.
  • Launch morning: if 12 leads land within 15 minutes, Pro sends the first 5 right away, one after another, and the other 7 get 429 new_contact_limit and wait for the 3 AM Eastern reset (retry_after_s says when). On Growth, sends that name one agent's line_id reach 3 new contacts per 15 minutes, so the twelfth goes about 45 minutes after the first.
  • Late leads: your code holds a 10:40 PM lead's opener until 8 AM; ZeroSettle's docs ask for nothing promotional before 8 am or after 9 pm in the recipient's time zone.
  • Quiet buyers: on either plan, a third unanswered text returns 403 awaiting_reply; ZeroSettle's docs warn that repeated texts to people who never answer are the fastest way to get a number flagged.

Consent comes first

Text a portal or website lead only when the form carried clear consent to texts, and keep the record. For marketing that generally means TCPA prior express written consent, which the FCC's rule defines as a signed written agreement that clearly authorizes the seller's ads or telemarketing messages to the number it names. ZeroSettle's docs put US damages for texting without prior express consent at $500 to $1,500 per message. Never text purchased lead lists. A buyer who texts first has asked for a reply. This isn't legal advice; have counsel review your consent language.

A text with the word STOP in it, or a clear request like “take me off your list”, opts the buyer out of every number on your account, even “Can I stop by Sunday?”. Call or email them; texting resumes only when they text START. More in the TCPA consent guide.

When ZeroSettle is not a fit for real estate leads

ZeroSettle is the wrong tool for real estate leads in these cases:

  • You'd text purchased lead lists without consent. ZeroSettle's terms forbid unsolicited messaging, and ZeroSettle suspends lines used for it.
  • You need SMS for Android buyers. There is no fallback: iMessage goes to an iPhone or another Apple device, and non-Apple phones get RCS or SMS/MMS instead (Apple). On Android the QR code opens the SMS app, so the sign needs a second way to reach you.
  • You want to keep texting from your personal number. ZeroSettle numbers are business numbers it assigns; porting isn't offered.
  • You want one thread with both co-buyers. Conversations are one-to-one; group chats aren't supported yet.
  • Your brokerage requires a specific compliance-archive integration. None is built in; build it on the webhook or GET /api/imessage/messages.

Comparing tools built for sales teams? See ZeroSettle vs Project Blue.

How much does iMessage for real estate leads cost?

Real estate lead follow-up costs the plan price, because ZeroSettle messages are unlimited (counted); the only extra is an AI credit pack if the hosted agent sends more texts than the plan includes.

ZeroSettle plans (zerosettle.io, checked October 12, 2026)
PlanPriceFits
Pro$49/monthA solo agent: one number to start, 5 new contacts a day, unlimited messages with people who message you first, self-serve, no setup fee
GrowthFrom $599/moA team: 3+ numbers working as one, a name and headshot per line group, 50 new contacts a day per number, after a demo

Both carry a 30-day money-back guarantee on the subscription. The hosted AI agent uses one AI credit per text it sends (Pro includes 1,000 a month, Growth 5,000; packs are 1,000 for $50 or 5,000 for $200). See ZeroSettle pricing, get a number, or read the AI agent docs.

Frequently asked questions

What happens to an agent's number when they leave the team?

The number stays on the team's ZeroSettle account and is never ported to the departing agent: ZeroSettle's terms keep numbers ZeroSettle's property and reclaim a number once its subscription ends. Give that line group the next agent's name and headshot, and buyers already in a conversation get the new card with the next message you send them.

Will buyers see my headshot?

Yes, once you set it as your number's photo (on Growth, your line group's): JPEG or PNG under 3 MB, ideally square and 600 px or larger. ZeroSettle shares it with the first message you send in each conversation, and the buyer can save it; the exact display depends on the buyer's device and contact settings.

Why didn't my first text get a reply?

The buyer may not have seen it. With Screen Unknown Senders on, texts from unknown senders go to another folder without a notification, and Apple's iPhone User Guide says later ones stay there until the buyer marks the sender as known or adds a contact. QR codes that let buyers text first avoid that.

Sources

  1. ZeroSettle iMessage API docs: “Your iMessage number” (more than one number), “Send a message”, “Attachments”, “Customer support”, “AI agent”, “Webhooks, step by step” and “Errors, limits, and compliance”. Checked October 8, 2026.
  2. ZeroSettle homepage: plans and prices. Checked October 8, 2026.
  3. ZeroSettle iMessage API Terms of Service: phone numbers and prohibited uses. Checked October 8, 2026.
  4. Scan a QR code with your iPhone camera, iPhone User Guide, Apple Support. Checked October 8, 2026.
  5. Screen and filter text messages on iPhone, iPhone User Guide, Apple Support. Checked October 8, 2026.
  6. What is the difference between iMessage, RCS, and SMS/MMS?, Apple Support. Checked October 8, 2026.
  7. 47 CFR § 64.1200, Delivery restrictions, paragraph (f)(9), the FCC's TCPA rule (Legal Information Institute, Cornell Law School). Checked October 8, 2026.
  8. Housing Discrimination Under the Fair Housing Act, U.S. Department of Housing and Urban Development. Checked October 8, 2026.

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, the zerosettle.io homepage and the iMessage API Terms as of October 12, 2026. Outside facts come from the pages listed under Sources, checked October 8, 2026. Jen Alvarez Realty, Sam P. and 22 Oak St are fictional, and this page is not legal advice.

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, for several numbers working as one, is from $599/mo.