iMessage works for B2B sales in a narrow and genuinely valuable band. Being clear about where that band starts and stops is the difference between a channel that compounds and one that gets your line disabled in three weeks.
Where it fails
- Cold outbound to a purchased list
- Sequenced prospecting at volume
- Anything that would work as a mail merge
- Contacts who never gave you a number
Where it wins
- Inbound lead, texted within minutes
- Follow-up after a real meeting
- Deal in motion, question needing a fast answer
- Renewal and expansion with an existing contact
Cold outbound is what gets numbers banned
Blue-bubble delivery depends on Apple accounts that stay in good standing. Recipients reporting your number is the fastest route to losing it — and unlike SMS, you cannot simply buy a replacement and continue. Read do iMessage providers use phone farms for why.
The one automation worth building first
Speed to lead. A form fills in; a text goes out inside two minutes, from a real rep's line, referencing what they actually asked about. Nothing else in this channel produces comparable returns.
export async function onLeadCreated(lead: Lead) { // Consent first. A form submission with a phone field and clear notice is // consent; a scraped number is not. if (!lead.phone || !lead.consentedAt) return; const rep = await assignOwner(lead); // Send from the rep's own line. "Text from a person" is the whole product // advantage here — a shared marketing number throws it away. const result = await messaging.send({ from: rep.line, to: lead.phone, text: `Hi ${lead.firstName}, it's ${rep.firstName} from Acme — saw you were ` + `looking at ${lead.interest}. Happy to answer anything. ` + `Here's a 2-min overview: ${tagged(lead)}`, }); await crm.logOutbound(lead.contactId, result.id);} function tagged(lead: Lead) { // Tagging is what lets you prove the channel worked later. const url = new URL("https://acme.co/overview"); url.searchParams.set("utm_source", "imessage"); url.searchParams.set("utm_medium", "sms"); url.searchParams.set("utm_campaign", "speed_to_lead"); url.searchParams.set("utm_content", lead.interest); return url.toString();}Rules that keep the channel alive
- Only text people who gave you a number in a context where a text was clearly implied.
- Send from a person's line, and let them reply. A number that only broadcasts looks like exactly what it is.
- Cap volume per rep per day. A human does not send 400 messages. Lines that behave like humans survive.
- Vary the message. Identical text across hundreds of recipients is a pattern that gets detected.
- Honour STOP instantly and permanently, across every sequence and every queue.
- Respect the recipient's timezone, not your office's — see quiet hours and frequency.
Measuring it honestly
The temptation is to report reply rate, which will look spectacular. Reply rate is not the metric — meetings booked and pipeline created are, and they are the only numbers that survive contact with a CFO.
| Metric | Why it matters | Trap |
|---|---|---|
| Time to first touch | The single biggest driver of conversion on inbound leads | Averages hide the slow tail; track the 90th percentile |
| Reply rate | Confirms the channel is being received | Flattering and nearly useless on its own |
| Meetings booked | The actual job | Attribute to first touch, not last |
| Opt-out rate | Your early warning that volume or targeting is wrong | Watch it weekly; a rise precedes a flagged number |
| Delivery rate | Leading indicator of account health | A quiet decline is what trouble looks like first |
The attribution plumbing is in UTM tagging for text messages and measuring ROI of texting.
Common questions
- Can I use an iMessage API for cold outbound sales?
- Technically some providers support it on higher tiers, but it is the fastest way to get a number flagged and it draws complaints. The channel performs far better on contacts who already know you.