Sonar
MessagingConnect AI agents to Sonar, a conversational SMS and MMS platform for business texting sold as Marchex Sonar. Agents send messages and campaigns, manage customers and follow-ups, track conversion events, and react to inbound messages and subscription changes in real time so text conversations get handled the moment they arrive.
What This Integration Enables
Sonar, sold as Marchex Sonar, is a conversational SMS and MMS platform rather than a wholesale gateway, and the distinction runs through the whole API. There is no sender number parameter anywhere. Sonar owns the account's numbers, picks the one already belonging to that customer's thread, and Get Available Phone Number reports which number is free to message from. What the API is built around instead is the thread and its owner: customers with custom properties, conversations that expand from an identifier, agent assignment and unassignment, tags applied to individual messages, campaigns, and follow up strategies attached per customer. Building a bulk blaster on this connector would be fighting its shape.
It is also one of the few platforms in this category whose webhook surface can genuinely carry a trigger, which is why this connector ships eleven of them. Sonar's webhook route is a collection rather than a single global slot: creating a subscription returns a durable record with its own identifier, listing returns an array of independent records, and updates and deletes address one record at a time. Registering FlowRunner's subscription therefore does not destroy an endpoint the team already had. One Sonar webhook can carry several event settings at once and every payload names the event that produced it, so the connector registers a single subscription covering whichever triggers are enabled and attributes each delivery by the event it declares.
The rest of the surface is unusually careful about refusing ambiguous work rather than widening it, and that behavior is worth designing around. An unqualified personal data export is rejected instead of interpreted, so a flow has to say which customer it means. A role with no permissions is not created. A webhook with no events is not created, because a subscription that could never fire is a silent failure waiting to happen. Send Message refuses the entire send when any tag in its list does not already exist, which means a null mapped in from a flow field kills the message loudly instead of quietly dropping the tag. That posture makes Sonar a good platform for autonomous agents specifically because the failures arrive as failures.
Without FlowRunner
With FlowRunner
Use Case Scenarios
An inbox where nothing sits unowned
A support team runs texting as a first class channel and the backlog problem is always the same, which is messages that arrive with nobody assigned. On New Unassigned Message fires the instant one lands. The agent calls Get Conversation to read the whole thread rather than the single inbound line, then Get Customer for subscription state, assigned number, and custom properties. It classifies the request, calls Append Tag To Message so the classification lives on the message itself, and posts the thread with its context into Slack for the desk that owns it. On Team Member Assignment confirms a human picked it up, and if nothing has happened inside the team's own window the agent escalates rather than letting silence look like handling. Unassign Agent returns a thread to the queue when the assigned owner is out.
Campaigns that report what they actually produced
A revenue team enrolls customers into lifecycle campaigns from events elsewhere in the stack. When a purchase lands in Shopify, the agent calls Add Or Update Customer to keep names, timezone, zipcode, and custom properties current, then Send Personalized Campaign so the campaign's templates interpolate real values rather than falling back to generic copy. Add Follow-Up To Customer attaches the strategy that fits the segment, and Remove Follow-Up From Customer cancels it the moment the customer converts, which is the difference between a helpful sequence and an annoying one. Track Event records the conversion against the customer with a name and a value, so the attribution question gets answered inside the messaging platform. On Customer Unsubscribed removes the customer from downstream sequences in HubSpot immediately rather than at the next sync.
A data request that produces evidence before it destroys any
A privacy request arrives referencing a phone number. The agent resolves it with Get Customer, confirming exactly one customer matches and reporting their subscription state, custom properties, and assignee. It then calls Export Customer Personal Data, which returns the customer's details and their full message history either inline or emailed as a CSV, and files that export in Google Drive against the request. Only then does it stop. What it does not do is call Delete Customer Personal Data, because that erasure is asynchronous and irreversible. A request phrased as "close this out" is very often satisfied by Close Customer instead, which ends the thread while leaving the customer and their history intact and lets a new inbound message reopen it.
Human-in-Loop Highlight
Sonar draws the line itself, and the connector respects where the vendor put it. Close Customer ends a conversation and changes nothing else, and an inbound message reopens the thread. Delete Customer Personal Data queues an erasure that is asynchronous and irreversible, and Sonar's own documentation says to use Close Customer instead when what you meant was to end the conversation. Those two operations sit next to each other in the same action list, and the requests that produce them arrive from the same queue in nearly the same words. That is the trap: not that erasure is dangerous, which is obvious, but that the language a ticket uses does not distinguish it from something routine.
So the agent does the whole case and hands over the one decision that cannot be undone. Into Slack: "Data request from +1 415 555 0142. Get Customer resolves to exactly one record, Dana Whitfield, subscribed, double opted in 2026-03-04, assigned to Priya, 8 custom properties, 61 messages since 2025-11-02. Export Customer Personal Data completed, CSV filed in Drive at the link below, so the record survives this either way. The request text says 'please close my account and remove me'. Delete Customer Personal Data queues an irreversible erasure and cannot be recalled once it runs. Close Customer would end the thread and leave the history. Which one is this?"
Everything expensive has already happened when that message arrives. The identity is proven against a single record rather than a phone number that might match two. The export already exists, so the erasure is not also the destruction of the evidence that it was performed. And the ambiguity in the customer's own wording is quoted rather than resolved by a model's best guess. That is human-in-the-loop as Orchestration as a Service defines it, where the digital andon cord gets pulled at the one point in the flow where being wrong is permanent. Two other operations belong on the same side. Create Account provisions a new, separately billed Sonar account and is a reseller path rather than a way to reset an existing one. Create Role builds a permission set from Sonar's published catalog of seventy one permissions, and an agent that provisions access is deciding what other people are allowed to do.
Agent Capabilities
27 actionsMessaging
3- Send Message Sends an SMS or MMS to one number, opening or continuing that customer's thread. The media URL may be an image or a contact card. Tags may be appended but each must already exist, because Sonar refuses the whole send when one does not. The response reports when the customer has opted out.
- Append Tag To Message Adds an existing tag to a message already sent or received, addressed by its external message identifier. That identifier is exactly what the message triggers deliver, which makes this the natural write back after a flow classifies something.
- Send Double Opt-In Prompt Sends the account's configured opt in prompt. It is a real outbound message and is billed as one, so it belongs in a consent flow rather than in a health check.
Campaigns
2- Send Campaign Enrolls one number into an existing campaign by its slug, optionally scheduled for a future timestamp.
- Send Personalized Campaign Enrolls a number into a campaign along with the customer details its templates interpolate: names, timezone, zipcode, and arbitrary custom properties. Use this when the campaign copy depends on knowing who it is talking to.
Customers
7- Add Or Update Customer Creates or updates a customer keyed by phone number, storing names, email, picture, zipcode, timezone, an external identifier, and custom properties, and optionally assigning a team member by email. Leave the subscribed setting unset on an update so Sonar keeps the consent value the customer's own behavior produced.
- Get Customer Looks a customer up by phone number, email, or customer identifier, returning subscription state, unsubscribe time, custom properties, assigned number, assignee, and double opt in state. At least one identifier is required, so an unqualified lookup is refused rather than widened.
- Close Customer Closes the conversation thread. The customer and their history are untouched and a new inbound message reopens it, which makes this the reversible way to end an exchange.
- Unassign Agent Returns the conversation to the unassigned queue, used when the owner is unavailable or the thread was routed wrong.
- Delete Customer Property Removes one named custom property from a customer and affects nothing else.
- Add Follow-Up To Customer Attaches one specific follow up strategy to one customer, which is how a lifecycle sequence starts for an individual rather than a segment.
- Remove Follow-Up From Customer Cancels one follow up strategy for one customer. Calling this the moment a customer converts is what keeps a sequence from continuing to chase someone who already bought.
Events
1- Track Event Records a conversion against a customer with a name and a value, which is how messaging activity gets attributed to an outcome inside Sonar rather than in a separate analytics stack.
Conversations
1- Get Conversation Expands a conversation identifier into the full thread and its customer. Every message bearing webhook payload carries one, so this is how a trigger event becomes usable context.
Phone Numbers
1- Get Available Phone Number Reports a number the account can message from. Sonar assigns senders itself, so this is a read rather than a way to choose one.
Users and Roles
5- Get Users Returns team members with their role identifier, active state, and invitation status.
- Get User Returns one team member by identifier.
- Invite User Invites a team member by email, optionally with a role. Without one, Sonar assigns the default member role.
- Get Account Roles Returns custom roles with their permissions and holder counts. This requires the custom roles feature to be enabled on the plan, and Sonar answers with an error rather than an empty list when it is not.
- Create Role Creates a role from Sonar's published permission catalog. At least one permission is required, because a role that can do nothing is not created.
Accounts
1- Create Account Provisions a new, separately billed Sonar account and returns its publishable key and private token. This is a reseller and multi location path, not a way to reset an account that already exists.
Privacy
2- Export Customer Personal Data Produces a subject access export of one customer's details and full message history, either in the response body or emailed as a CSV. At least one identifier is required, so an unqualified export is refused rather than widened.
- Delete Customer Personal Data Queues erasure of a customer's personal data. It is asynchronous and irreversible, and the vendor's own guidance is to use Close Customer when the intent was only to end a conversation.
Webhooks
4- Get Webhooks Returns the account's webhook subscriptions as independent records, each with its own identifier and failure counter.
- Create Webhook Creates a webhook subscription with at least one event, since a subscription that could never fire is not created. Use this for an endpoint consumed outside FlowRunner, because the triggers register and remove their own.
- Update Webhook Updates an existing webhook subscription. Including events subscribes them, so leaving the event list empty leaves the current set unchanged rather than clearing it.
- Delete Webhook Removes a webhook subscription by identifier, which is how a subscription is unsubscribed from everything.
Triggers
11 triggersEvent Triggers
11- On New Assigned Message Fires when an inbound message arrives on a thread that already has an owner. Filters on customer phone number and message text, so a flow can watch one account or one keyword rather than the whole inbox.
- On New Unassigned Message Fires when an inbound message arrives with nobody holding the thread. This is the backlog event, and the one worth wiring first, because an unowned message is the failure mode a texting inbox actually has.
- On Outbound Message Fires when a message goes out from the account, which is how a flow logs or audits sends made by people in the Sonar app rather than by the agent.
- On Customer Created Fires when a new customer record appears, whether from an inbound text or an API write. The natural place to enrich a record from the CRM before anyone replies to it.
- On Customer Subscribed Fires when a customer's subscription state becomes subscribed, which is the moment downstream systems are allowed to include them again.
- On Customer Unsubscribed Fires when a customer opts out. Propagating this immediately is what keeps a suppression from being honored in Sonar and ignored everywhere else.
- On Customer Double Opted In Fires when a customer completes double opt in, which is the event a consent record should be written from rather than the initial prompt.
- On Team Member Assignment Fires when a conversation is assigned to a team member, so a flow can confirm a human actually picked up a thread the agent routed.
- On Customer State Changed Fires when a customer's state changes, filterable by the resulting state, which is how a flow reacts to a specific transition rather than to all of them.
- On Tag Added To Message Fires when a tag is applied to a message, filterable by tag name. Useful for turning a human's manual classification into downstream work.
- On Tag Removed From Message Fires when a tag is removed from a message, filterable by tag name, which catches a correction as deliberately as the original classification. Two operational facts belong in any trigger design here. Sonar retries a failed delivery several times over roughly half an hour unless the endpoint answers successfully, and every delivery carries a unique identifier for de duplication. Sonar's documentation describes no signature header, shared secret, or source IP range for outbound webhooks, so a delivery cannot be cryptographically verified as genuine and the callback URL should be treated as the secret.
Frequently Asked Questions
What can FlowRunner do with Sonar?
FlowRunner agents can run Send Message, Append Tag To Message, and Send Double Opt-In Prompt in Sonar, plus 24 more actions.
Does connecting Sonar to FlowRunner require OAuth?
No. Sonar connects to FlowRunner with an API key, no OAuth flow required.
Can Sonar trigger a FlowRunner workflow automatically?
Yes. Sonar supports 11 triggers that can start a FlowRunner workflow automatically.
Start building with Sonar
$100 in credits. No card required. Connect in minutes.