An AI SDR that texts demo requests over iMessage in seconds
ZeroSettle's hosted AI agent (Beta) can work as an AI SDR for inbound demo requests: when a demo form comes in with a mobile number and text consent, your form handler calls POST /api/imessage/agent/start, and the agent texts the lead over iMessage within seconds, answers questions from your business context and sends your Calendly, Cal.com or Chili Piper link once they reply. Reps read every thread live in the ZeroSettle console. Pro ($49 a month) opens 5 new contacts a day per number, which suits a modest flow of inbound requests, not list prospecting; Growth (from $599/mo) opens 50 a day per number.
Key takeaways
- What it is: ZeroSettle's hosted AI agent (Beta) texting each consenting demo request from your company's own iMessage number, asking a qualifying question and sending your booking link after the lead replies.
- Who it fits: B2B SaaS founders and small sales teams whose "Book a demo" or pricing form asks for a mobile number and text consent.
- Price: Pro is $49/month for one number with 1,000 AI credits a month; Growth, for several numbers working as one, is from $599/mo with 5,000. Each text the agent sends uses one credit.
- Main limit: 5 new leads a day per number on Pro; 50 a day and 3 per rolling 15 minutes per number on Growth. Replies and ongoing conversations are not limited.
- What it does not do: there is no SMS fallback, reps cannot type into a thread the agent manages, and it is not for texting cold prospect lists.
Who uses iMessage for demo requests?
ZeroSettle's hosted AI agent, set up for demo requests, suits B2B SaaS founders and small sales teams with a "Book a demo" or pricing form that asks for a mobile number. 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 problem is the gap between the form and the first human touch: a Friday-afternoon request waits for a rep's Monday email, and the prospect cools off. A text sent while they are still on the thank-you page asks one qualifying question and keeps the booking link in a thread they will see again. It is not for cold lists (see when ZeroSettle is not a fit). It is one of 50 ways businesses use iMessage, alongside admissions follow-up on the same agent/start pattern and founder-led SaaS onboarding.
How iMessage for demo requests works, step by step
The hosted agent does the first touch and the qualifying; your form handler makes one API call per lead. The hosted AI agent explainer covers every setting.
- In the console's Messaging tab, or with
PUT /api/imessage/agent, switch the line group to Managed by AI Agent (Beta). Set your brand name and photo; ZeroSettle shares them with the first text of every conversation. - Write the
business_context(up to 40,000 characters): ideal customer, pricing, common objections, what the agent must never promise, and a couple of sample exchanges. - Set
goaltodemo_bookedwith your Calendly, Cal.com or Chili Piper page aslink. - Write a
first_messageof 1–3 link-free texts ending on a question: a link from a sender the lead has never texted shows as plain text they can't tap. The opener is sent exactly as written, so it can't include the lead's name, and it is the place to say the texts come from an automated assistant. - When the form comes in with a mobile number and text consent, your handler or a Zapier step calls
POST /api/imessage/agent/startwithtoandname. The opener leaves the line within seconds (a send normally takes 2–5). - When the lead replies, the agent answers everything since its last text in one go, up to three texts with the typing bubble first, and invites them to book with your link, which is tappable now that they have replied.
- If the lead goes quiet, a follow-up trigger has the agent text once more the next day; set to
afternoonin America/New_York (the default time zone), it lands between 1 and 3 PM Eastern. - Reps read every thread live in the console.
Example conversation: demo requests
The agent qualifies with one question, sends the link after the reply, and handles an objection from the business context.
- Fri 4:51 PM
- Business: Hi! This is Acme Ledger's automated assistant. Thanks for requesting a demo!
- Business: Quick question so we show you the right thing: are you closing books in QuickBooks or NetSuite today?
- Customer: NetSuite, about 40 entities
- Business: Multi-entity consolidation is where we save teams the most time. Want 20 minutes with a solutions engineer next week? book.example.com/acme-ledger
- Customer: do we have to move off netsuite?
- Business: No, Acme Ledger sits on top of NetSuite, so your ledger stays where it is.
- Customer: booked thursday
- Business: Great, see you Thursday!👍
Setup: agent config plus a form-handler call
Setup is one settings call plus one call per lead, with no webhook receiver: on a line group Managed by AI Agent, your webhook is not called. Field names follow the AI agent section of the ZeroSettle docs.
The agent answers only from the business context, so the example's claims, the qualification rules and the never-promise list go there:
You are Acme Ledger's automated assistant, texting finance leaders who
requested a demo and ticked the box to get a text about it. Acme Ledger runs
the multi-entity close on top of NetSuite or QuickBooks Online; multi-entity
consolidation is where it saves teams the most time.
Demo: 20 minutes with a solutions engineer. Fit: 3+ entities.
Fewer: point them to self-serve signup.
Pricing: per entity; the solutions engineer quotes it on the call.
"We're not leaving NetSuite": they don't have to; Acme Ledger sits on top.
Never promise discounts, roadmap dates, certifications or integrations
not listed here. Wants a person: priya@example.com.
Run configureAgent() once, then call onDemoRequest() from the form handler after the lead is saved:
// Node 18+; the token comes from the environment
import { readFile } from "node:fs/promises";
const BASE = "https://portal.zerosettle.io";
const headers = {
Authorization: `Bearer ${process.env.ZEROSETTLE_TOKEN}`,
"Content-Type": "application/json",
};
// Stand-ins: swap in your job queue and your sales alert.
const retryLater = (lead, seconds) => setTimeout(() => onDemoRequest(lead), seconds * 1000);
const alertSales = (lead, code) => console.error(`Demo text to ${lead.mobile} not sent: ${code}`);
export async function configureAgent() {
const res = await fetch(`${BASE}/api/imessage/agent`, {
method: "PUT",
headers,
body: JSON.stringify({
managed_by: "zerosettle",
personality: "professional",
business_context: await readFile("business_context.txt", "utf8"),
first_message: [
"Hi! This is Acme Ledger's automated assistant. Thanks for requesting a demo!",
"Quick question so we show you the right thing: are you closing books in QuickBooks or NetSuite today?",
],
goal: "demo_booked",
link: "https://book.example.com/acme-ledger",
timezone: "America/New_York",
triggers: [{
id: "followup", repeat: "once", after_days: 1, at: "afternoon",
instruction: "If they haven't booked a demo or replied to your last text, send one short, low-pressure follow-up that fits the thread. Otherwise send nothing.",
}],
}),
});
if (!res.ok) throw new Error(JSON.stringify(await res.json()));
}
const started = new Set(); // use your database in production
export async function onDemoRequest(lead) {
if (!lead.textConsent || !lead.mobile || started.has(lead.mobile)) return;
started.add(lead.mobile); // a resubmitted form would resend the opener
const res = await fetch(`${BASE}/api/imessage/agent/start`, {
method: "POST",
headers,
body: JSON.stringify({ to: lead.mobile, name: lead.firstName }),
});
if (res.ok) return;
const body = await res.json().catch(() => ({}));
const code = body.error?.code ?? body.status; // a failed send answers 502 {ok: false, status}
if (code === "recipient_opted_out") return; // they texted STOP: never retry
started.delete(lead.mobile);
if (code === "new_contact_limit") retryLater(lead, body.error.retry_after_s);
else alertSales(lead, code); // e.g. ai_credits_exhausted, not_managed
}
For a sales pipeline, note that every message in the conversation sets the follow-up again, so a lead who books and goes quiet would still be due one; the instruction tells the agent to send nothing then, and to write a follow-up that fits the thread instead of a fixed "still want that demo?". The afternoon window in America/New_York is 1 to 3 PM Eastern (10 AM to noon Pacific), inside the docs' 8 am to 9 pm window across the continental US. No code? A Webhooks by Zapier action (paid Zapier plans) can send the same POST; see iMessage automations with Zapier, n8n or Make.
Limits and consent for demo requests
Each lead counts once against ZeroSettle's new-contact limit, when the opener reaches them, and every agent text uses one AI credit. The rest of the conversation is not limited.
| Limit | Pro | Growth |
|---|---|---|
| New leads per day, per number (3 AM to 3 AM Eastern) | 5 | 50 |
| New leads per rolling 15 minutes, per number | — | 3 |
| Unanswered texts to one lead | 2 (opener texts sent together count as one), then 403 awaiting_reply | 2 (opener texts sent together count as one), then 403 awaiting_reply |
| AI credits included, per account | 1,000 a month | 5,000 a month |
- Credits: the example thread uses five: two for the opener and three for answers; the follow-up sends nothing because the lead booked. So Pro's 1,000 included credits cover about 200 such threads a month, and a $50 pack of 1,000 works out to about 25 cents a thread. A lead who never replies uses three: the opener's two and a one-text follow-up.
- Bursts: Pro opens 5 new conversations per number a day, and Growth at most 3 per number in any 15 minutes, so if a webinar brings 13 requests in five minutes, the ones past the limit get
429 new_contact_limitwithretry_after_sand wait in your queue. Make the calls one after another: a line sends one message at a time, and a send that waits behind others for about 12 seconds fails as busy.
Consent: text only leads who ticked an unchecked-by-default "Text me about my demo" box, store when they ticked it, and have the opener say who you are. A text with the word STOP, or a clear request like "take me off your list", opts the lead out of every number on your account (403 recipient_opted_out). ZeroSettle's docs ask that nothing promotional go out before 8 am or after 9 pm in the recipient's time zone; decide whether a midnight form gets its opener then or at 8 am. ZeroSettle's terms require disclosing AI interaction unless it is evident from context, which is why the example opener names an automated assistant; the agent also says so if sincerely asked. See the iMessage TCPA consent guide. This isn't legal advice.
When ZeroSettle is not a fit for demo requests
ZeroSettle is the wrong tool for demo follow-up in four cases:
- Outbound prospecting from scraped lists. Unsolicited messaging gets a line suspended; the new-contact limits are, in the docs' words, "a floor, not a licence".
- Leads mostly use Android or give desk numbers. Apple's support page says iMessage goes to an iPhone or other Apple device, while texts to non-Apple phones go as SMS/MMS or RCS. A ZeroSettle line reaches only numbers on iMessage, with no SMS fallback, so an Android or desk number gets nothing. Keep your email sequence.
- Reps need to reply inside the thread. On a line group Managed by AI Agent, API and console sends are refused with
403 managed_by_zerosettle. - Hundreds of demo requests a day. Pro opens 5 new conversations a day and Growth 50 per number; past that,
agent/startanswers429 new_contact_limitand leads wait for the 3 AM Eastern reset.
How much does iMessage for demo requests cost?
An AI SDR on ZeroSettle costs $49/month on Pro, which includes 1,000 AI credits; Growth is from $599/mo with 5,000. Each text the agent sends uses one credit.
| Plan | Price | AI credits included | Fits |
|---|---|---|---|
| Pro | $49/month, no setup fee | 1,000 a month | One number, 5 new leads a day, unlimited messages with people who message you first, self-serve |
| Growth | From $599/mo | 5,000 a month | Several numbers working as one, set up after a demo |
Packs add 1,000 credits for $50 or 5,000 for $200 and never expire; included credits don't carry over. The subscription has a 30-day money-back guarantee; packs don't. See ZeroSettle pricing or get a number.
Frequently asked questions
Does the TCPA apply to B2B demo leads?
It can. The statute's limit on automated calls covers "any telephone number assigned to a … cellular telephone service", with no exception for a number used for work, and the FCC's written-consent rule for marketing calls covers the same numbers. This page is not legal advice.
Can a rep take over a thread from the agent?
Not while the agent manages the line group. A rep can call the lead, or you can switch the group back to Managed by API: the agent stops answering every conversation on it, and reps can reply from the console.
Can the agent book leads onto different reps' calendars?
The agent sends one booking link per line group, set in link. To spread demos across reps, use a shared team booking page if your scheduling tool offers one and let it pick the rep.
Can these threads be logged in my CRM?
In Close, yes: connect it in the console (Settings → CRM → Close) and every message, the agent's included, is logged as an iMessage activity on the lead. Salesforce is coming soon. For another CRM, log threads with code you write; on an agent-managed group the webhook isn't called, so page through GET /api/imessage/messages?after_id=… instead (CRM logging).
What happens if AI credits run out mid-month?
ZeroSettle texts the number you sign in with at 20% left and again at zero. At zero the agent goes quiet, and agent/start sends nothing and returns 402 ai_credits_exhausted once fewer credits are left than the opener has texts. Leads' texts still reach the inbox; after a refill or a pack, a lead's next text gets a normal answer.
Sources
- ZeroSettle iMessage API docs: "AI agent", "Links in a first message", "Errors, limits, and compliance" and "CRM integrations". Checked October 12, 2026.
- ZeroSettle iMessage API Terms of Service, sections 4 (AI disclosure) and 13 (opt-in and prohibited uses). Last modified September 28, 2026.
- 47 U.S. Code § 227, Restrictions on use of telephone equipment, section (b)(1)(A)(iii), Legal Information Institute. Checked October 8, 2026.
- 47 CFR § 64.1200, Delivery restrictions, paragraphs (a)(2) and (f)(9), the FCC's prior express written consent rule (Legal Information Institute). Checked October 8, 2026.
- What is the difference between iMessage, RCS, and SMS/MMS?, Apple Support. Checked October 8, 2026.
- Send webhooks in Zap workflows, Zapier Help Center: POST with headers and a JSON payload, on Professional plans and up. Checked October 9, 2026.