Skip to main content

What you are wiring

Any CRM connects to BlueReacher through two HTTP calls and one identifier. Outbound. Your CRM automation calls send-message when a record hits a condition. New lead created, stage changed, no reply in three days. Inbound. BlueReacher posts a webhook to your endpoint every time a contact replies. Your endpoint writes that reply onto the matching CRM record. Identity. external_id ties the two directions together. Set it to your CRM record ID on the way out, read it on the way in, and every reply lands on the right record without phone number matching. If your CRM can send an HTTP POST and receive one, it can run on BlueReacher. That covers HubSpot, Salesforce, Pipedrive, Close, GoHighLevel, and anything built in house.

Before you start

  1. Copy your API key from the dashboard under Settings, API Keys. Keys are prefixed bluereacher_.
  2. Copy the line_id of the line you want to send from, under Settings, Lines. Lines are dedicated iMessage lines, managed for you, with no A2P registration required.
  3. Stand up an HTTPS endpoint that accepts POST and returns 200. Register its URL under Settings, Webhooks, and copy the signing secret shown there.

Outbound: your CRM calls send-message

Purpose. Send one message from one of your lines to one contact, stamped with your CRM record ID. Method and path. POST https://api.bluereacher.com/functions/v1/send-message Auth. Pass Authorization: Bearer bluereacher_your_api_key and Content-Type: application/json. Call this from your server or your automation platform. Never from browser code, since the key would be exposed.

Request fields

Response fields

Example request

Example response

Errors

Errors return a JSON body with code and message. Log both against the CRM record so failed sends are visible to your team.

Inbound: replies posted into your CRM

BlueReacher POSTs to your registered webhook URL whenever a contact replies.
A minimal handler that writes the reply back to your CRM:
Two rules. Verify the x-bluereacher-signature HMAC before trusting a payload. Return 200 within 10 seconds, then do the CRM write in the background. Non-200 responses are retried with backoff for 24 hours, so slow handlers cause duplicates.

Identity mapping with external_id

Set external_id to the primary key of the record you want the conversation attached to. Contact ID, lead ID, deal ID, your choice. Pick one object type and stay with it. The value is stored on the BlueReacher contact on first send and returned on every event for that contact after that. Your webhook handler never has to normalize a phone number or guess which duplicate record to update. If a contact replies before you have ever messaged them, external_id is null, so fall back to a phone number lookup and stamp the record on your next send.

HubSpot

Outbound runs from a workflow. Add a Send a webhook action, method POST, URL https://api.bluereacher.com/functions/v1/send-message, and a custom payload with line_id, to mapped to the contact’s phone, content, and external_id mapped to hs_object_id. Custom payloads and custom headers need Operations Hub Professional. On lower tiers, use a Custom code action in Node and call the API with fetch, which also lets you branch on the response. Inbound goes to your own endpoint, not to HubSpot directly. On message.received, call HubSpot’s Notes API, then associate the note to the contact whose hs_object_id equals external_id. Set a last_imessage_reply property in the same call so lists and workflows can act on it.

Salesforce

Create an External Credential with a Custom authentication header, name it Authorization, value Bearer bluereacher_your_api_key. Attach it to a Named Credential pointing at https://api.bluereacher.com. This keeps the key out of Flow. Build a record-triggered Flow on Lead or Contact. Add an HTTP Callout action against that Named Credential, path /functions/v1/send-message, method POST. Map to from the phone field, content from a formula or text template, and external_id from {!$Record.Id}. Inbound needs an Apex REST endpoint, for example @RestResource(urlMapping='/bluereacher/*') exposed through a Site or Connected App. Query the record where Id = external_id, insert a completed Task with the reply text, and update any status field your reps watch.

Zapier, n8n, and Make

All three use the same shape. No custom code required. Outbound. Zapier: Webhooks by Zapier, POST action, add the Authorization header and a JSON payload. n8n: HTTP Request node, POST, Header Auth credential, JSON body. Make: HTTP, Make a request module, POST, header plus raw JSON body. Map external_id from the CRM record ID field that your trigger step already returns. Inbound. Zapier: Catch Hook trigger. n8n: Webhook node. Make: Custom webhook module. Copy the generated URL into Settings, Webhooks. Then add a filter for event equals message.received and a CRM update step keyed on external_id.

Launch checklist

  • Send one live message with external_id set and confirm it appears on the CRM record.
  • Reply from the recipient device and confirm the webhook lands within seconds.
  • Break the signature on purpose and confirm your handler returns 401.
  • Return a 500 on purpose and confirm the retry arrives, then confirm your CRM write is idempotent on message_id.
  • Turn on your automation for a small segment before the full list.