iMessage automations with Zapier, n8n or Make
ZeroSettle's iMessage API works with Zapier, n8n or Make without a server of your own: a webhook trigger receives each signed event, a code step verifies the X-ZeroSettle-Signature header (an HMAC-SHA256 of the timestamp, a dot and the raw body, with a 300-second tolerance), and an HTTP Request step sends replies to POST /api/imessage/send with your bearer token. Check first that your tool exposes the raw request body, because ZeroSettle's signature can't be verified without it. Answer the webhook within 10 seconds, or ZeroSettle retries after 1 s, 5 s and 20 s.
Key takeaways
- What it is: iMessage from your business's own number inside the flows you already run. Events arrive by signed webhook, and replies go out as one HTTP request.
- Raw body settings: Zapier's Catch Raw Hook trigger (not Catch Hook), n8n's Webhook node with Raw Body on, or Make's custom webhook with JSON pass-through.
- Price: Pro is $49/month for one number, with unlimited messages with people who message you first. Growth, for several numbers working as one, is from $599/mo. ZeroSettle charges no per-message fees, and your automation tool bills separately.
- Main limit: 5 new contacts a day per number on Pro (50 on Growth). People who text you first are never limited, and each line sends one message at a time.
- What it does not have: a native Zapier, n8n or Make app. You build the flow from webhook and HTTP steps.
Who uses iMessage for no-code automations?
ZeroSettle with Zapier, n8n or Make is for ops people and no-code builders who already run the business on those tools and want iMessage in their flows without writing or hosting a server. 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. In this setup, your automation tool plays the part of the code.
For CRM logging, see iMessage in HubSpot or Salesforce. For a team inbox, see support routed to Slack. Other jobs are in the use-case index.
How iMessage for no-code automations works, step by step
Every ZeroSettle automation has four steps: a webhook trigger, a signature check, a branch on the event type, and an HTTP send. The rules are the same ones a coded receiver follows (see how ZeroSettle webhooks work).
- Trigger. An n8n Webhook node, a Zapier Catch Raw Hook or a Make custom webhook receives the POSTs. You register its URL once with
PUT /api/imessage/webhookand store the signing secret, which is shown only once. - Verify. A code step computes the HMAC-SHA256 of
"<t>." + raw bodywith the secret, compares it withv1, and rejects anytmore than 300 seconds from now. - Branch. Continue only on
message.received. Your own sends echo back asmessage.sent, and tapbacks arrive asreaction.received. Retries carry the samemessage.idandevent, so skip ids you have already handled. - Send. An HTTP Request step calls
POST https://portal.zerosettle.io/api/imessage/sendwithAuthorization: Bearerand your token.
| Step | n8n | Zapier | Make |
|---|---|---|---|
| Trigger | Webhook node, production URL | Webhooks by Zapier, Catch Raw Hook | Webhooks, custom webhook |
| Raw body | Options → Raw Body (arrives as binary data) | Unparsed body (max 2 MB) plus headers | JSON pass-through (body as one text string) and Get request headers |
| Verify | Code node with Node's crypto | Code by Zapier (JavaScript, Node.js 22 standard library) | sha256(text; "hex"; key) returns an HMAC; compare in a filter |
| Answers ZeroSettle with | Respond: Immediately, "Workflow got started" | A fixed 200 response | 200 "Accepted"; 400 "Queue is full." when the queue is full |
Sources: n8n Webhook and Code node docs and Webhook node source, Zapier's webhook and JavaScript help, Make's Webhooks and text-function docs (linked under Sources).
Example conversation: no-code automations
In this thread, an n8n flow answers an hours question from a Google Sheet. The customer texted first, so the thread never counts against a new-contact limit.
- Sat 6:41 PM
- Customer: are you open sunday?
- Business: Sundays 8-2 ☀️ The sourdough sells out by 11!❤️
- Customer: can you hold 2 loaves for me?
- Business: Done! 2 sourdough under Jess until 11 tomorrow.
Behind the thread, "sunday" matched a sheet row, and the HTTP step sent that row's answer. The flow dropped the reply's message.sent echo and the ❤️ (reaction.received), so it didn't answer a heart. "Hold 2 loaves" matched no row, so the flow alerted staff.
Setup: a webhook node, a verify step and an HTTP request
A ZeroSettle flow needs one registration call, a verify step and an HTTP request. The n8n version is below. The full receiver rules are in the webhooks section of the ZeroSettle docs.
Register the production URL
export BASE=https://portal.zerosettle.io # TOKEN holds your API token from the console
curl -s -X PUT -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
-d '{"url":"https://YOUR-PRODUCTION-WEBHOOK-URL"}' $BASE/api/imessage/webhook
In n8n's Webhook node, set HTTP Method to POST, Respond to Immediately, and turn on Raw Body under Options. Then register the production URL and publish the workflow, because the test URL listens only while you wait for a test event. Registering again rotates the secret.
Verify in a Code node
// n8n Code node, "Run Once for All Items", after a Webhook node with Raw Body on
const crypto = require('crypto');
const SECRET = $vars.ZEROSETTLE_WEBHOOK_SECRET; // an n8n Variable; see below
const raw = await this.helpers.getBinaryDataBuffer(0, 'data'); // exact bytes received
const m = /^t=(\d+),v1=([0-9a-f]{64})$/.exec($input.first().json.headers['x-zerosettle-signature'] || '');
if (!m || Math.abs(Date.now() / 1000 - Number(m[1])) > 300) return [];
const expected = crypto.createHmac('sha256', SECRET).update(`${m[1]}.`).update(raw).digest('hex');
if (!crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(m[2]))) return [];
const ev = JSON.parse(raw.toString('utf8'));
if (ev.event !== 'message.received') return []; // drop message.sent echoes and reactions
return [{ json: ev.message }]; // handle, id, text, kind, image
Returning no items stops the run. n8n Cloud provides crypto; self-hosted instances need NODE_FUNCTION_ALLOW_BUILTIN=crypto. Variables ($vars) need n8n Cloud Pro or Enterprise, or self-hosted Business or Enterprise. Self-hosted, $env also works, but since n8n 2.0 only with N8N_BLOCK_ENV_ACCESS_IN_NODE=false. Otherwise the secret sits in the node, readable by anyone who can edit the workflow.
In Code by Zapier, map the Catch Raw Hook's raw body and signature header into inputData, set output to {valid: …}, and stop the Zap with a Filter step on valid. In Make, sha256 with a key returns the HMAC, and a filter compares it with v1 (a plain comparison, since Make documents no constant-time one).
Send with an HTTP Request node
Use POST to https://portal.zerosettle.io/api/imessage/send with a Header Auth credential (Authorization: Bearer plus your token), so the token stays in n8n's credential store. The JSON body is {"to": "{{ $json.handle }}", "text": "…"}. In the node's options, set Timeout to 90,000 ms: a text send normally returns in 2–5 seconds but can take about 75. Turn on Never Error so you can branch on error.code, such as line_busy or new_contact_limit.
Three starter flows
| Flow | Trigger | ZeroSettle call | Watch for |
|---|---|---|---|
| Order thank-you | New order in your store, filtered on a stored consent flag | POST /api/imessage/send | No link in the first text: ask "Reply TRACK" and send it after they answer |
| Hours and FAQ | message.received | Sheet lookup, then POST /api/imessage/send | No matching row means a person answers, not the flow |
| Photos to Drive | message.received with kind: "image" | GET /api/imessage/messages/{id}/image with the bearer, response as a file | image.url is a relative path that needs the bearer, so hand Drive the fetched file, not the link. Only the first photo of a multi-photo message arrives |
Inbound HEIC photos arrive as JPEG, and inbound video and files arrive without the file. For a receipt version of the photo flow, see clients texting receipts to a bookkeeper.
Failure modes specific to automation tools
- The tool answers before the flow runs, so ZeroSettle never retries a step that fails later. Rerun failed runs from your tool's run history. Don't add Make's Webhook response module or n8n's "When Last Node Finishes" after slow steps: Make waits up to 180 seconds, but ZeroSettle stops at 10 and retries, so one event can start up to four runs.
- The flow is off or full. Zapier returns 404 for a Zap that is off, but only after a delay of up to several hours; until then it answers 200, so ZeroSettle never retries. Make answers 400 when its webhook queue is full. ZeroSettle retries a 404 or 400, then records the failure in
GET /api/imessage/line→last_delivery. - The run starts late. A run that starts more than 300 seconds after signing fails verification. Zapier warns that webhooks can be delayed when many requests arrive at once.
- Sends overlap. Parallel sends wait in line and return
429 line_busyafter about 12 seconds. Retry after 2 seconds.
Limits and consent for no-code automations
ZeroSettle limits an automation like any other caller: replies to people who texted first are unlimited, so only text-first flows such as the order thank-you count against new-contact limits. Outbound triggers should fire only for customers with a stored consent flag.
| Limit | Pro | Growth |
|---|---|---|
| New contacts per day (3 AM to 3 AM Eastern) | 5 | 50 |
| New contacts per rolling 15 minutes | — | 3 |
| Unanswered messages to one contact | 2, then 403 awaiting_reply | 2, then 403 awaiting_reply |
| Hours, FAQ and photo flows (they texted first) | Unlimited | Unlimited |
Limit math for 12 first-time buyers in 15 minutes: on Pro, the first 5 thank-yous go out and the other 7 get 429 new_contact_limit for the day, so the flow holds them until after the 3 AM Eastern reset (or skips them). On Growth, each number takes 3 new contacts per 15 minutes, and ZeroSettle sends a new contact from whichever number has room. With three numbers, the first 9 go out as the orders come in, and the other 3 about 15 minutes after the first; the flow waits retry_after_s and retries.
Consent comes first
Text only buyers who gave you their number for order updates, keep the record, and say who you are in the first text. Send nothing promotional before 8 am or after 9 pm in the buyer's time zone. A text with the word STOP in it, or a clear request like "take me off your list", opts the sender out of every number on your account. After that, a misfiring zap gets 403 recipient_opted_out and nothing is sent. Your FAQ flow still receives the STOP itself, so it shouldn't answer. Consent rules vary by country and message type; this isn't legal advice, so check your opt-in wording with counsel.
When ZeroSettle is not a fit for no-code automations
ZeroSettle in a no-code tool is the wrong choice when the tool can't verify signatures, when volume is high, or when your customers aren't on iMessage.
- Your tool can't give you the raw body. Zapier's plain Catch Hook parses the body, so the exact bytes are gone. A flow that can't verify signatures can be triggered by anyone who learns the URL (see how ZeroSettle secures tokens and webhooks).
- You need high throughput. Each line sends one message at a time, and a send normally takes 2–5 seconds.
- Your tool's usage costs outweigh the benefit. Every event starts a run in your tool, including the
message.sentecho of each reply and every tapback. - You expect a native Zapier app. None exists for Zapier, n8n or Make. You use webhook and HTTP steps.
- Many buyers use Android. There is no SMS fallback, so keep email for them.
How much does iMessage for no-code automations cost?
ZeroSettle costs the plan price, with no per-message fees. Messages are unlimited and counted. Your automation tool bills separately: Webhooks by Zapier, for example, needs a Professional, Team or Enterprise plan.
| Plan | Price | Fits |
|---|---|---|
| Pro | $49/month | One number to start, 5 new contacts a day, unlimited messages with people who message you first, no setup fee, self-serve |
| Growth | From $599/mo | Several numbers working as one, through Book a demo |
Both plans carry a 30-day money-back guarantee, and a line your own flow answers uses no AI credits. See pricing or get a number.
Frequently asked questions
How do I test the flow before anyone texts the line?
Run test_webhook from ZeroSettle's MCP connector in your AI agent. It POSTs a signed synthetic message.received with message id 0 and "test": true. You can also text the line from your own phone.
Why does signature verification fail in my flow?
Usually the step sees parsed JSON instead of the raw body; verify the exact bytes received. Otherwise, the secret rotated when you re-registered.
Will a misfiring zap text someone who opted out?
No. The API refuses with 403 recipient_opted_out, nothing is sent or stored, and the block holds until they text START.
Can a flow send a photo instead of text?
Yes. The same POST /api/imessage/send takes image_b64 (the image, base64-encoded, up to 5 MB) with an optional caption in text, and the caption arrives in the same bubble. JPEG, PNG, GIF, HEIC, WebP, TIFF and BMP are accepted. Photos go only to people who have replied to the line; a photo to anyone else is refused with 403 attachment_before_reply, so a first message must be text.
Can the hosted AI agent answer instead of a flow?
Yes, in Beta. But on a line group Managed by AI Agent, inbound texts skip your webhook and your sends return 403 managed_by_zerosettle. Each line runs one or the other.
Sources
- ZeroSettle iMessage API docs: "Your iMessage number" (more than one number), "Send a message", "Attachments", "Webhooks, step by step" and "Errors, limits, and compliance". Checked October 8, 2026.
- Webhook node, n8n Docs (Raw Body, Respond, test and production URLs). Checked October 8, 2026.
- Using the Code node, n8n Docs, with Get the binary data buffer and Enable modules in Code node. Checked October 8, 2026.
- Define custom variables, n8n Docs (
$varsand plan availability). Checked October 8, 2026. - n8n v2.0 breaking changes, n8n Docs (environment access in the Code node, Publish replacing Activate). Checked October 8, 2026.
- Webhook node source code, n8n on GitHub (Raw Body is written to the binary property
data). Checked October 8, 2026. - HTTP Request node, n8n Docs (Header Auth, Batching, Timeout, Never Error). Checked October 8, 2026.
- Trigger Zap workflows from webhooks, Zapier Help Center. Checked October 8, 2026.
- Use JavaScript code in Zap workflows, Zapier Help Center. Checked October 8, 2026.
- Webhooks, Make Apps Documentation (JSON pass-through, Get request headers, default responses). Checked October 8, 2026.
- Text and binary functions, Make Help Center (
sha256with an HMAC key). Checked October 8, 2026.