Use cases

Bring Back Past Painting Customers With iMessage

Short answer: sort your past clients by what is coming due (an exterior, a deck or fence to restain, cabinets, a touch-up), keep only the ones who agreed to receive texts, and send each a short, plain opener from your company's own iMessage number a few weeks before your spring or fall booking window. Pace it to your plan's new-contact limit, let ZeroSettle's hosted AI agent answer the replies and book walkthroughs, and ask happy customers for a referral once the job is on the calendar. Pro is $49 a month for one number; Growth is $199 a month per number for a faster pace; Enterprise is custom pricing through sales.

Key takeaways

  • Who to text: past clients who agreed to texts and have something coming due. Everyone else gets an email or postcard asking them to text you.
  • Pacing: a past client this number has never texted is a new contact: 5 a day on Pro, 50 a day per number on Growth. Customers already in a conversation with the number, and anyone who texts first, don't count.
  • The opener: say who you are, mention the work you did, no link, end on a question. One follow-up at most; the API refuses a third message before a reply.
  • Who answers: the hosted AI agent can start each conversation (from the console's Start a conversation box or POST /api/imessage/agent/start), answer replies from a business context you write and send your booking link once they're interested.
  • Referrals: ask after the job is booked or done, and ask them to pass your number along, never for a friend's number to text.

Why text past painting customers at all?

Past customers are often the easiest work a painting company can book, because they already know your crew, your prices and your cleanup. Paint and stain wear out on a schedule: exteriors fade and chalk, deck and fence stain wears out sooner than paint on siding, kitchens get tired, and every house picks up dings and patches. When it is time again, the homeowner often can't remember who did the last job. A text from the company that did it, at the right moment, is often the nudge that turns “we should do something about the deck” into a walkthrough on your calendar.

iMessage suits this because a past customer reads it like any other text from someone they know. With ZeroSettle, your company gets its own number on iMessage, running on Apple hardware we operate for you in a server facility, and it can share your company name and photo with each customer so the thread shows your brand instead of a bare number. Replies come back to the same thread, where you or the hosted AI agent answers. If you are new to running a painting business over text, start with iMessage for painting contractors; this post covers one campaign: bringing back people you already worked for.

Which past customers should you text first?

Text the customers who have a real reason to hear from you now, sorted by what is coming due. A generic “we're booking jobs!” to everyone reads like an ad; “your deck stain is probably due” reads like a contractor who remembers the job. Pull your past jobs from your estimating software, invoices or spreadsheet, and tag each customer with the work you did and when.

Reactivation segments for a painting company (illustrative)
SegmentWhy nowWhat the opener mentionsBest timing
Exterior repaintsSiding and trim fade and peel over the years, usually on the sunniest walls firstThe year you painted, and a free look at how it's holding upA few weeks before your exterior season opens
Deck and fence stainDecks and fences take the most weather and need a fresh coat more often than wallsA restain before summer, or before winter in wet climatesEarly spring and early fall
Interior roomsKids, pets, moves and new furnitureRooms you didn't do last time, or an update before hostingYour slow exterior months
CabinetsKitchens that were quoted but not done, or customers who asked about themThe cabinet question they asked during their last jobWinter and early spring
Touch-ups and warranty checksYour warranty period ending, or settling and nail pops in new drywallA free check before the warranty endsAny time, one customer at a time
Estimates that never bookedThey wanted the work, the timing was wrongCovered in a separate playbookSee estimate follow-ups

Set the age thresholds from your own warranty terms, products and climate. The best guide is what you told the customer at the final walkthrough.

Work the segments where you have open capacity: if exteriors fill every spring anyway, text deck and interior customers into the gaps.

Text only past customers who agreed to receive texts from you, and keep the record of when and how. That might be a checkbox on your estimate form, a line in your contract they signed, or a customer who texted your business number themselves. Having painted someone's house is not the same as permission to send them offers. ZeroSettle's docs put it plainly: “If you are unsure whether you have consent, you don't.” The iMessage TCPA consent guide explains the rules for marketing texts in more detail; this is not legal advice.

Split the old list in two:

  • Agreed to texts: eligible for this campaign. Check them against any opt-out list you keep elsewhere, since STOP replies to an old number or another provider aren't on ZeroSettle's list.
  • No record of agreement: reach them the way you already have permission to, usually email, or a postcard to the address you painted. Put a “Text us” QR code on it that opens a message to your iMessage number. When they text first, they are never counted as a new contact, any link you send them is tappable, and the thread itself records that they reached out. How to get customers to text you first shows how to build the sms: link and QR code.

Never buy or borrow a list

Don't text purchased lists, scraped numbers, door-knock lists or neighbors of past jobs. ZeroSettle suspends numbers used for unsolicited messaging, and repeated texts to people who never answer are the fastest way to get a number flagged by Apple, after which every send fails, to everyone. See what happens when a number is flagged.

One more filter: iMessage reaches Apple devices. SMS fallback is a limited pilot that ZeroSettle must enable for an account, so plan to reach Android customers by email or phone. GET /api/imessage/availability checks whether a number is on iMessage without sending anything.

How fast can you work through the list?

It depends on whether the number has talked to each customer before. A past client this number has never had a conversation with is a new contact the first time it texts them, and new contacts are capped per number: 5 a day on Pro, and 50 a day (no more than 3 in any 15 minutes) per number on Growth. The day resets at 3 AM Eastern. Customers who texted the number during their job, or whom it already texted, are known contacts and aren't capped; each number allows 10,000 messages a day, sent and received, with known contacts.

Days to open 200 past clients the number has never texted (ZeroSettle API docs, checked November 2, 2026)
PlanNew contacts a dayDays for 200
Pro, one number540
Growth, one number50 (3 per 15 min)4
Growth link, 3 numbers150 (50 per number)2

Arithmetic on the published limits, not a forecast. Customers who already have a conversation with the number add no days.

On Pro, a list of a couple of hundred past clients takes weeks, so start well before the season you want to fill and send your most likely repaints first. On Growth, a segment fits in a few days.

What should the first text say?

The first text should say who you are, remind them of the job, give one reason to reply and end on a question. Leave the link out: until a person replies to your number or saves it as a contact, iPhone shows a link from your number as plain text they can't tap (why links in a first message aren't tappable). Photos also wait: the API refuses a photo, video, voice message or poll to someone who has never replied, with 403 attachment_before_reply. ZeroSettle's compliance rules also say nothing promotional before 8 am or after 9 pm in the recipient's time zone.

Illustrative example openers, from a fictional company:

  • Exterior: “Hi Linda, it's Mark at Ridgeline Painting. We painted your house on Alder St in 2022. We're setting the spring exterior schedule and doing free check-ups on homes we've painted. Want me to swing by and take a look?”
  • Deck or fence: “Hi Tom, Ridgeline Painting here. We stained your deck a couple of summers ago, and decks usually start asking for a fresh coat about now. Want to get on the list before the spring rush?”
  • Interior: “Hi Priya, it's Mark from Ridgeline. Hope the living room is still holding up! We have a few interior openings this winter. Any rooms you've been meaning to get to?”
  • Cabinets: “Hi Dan, Ridgeline Painting here. Last time you asked about painting the kitchen cabinets. We have cabinet openings in January. Still something you're thinking about?”
  • Touch-up check: “Hi Ana, Mark from Ridgeline. Your two-year paint warranty is up next month, so we're offering a free touch-up visit before then. Want to set one up?”

Openers with a name and job details are texts you send yourself (see the next section); the agent's own first_message is the same for everyone. Keep each one to a single text, or two sent together: messages sent within 5 minutes of each other count as one. The API allows at most 2 messages to a contact before their first reply; a third is refused with 403 awaiting_reply. So the plan is one opener and, at most, one follow-up a few days later. If they don't answer either, stop. Lead nurture without getting your number flagged covers follow-up rhythm in more depth.

How does the AI agent answer replies and book?

ZeroSettle's hosted AI agent answers every reply from a business context you write, so a reactivation campaign keeps working while you're on a ladder. You switch the number to Managed by AI Agent in the console's Messaging tab, replace the example business context with your own, set the goal to Demos booked (demo_booked in the API) with your booking page as its link, and start conversations. The agent answers in up to three short texts, never invents facts your context doesn't give, says it is your automated assistant if sincerely asked, and points anyone who wants no more texts to STOP. The console steps are in AI agent in the console.

A business context for this campaign, illustrative:

text
You are the texting assistant for Ridgeline Painting, a residential
painting company in Fairview. You are texting past customers who
agreed to texts, about repainting, deck and fence staining, cabinets
and touch-ups. Be warm and brief. Your goal is a free walkthrough.

Services: exterior and interior painting, deck and fence staining,
cabinet painting, drywall patching. We don't do roofing or flooring.
Walkthroughs are free, about 30 minutes, Mon-Sat.
Never quote a price. Every repaint is priced on site.
Spring exterior openings start in April; interiors and cabinets any time.
Warranty: two years on workmanship. Warranty questions or complaints:
ask them to call the office at (555) 010-0142 so Mark can help directly.

If they are interested, share the booking link. If they say someone
else painted since, thank them and wish them well. If they ask, mention
that we're glad to help friends and neighbors: they can text this number.

Example:
Them: the fence is looking pretty gray honestly
You: That's usually the sign! Want to pick a time for a free look?

Then start conversations, from the console's Start a conversation box (a phone number and their name), from the MCP tool start_conversation, or from POST /api/imessage/agent/start. The agent sends your first_message exactly as written, knows their name for the whole conversation, and answers what they reply. Two details matter for reactivation:

  • first_message is the same for everyone. It is sent exactly as written and the name isn't put into it, so write it per segment (“We stained your deck a couple of summers ago”) and start one segment at a time. Or turn first_message_enabled off and the agent writes its own opener from your context and their name.
  • For an opener that names the exact job, send it yourself with POST /api/imessage/send on the number the agent manages. The agent reads your texts in the thread as its own and answers what they reply.

The default trigger is one follow-up the morning after the last message if they haven't replied. That is your second and last message before a reply, so make its instruction gentle (“If they haven't replied, send one short, low-pressure follow-up”), or set after_days to 3 so it lands later in the week. Don't add daily triggers to a reactivation group.

  1. Tue 10:24 AM
  2. Business: Hi, Ridgeline Painting here. We stained your deck a couple of summers ago, and decks usually start asking for a fresh coat about now. Want to get on the list before the spring rush?
  3. Tue 6:02 PM
  4. Customer: ha funny timing
  5. Customer: the boards by the steps are looking pretty gray. how much would it be
  6. Business: Gray boards by the steps is usually the first sign! We price every deck on site, so the best next step is a free 30-minute look.
  7. Business: Pick any time that works: https://ridgelinepainting.example/book
  8. Customer: booked saturday 10am. can you look at the fence too
  9. Business: Absolutely, we can look at both while we're there. See you Saturday, Tom!
Illustrative example with a fictional company, Ridgeline Painting. Tom agreed to texts on his original contract. The agent doesn't quote a price because its business context says not to, and the booking link is tappable because Tom replied first.

Credits pay for the agent's texts: one per text it sends, including its opener. The conversation above used 4. Pro includes 500 free credits once and Growth 1,000 once; they never refill, and packs are 1,000 for $50 or 5,000 for $200 and never expire. Watch the inbox in the console: the agent sends the booking link, but you still confirm the visit and the crew. More on the agent's settings in the AI agent docs.

How do you send a whole segment from code?

Use POST /api/imessage/broadcast: one call takes up to 100 people and sends each the same text in their own 1:1 conversation, never a group; each number sends about 10 a minute, and the rest come back deferred to send again. It is exactly a POST /api/imessage/send to each handle, so every rule still applies per person: anyone who texted STOP is skipped, each new person counts toward the new-contact limit, and one refused recipient never stops the others.

bash
curl -X POST https://portal.zerosettle.io/api/imessage/broadcast \
  -H "Authorization: Bearer $ZEROSETTLE_TOKEN" -H "Content-Type: application/json" \
  -d '{"to": ["+15555550123", "+15555550188", "+15555550147"],
       "text": "Hi, Ridgeline Painting here. We stained your deck a couple of summers ago, and decks usually start asking for a fresh coat about now. Want to get on the list before the spring rush?"}'

The response has a results entry for each recipient. Plan for three outcomes besides a clean send:

  • new_contact_limit: today's new contacts on that number are used up. The entry carries retry_after_s; nothing was sent to that person. On Pro, a broadcast to 100 past clients the number has never texted reaches the first 5 and refuses the rest, so send each day's batch of five instead. On Growth the 3-per-15-minutes window applies too, so send new contacts in batches of three spaced 15 minutes apart.
  • deferred: the line was slow and the call ran out of time before it reached them. Nothing was sent; call again with just the deferred handles.
  • recipient_opted_out: they texted STOP. Don't retry.

On a number the agent manages, the agent answers whatever people reply to your broadcast, the same as with a single send. If your customer list lives in GoHighLevel, the iMessage (ZeroSettle) app makes your number the sub-account's SMS provider, so a workflow's Send SMS step goes out from it under the same rules; Zapier has a Send iMessage action that follows the same rules as POST /api/imessage/send. One catch: on a number the hosted agent manages, GoHighLevel's own sends are refused and marked failed with the reason (the agent does the texting there; Close and HubSpot sends get 403 managed_by_zerosettle), so start agent conversations from the console or the API. The GoHighLevel setup guide walks through it.

When should you ask for a referral?

Ask once the work is booked or finished and the customer is plainly happy, in the same thread. A reactivated customer has just chosen you twice, which makes them the most credible person to recommend you. Keep the ask simple and point friends at your number:

  • “Thanks again, Tom. If any neighbors ask who did the deck, they can text us at this number and mention your name.”
  • “Glad the kitchen came out the way you wanted! If a friend is looking for a painter, feel free to share our number.”

Don't ask for a friend's phone number so you can text them: that friend never agreed to hear from you. When the friend texts you, they aren't a new contact, your links work, and the agent can answer them like any new lead. Turning happy customers into referrals covers referral offers and timing, and asking for Google reviews over iMessage pairs well with the same moment.

What should you avoid?

  • Texting people without a record of consent, even former customers. Use email or a postcard and let them text you.
  • A link or photo in the opener. The link won't be tappable and the photo is refused until they reply.
  • Chasing. One opener and one follow-up, then stop. Non-replies that pile up are what gets numbers flagged.
  • Deleting old conversations to tidy the inbox. Deleting a conversation makes that person a new contact again.
  • Customer details in the agent's files. The agent reads every connected file before every answer, in every conversation, so put your service menu there, not your customer list.
  • Quoting from memory. Unless your business context lists prices, the agent shouldn't give one; a walkthrough is the honest answer.

STOP is enforced for you: when a customer texts STOP, every number on your account is blocked from texting them, including any group chat they are in, and sends return 403 recipient_opted_out until they text START (if they ask some other way, ZeroSettle can clear it). Keep your own opt-out list too, for email and your records. Details are in Errors, limits, and compliance.

Which plan fits a reactivation campaign?

Pro fits a small list you can pace over weeks; Growth fits a big list or a short booking window. All three plans:

ZeroSettle plans (ZeroSettle API docs and zerosettle.io, checked November 2, 2026)
PlanPriceNew contacts a dayFree credits (once)
Pro$49/month for one dedicated number5500
Growth$199/month per number (upgrade in the console), or $599/month for 3 numbers from a Growth link plus $199 per extra number50 per number (3 per 15 min)1,000
EnterpriseCustom pricing through salesCustom, for high volume and compliance needsSet with sales

Growth also adds team members, so your office manager can work the inbox. The 30-day money-back guarantee covers the subscription, not credit packs.

A common path: start on Pro, text your most likely repaints at five a day, and upgrade to Growth in the console if the replies justify a faster pace. For a larger operation, book a demo about Enterprise. How to grow a home service business with iMessage puts reactivation alongside speed to lead, estimate follow-ups and reviews.

Frequently asked questions

Can I text everyone who ever hired us?

Text only past customers who agreed to receive texts from you, and keep the record of when and how they agreed. Having painted someone's house is not the same as permission to send them offers. For everyone else, ask by email or postcard and let them text you first. This is not legal advice.

Do past customers count against the new-contact limit?

Only if this number has never had a conversation with them. A customer who texted the number during their job, or who the number already texted, is a known contact and is not limited. Everyone else counts as a new contact the first time the number texts them: 5 a day on Pro, 50 a day per number on Growth (and 3 per 15 minutes).

What about customers who use Android phones?

iMessage reaches Apple devices. SMS fallback is a limited pilot that ZeroSettle must enable for an account, so plan to reach Android customers by email, phone or postcard. GET /api/imessage/availability checks whether a number is on iMessage without sending anything.

How many credits does a reactivation campaign use?

Credits pay only for texts the hosted AI agent sends (one per text) and for videos. An opener of two texts, three answers of two texts and one follow-up is 9 credits. Pro includes 500 free credits once and Growth 1,000 once; they never refill, and packs are 1,000 for $50 or 5,000 for $200 and never expire.

Can the AI agent quote a price for a repaint?

It can only repeat prices you put in its business context or files, and it never invents facts they don't give. Most painters tell it not to quote and to book a free walkthrough instead, since a repaint price depends on what you see on site.

What happens if a past customer replies STOP?

ZeroSettle records it and blocks every number on your account from texting them, including any group chat they are in. Sends to them return 403 recipient_opted_out. They opt back in by texting START; if they ask some other way, ZeroSettle can clear it.

Sources

  1. ZeroSettle iMessage API docs: “Your iMessage number” (pricing), “Send a message” (broadcast, links in a first message, SMS fallback), “AI agent” (Managed by AI Agent, triggers, credits), “AI agent in the console”, “Errors, limits, and compliance” and “CRM integrations”. Checked November 2, 2026.
  2. ZeroSettle iMessage API Terms of Service.

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 2, 2026. Ridgeline Painting and its customers are fictional, the phone numbers are placeholders, and this page is not legal advice.

Bring your past customers back this season

Get a dedicated iMessage number for your painting company, then let the hosted AI agent answer replies and book walkthroughs.

Pro is $49 a month for one number with a 30-day money-back guarantee. Growth is $199 a month per number, or $599 a month for 3 from a Growth link. Enterprise pricing is custom, for high volume and compliance needs.