Seasonal Texts for Lawn Care, Landscaping and Exterior Cleaning
Lawn care, landscaping and exterior cleaning businesses earn most of their year in a few windows: spring cleanup, aeration, leaf season, gutters, holiday lights and snow. A dedicated iMessage number lets you text customers who agreed to hear from you when each window opens, tell today's route about a weather delay in one call, send before-and-after photos once they've replied, and let a hosted AI agent answer “what's included?” from your price list. The rules that keep it working: pace new conversations to your plan's limit, never send more than two texts to someone who hasn't replied, and keep promotional texts between 8 am and 9 pm.
Key takeaways
- Who to text: past customers who agreed to texts, people who requested an estimate, and anyone who texted you first. Never bought lists or scraped numbers.
- The first text of each season is plain text, has no link and ends on a question, so a yes is one tap away.
- Weather delays:
POST /api/imessage/broadcastsends up to 100 customers their own 1:1 text, never a group, at about 10 a minute per number, so start a big list early. - Pacing: conversations the number starts are capped at 5 new contacts a day per number on Pro and 50 on Growth; customers who text first are never limited.
- The hosted AI agent answers replies from your business context and a price list file, and never invents prices you didn't give it.
Why text seasonal customers from an iMessage number?
Because a seasonal business lives on getting a yes from last year's customers before the calendar fills, and a text from a number they already know is the shortest path to that yes. ZeroSettle gives your business its own phone number on iMessage, running on Apple hardware we operate for you in a server facility. Customers reply like they would to anyone, and you read every conversation in the console, the API or your CRM.
Each seasonal push is a short text and a reply. The hard part is sending them so the number stays healthy, which is what most of this post covers.
If you also run estimate requests through the same number, start with speed to lead for home service businesses; for the bigger picture, see how to grow a home service business with iMessage.
Who can you send a seasonal text to?
Only people who gave you their number for texts like these. In practice that means:
- past and current customers who agreed to get texts from you (a checkbox on your service agreement or booking form, or a yes in an earlier conversation);
- people who asked for an estimate through your website form or a lead-ad form with consent language;
- anyone who texted your number first, for example from a “Text us” link on your invoice or estimate.
Not on the list: purchased lists, numbers scraped from directories, homeowners on a street you happened to mow, or neighbors of a current customer. ZeroSettle's compliance guidance is blunt about it: “If you are unsure whether you have consent, you don't.” Keep a record of who agreed and when. iMessage marketing and TCPA consent walks through the US rules in more depth; none of this is legal advice.
The easiest way to grow the list is to have customers text you first. A sms: link on your invoices, estimate confirmations and website (see how to get customers to text you first) turns every new customer into a known contact, which also matters for the limits below.
What should you text each season?
One short, plain text per service window, written so the answer is yes or a date. The table below is a starting calendar for a company that does lawn care plus exterior work; move the months to fit your climate.
| When | Service | Example text to an opted-in customer |
|---|---|---|
| Late Feb to March | Spring cleanup | Hi Ana, it's Greenline. Spring cleanup weeks for April are open. Want us to keep you in the same week as last year, around April 7? |
| April | Weekly mowing start | Mowing starts the week of April 21. Same Tuesday route and same plan as last season work for you? |
| May to June | Pressure washing, window cleaning | We're booking driveway and patio washing for June. Want me to add it to one of your mowing visits? |
| August to September | Aeration and overseeding | Aeration and overseeding slots for September are open. Want us to hold one for your yard on Birch Ct? |
| September to October | Snow contracts | Snow contracts for this winter are open until October 31. Want the same driveway and walk plan as last year? |
| September to October | Holiday lights | Holiday light installs start November 10, with January takedown included. Want a quote for this year? |
| October to November | Leaf cleanup and gutters | Fall leaf cleanup weeks are open. Want gutters cleaned the same visit so it's one trip? |
Every example names the business, has no link and ends on a question. Send the link (a booking page, a quote form) after they reply, when it can be tapped.
Why no link up front: an iPhone won't open links from an unknown sender, so until the customer replies to your number or saves it as a contact, a link shows as plain text they can't tap. The text still goes out, and the API response carries a link_not_tappable warning. On iOS 26, Screen Unknown Senders can also move a text from a number the customer doesn't know into a separate list with no notification, so a first text may sit unseen; one more reason to have customers text you first. Why first-message links aren't tappable covers the details.
Once a customer has replied, you can do more. A poll works well for picking a window (“Which week works for aeration?” with two to twelve options), but like a photo it goes only to someone who has replied to the number, and customers on iPhones older than iOS 26 see “Sent a poll” and can't vote. Plain questions work everywhere.
How do you pace a campaign to hundreds of customers?
Spread the first texts over days, because conversations the number starts are capped per day and a customer who never answers can only get two texts. Three rules from the limits docs shape every seasonal campaign:
- New contacts are capped. A new contact is a customer the number delivers a message to first. Pro allows 5 new contacts a day per number; Growth allows 50 a day per number, and 3 per 15 minutes. The day resets at 3 AM Eastern. A send past the cap is refused with
429 new_contact_limitand aretry_after_s. Customers who texted the number first, and any conversation already going, never count. - Two texts before a reply. A customer who has never replied can get at most 2 messages from the number; a third is refused with
403 awaiting_reply. Messages sent within 5 minutes of the first count as one. In seasonal terms: someone who ignored your spring text and your aeration text won't get the snow contract text until they answer something. - 10,000 a day with known contacts. Each number allows 10,000 messages a day, sent and received, with people it already has a conversation with. Seasonal businesses rarely come near it.
| Plan | New contacts a day | Days to open 200 |
|---|---|---|
| Pro, one number | 5 | 40 |
| Growth, one number | 50 (3 per 15 minutes) | 4 |
| Growth link, three numbers | 150 (50 per number) | 2 |
The cap applies once per customer. After the first conversation, every later season's text to that customer is a known contact and doesn't count (unless you delete that conversation, which makes them a new contact again).
So the real work is in the first year. Start the spring list in late February, put your most likely yeses first, and send every new customer who agrees to texts a welcome text when they sign up (“Save this number, it's how we'll reach you about visits. Reply OK so we know it's you.”). One reply makes them a known contact for every season after.
For sending, POST /api/imessage/broadcast takes 1 to 100 handles and sends each one a separate 1:1 message. Every per-send rule still applies to each recipient: a customer who texted STOP is skipped, each new person counts toward the cap, and one refused recipient never stops the others. Resend any recipient that comes back deferred, and wait out a new_contact_limit rather than retrying it.
How do you tell today's route about a weather delay?
Send one broadcast to the customers on today's route the moment you make the call, with the new day in the text. Each customer gets their own message and replies into their own thread; nobody sees anyone else's number. Do not put route customers into a group chat for this: a group shows every member to every other member.
curl -X POST https://portal.zerosettle.io/api/imessage/broadcast \
-H "Authorization: Bearer $ZEROSETTLE_TOKEN" -H "Content-Type: application/json" \
-d '{"to": ["+16125550142", "+16125550187", "+16125550199"],
"text": "Greenline here: heavy rain today, so we are moving your Tuesday mow to Wednesday. Nothing for you to do. Reply if Wednesday is a problem."}'
A few practical notes from running this kind of text:
- Pull the list from wherever the route lives: a script reading your scheduling export, a Zap with the Zapier Send iMessage action, or a GoHighLevel workflow once the iMessage (ZeroSettle) app makes your number the sub-account's SMS provider. See CRM integrations.
- Route customers should already be known contacts. A delay text to someone the number has never talked to counts as a new contact and uses one of their two unanswered texts. The welcome text above avoids that.
- Snow works the same way. Send contract customers the storm plan the evening before (“Plowing starts after 2 inches; your driveway will be done before 7 am”), not a text at 4 am when the trucks roll.
- If the hosted agent manages the number, it reads your broadcast text in each thread as its own and answers replies like “can you do Thursday instead?” from your business context, so put the facts it needs (the new day) in the text itself.
For day-of texts that aren't about weather, such as a crew heading over, see technician on-the-way texts.
When can you send before-and-after photos?
Once the customer has replied to the number at least once. Until a contact has sent the number anything (a text, photo, video, voice note or tapback), it can only text them; a photo is refused with 403 attachment_before_reply and nothing is sent. That's one more reason to open every season with a question.
After that first reply, photos are the best part of the channel for exterior work: the cleared beds after a spring cleanup, a gutter run before and after, the patio half pressure-washed. A photo with a caption arrives in one bubble, exactly as Messages shows it. From the API it's the same send endpoint with image_b64 (up to 5 MB) and an optional text caption. See Attachments.
A completion photo is also the natural moment to ask for a review or a referral. How to ask for Google reviews over iMessage and turning happy customers into referrals cover the wording. For large landscape installs where the homeowner, a project manager and the crew lead all need to see the same photos, one iMessage group per job is the better fit.
Can an AI agent answer “what's included?”
Yes. ZeroSettle's hosted AI agent answers every reply to the number from a business context you write plus files you connect, such as a price list, with no server or code. Switch the number to Managed by AI Agent in the console's Messaging tab, write the business context, and add your price list under Connectors: Files (PDF, Excel, CSV, Word or text, up to 10 MB each, at most 10 files). The agent reads every file before every answer, and it never invents facts your business context and files don't give it. If it gets a fact wrong or dodges a question, the fix is to add that fact to the business context or a file.
A price list for this works best as a simple spreadsheet, one row per service:
service,season,whats_included,price
Spring cleanup,Mar-May,"Beds weeded and edged, leaves and debris hauled, first mow","from $240; site visit over 1/2 acre"
Core aeration + overseeding,Aug-Oct,"Whole lawn aerated, sun/shade seed mix, starter fertilizer","$185 up to 5,000 sq ft; $245 up to 10,000 sq ft"
Fall leaf cleanup,Oct-Dec,"Leaves blown from lawn and beds, hauled away, final mow","from $220"
Gutter cleaning,Oct-Nov,"Gutters cleared and bagged, downspouts flushed","$160 single story; $220 two story"
Snow contract,Nov-Mar,"Driveway plowed after 2 inches, front walk shoveled and salted","$450 per season, standard driveway"
Then a business context that tells the agent who it's talking to and where its knowledge stops:
You are Greenline Lawn & Exterior's assistant, texting existing customers
who replied to our seasonal texts. Answer questions about our services from
the price list file, and help them book.
Service area: Maple Grove and Plymouth. Office hours Mon-Fri 8am-5pm.
Prices: only from the price list. If they don't know their lawn size, the
crew measures before starting and charges the matching price. Anything over 1/2 acre, any hardscape or
planting job, or anything not on the list: offer a free site visit, never a
number. Booking: share https://greenline.example/book once they say yes.
Billing questions or complaints: tell them Sam from the office will text
them back the same day.
Never promise a specific crew, a time of day, or results like "weed free".
- Tue 9:40 AM
- Business: Hi Rob, it's Greenline. Aeration and overseeding slots for September are open. Want us to hold one for your yard on Birch Ct?
- Customer: maybe. whats included and how much
- Business: Core aeration of the whole lawn, overseeding with a sun and shade seed mix, and a starter fertilizer.
- Business: It's $185 for lawns up to 5,000 sq ft and $245 up to 10,000. Do you know roughly how big yours is?
- Customer: no idea. does it include the backyard
- Business: Yes, front and back. If you're not sure of the size, the crew measures before starting and you pay the matching price.
- Customer: ok lets do it
- Business: Great. Pick your week here: https://greenline.example/book
Settings worth changing for a seasonal business:
- Timezone. The agent's clock and its triggers default to
America/New_York; settimezoneto yours. - The follow-up trigger. By default the agent follows up once, the next morning, if the customer hasn't replied to its last text. To a customer who has never replied, that follow-up is their second and last allowed text, so make sure it's worth it, or edit or remove it.
- No daily triggers for promotions. A
dailytrigger fires in every conversation the agent has, every day. That suits a daily tip service, not a lawn company. - Response time.
instantis the default;humanwaits 5 to 10 minutes. Either way, the agent says it is your automated assistant if sincerely asked.
Each text the agent sends uses one credit; the broadcasts you send yourself use none. As illustrative arithmetic, a campaign where 40 customers reply and the agent sends each of them about four texts uses about 160 credits. More on settings and trade-offs in how the hosted AI agent works and the AI agent in the console docs.
What hours should seasonal texts go out?
Between 8 am and 9 pm in the customer's time zone for anything promotional, which is the window ZeroSettle's compliance guidance gives. Seasonal offers are promotional; mid-morning on a weekday is a good default because you're around to handle replies.
The hosted agent's triggers already land inside it: morning is 9 to 11 AM, afternoon 1 to 3 PM and evening 6 to 8 PM in your timezone, at a different moment in each conversation. Broadcasts go out when you call the endpoint, so whatever runs them decides the hour. A rain-delay text is about a booked visit rather than an offer, but it still reads better at 7:30 than at 5:45.
What gets a seasonal number in trouble?
Texting people who don't expect you, and texting people who never answer. Both look like spam, and the docs put the cost plainly: when a number is flagged by Apple, every send fails, to everyone. Avoid these:
- A purchased or scraped list. ZeroSettle suspends lines used for unsolicited messaging.
- One long template for everyone. Use their name, street and last year's service.
- A link or a photo in the first text. The link can't be tapped and the photo is refused.
- Retrying refusals.
403 recipient_opted_outmeans they texted STOP; ZeroSettle blocks that customer on every number on your account until they text START.403 awaiting_replymeans wait for an answer. - Assuming everyone has an iPhone. iMessage reaches Apple devices, and SMS fallback is a limited pilot ZeroSettle must enable per account (see the FAQ).
More on the warning signs in what happens if your iMessage number is flagged.
How do you set it up, and what does it cost?
Setup is five steps, and none of them needs code if the hosted agent answers:
- Get a number at portal.zerosettle.io, set your business name and photo, and subscribe.
- Add a “Text us”
sms:link to your invoices, estimate confirmations and website. - Export the customers who agreed to texts, most likely yeses first.
- Either leave the number on Managed by AI Agent and add your business context and price list, or switch to Managed by API to answer from the console or your own server (Send a message and Webhooks cover that route).
- Send the season's first text in batches that fit your plan's new-contact limit, during the day.
| Plan | Price | New contacts a day | Free credits (once) |
|---|---|---|---|
| Pro | $49/month, one dedicated number | 5 per number | 500 |
| Growth | $199/month per number (upgrade in the console), or $599/month for 3 numbers from a Growth link plus $199 per extra number | 50 per number (3 per 15 minutes) | 1,000 |
| Enterprise | Custom pricing through sales, for high volume and compliance needs (book a demo) | Agreed with sales | Agreed with sales |
Growth also adds team members, so the office and crew leads can share the inbox. Credits pay only for the hosted AI agent's texts and for videos; free credits come once and don't refill, and packs are 1,000 for $50 or 5,000 for $200 and never expire. The subscription has a 30-day money-back guarantee.
Remember that a past customer who has never texted this number is still a new contact to it. A company whose customers mostly text in first, or already have a conversation with the number, usually fits Pro; one opening a few hundred new conversations every spring should look at Growth. Painters face the same questions; see iMessage for painting contractors.
Frequently asked questions
Can I text my whole customer list when the season opens?
Only the customers who agreed to get texts from you, and only at the pace your plan allows. Each customer the number has never had a conversation with counts as a new contact (5 a day per number on Pro, 50 a day per number on Growth), and someone who has never replied can get at most 2 messages from the number. Customers who already text with you are not limited by the new-contact cap.
Do rain-delay texts go out as a group text?
No. POST /api/imessage/broadcast sends each customer their own 1:1 message, so nobody on the route sees anyone else's number, and each reply lands in that customer's own thread.
What about customers who don't have an iPhone?
iMessage reaches Apple devices. SMS fallback is a limited pilot that ZeroSettle has to enable for an account, so plan to keep reaching other customers the way you do today. GET /api/imessage/availability checks whether a number is on iMessage without sending anything.
Will the AI agent quote prices?
Only the prices you give it in its business context or a connected file, such as a price list. It never invents facts your business context and files don't give it, so for jobs that need a site visit, tell it in the business context to offer an estimate instead of a number.
Can I send before-and-after photos to a new customer?
Not until they have replied once. Photos, videos, voice messages and polls go only to contacts who have sent the number something; before that, a photo is refused with 403 attachment_before_reply. After their first reply, send as many as the job needs.
What does this cost for a lawn or exterior cleaning business?
Pro is $49 a month for one dedicated number with 5 new contacts a day and 500 free credits once. Growth is $199 a month per number (upgrade in the console) with 50 new contacts a day per number, team members and 1,000 free credits once, or $599 a month for 3 numbers from a Growth link plus $199 for each extra number. Enterprise is custom pricing through sales for high volume and compliance needs. Credits pay only for the hosted AI agent's texts and for videos, free credits never refill, and the subscription has a 30-day money-back guarantee.
Sources
- ZeroSettle iMessage API docs: “Your iMessage number” (pricing), “Send a message” (broadcast, links in a first message, polls, SMS fallback), “Attachments”, “AI agent” (Managed by AI Agent, triggers, connectors, credits), “AI agent in the console”, “Errors, limits, and compliance”, “CRM integrations” and “Group chats”. Checked November 2, 2026.
- ZeroSettle iMessage API Terms of Service.