Use cases

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).

  1. 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/webhook and store the signing secret, which is shown only once.
  2. Verify. A code step computes the HMAC-SHA256 of "<t>." + raw body with the secret, compares it with v1, and rejects any t more than 300 seconds from now.
  3. Branch. Continue only on message.received. Your own sends echo back as message.sent, and tapbacks arrive as reaction.received. Retries carry the same message.id and event, so skip ids you have already handled.
  4. Send. An HTTP Request step calls POST https://portal.zerosettle.io/api/imessage/send with Authorization: Bearer and your token.
What each tool needs to receive ZeroSettle webhooks (vendor docs and n8n source, checked October 8, 2026)
Stepn8nZapierMake
TriggerWebhook node, production URLWebhooks by Zapier, Catch Raw HookWebhooks, custom webhook
Raw bodyOptions → Raw Body (arrives as binary data)Unparsed body (max 2 MB) plus headersJSON pass-through (body as one text string) and Get request headers
VerifyCode node with Node's cryptoCode by Zapier (JavaScript, Node.js 22 standard library)sha256(text; "hex"; key) returns an HMAC; compare in a filter
Answers ZeroSettle withRespond: Immediately, "Workflow got started"A fixed 200 response200 "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.

  1. Sat 6:41 PM
  2. Customer: are you open sunday?
  3. Business: Sundays 8-2 ☀️ The sourdough sells out by 11!❤️
  4. Customer: can you hold 2 loaves for me?
  5. Business: Done! 2 sourdough under Jess until 11 tomorrow.
Illustrative example with a fictional bakery, Larkspur Lane Bakery. Blue bubbles are sent from the bakery's number: the first by an n8n flow, the second by staff in the ZeroSettle console. Gray bubbles are the customer's.

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

bash
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

javascript
// 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

Starter flows and the ZeroSettle calls they make
FlowTriggerZeroSettle callWatch for
Order thank-youNew order in your store, filtered on a stored consent flagPOST /api/imessage/sendNo link in the first text: ask "Reply TRACK" and send it after they answer
Hours and FAQmessage.receivedSheet lookup, then POST /api/imessage/sendNo matching row means a person answers, not the flow
Photos to Drivemessage.received with kind: "image"GET /api/imessage/messages/{id}/image with the bearer, response as a fileimage.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_busy after 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.

ZeroSettle limits per number (API docs, checked October 12, 2026)
LimitProGrowth
New contacts per day (3 AM to 3 AM Eastern)550
New contacts per rolling 15 minutes—3
Unanswered messages to one contact2, then 403 awaiting_reply2, then 403 awaiting_reply
Hours, FAQ and photo flows (they texted first)UnlimitedUnlimited

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.sent echo 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.

ZeroSettle plans (zerosettle.io, checked October 12, 2026)
PlanPriceFits
Pro$49/monthOne number to start, 5 new contacts a day, unlimited messages with people who message you first, no setup fee, self-serve
GrowthFrom $599/moSeveral 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

  1. 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.
  2. Webhook node, n8n Docs (Raw Body, Respond, test and production URLs). Checked October 8, 2026.
  3. Using the Code node, n8n Docs, with Get the binary data buffer and Enable modules in Code node. Checked October 8, 2026.
  4. Define custom variables, n8n Docs ($vars and plan availability). Checked October 8, 2026.
  5. n8n v2.0 breaking changes, n8n Docs (environment access in the Code node, Publish replacing Activate). Checked October 8, 2026.
  6. Webhook node source code, n8n on GitHub (Raw Body is written to the binary property data). Checked October 8, 2026.
  7. HTTP Request node, n8n Docs (Header Auth, Batching, Timeout, Never Error). Checked October 8, 2026.
  8. Trigger Zap workflows from webhooks, Zapier Help Center. Checked October 8, 2026.
  9. Use JavaScript code in Zap workflows, Zapier Help Center. Checked October 8, 2026.
  10. Webhooks, Make Apps Documentation (JSON pass-through, Get request headers, default responses). Checked October 8, 2026.
  11. Text and binary functions, Make Help Center (sha256 with an HMAC key). Checked October 8, 2026.

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 and zerosettle.io as of October 12, 2026. Zapier, n8n and Make details come from their own documentation, listed under Sources and checked October 8, 2026. Larkspur Lane Bakery and Jess L. are fictional, and nothing here is legal advice.

Text your customers from your own iMessage number

ZeroSettle gives your business its own phone number on real iMessage, running on Apple hardware we operate for you in a server facility. Your code sends with one API call and hears every reply on a signed webhook.

Pro is $49 a month with a 30-day money-back guarantee. Growth, for several numbers working as one, is from $599/mo.