MCP-native messaging orchestration

Let your agent run the messaging while you sleep.

Email, WhatsApp and Telegram over MCP. Your agent verifies the domain, writes the automation and ships it, inside guardrails that live on the server and not in the prompt.

Automation canvasLive in production

Remind them an hour after the cart, then stop if they buy.

sending · mcp
// the tool the agent calls
create_automation({
  name: "Cart · 1h",
  entry: "t1", nodes: [ … ]
})

// response
{ id: "aut_9f2", status: "draft", valid: true }
  • Domain verified
  • 5 nodes validated
  • No loop without an exit
Cart abandonedTrigger · event
Wait 1 hourWait
Did they buy?Condition · yes / noyes / no
Email · reminderSend, on no
WhatsApp · reminderFallback, if email bouncedfallback
Claude CodeClaude Desktopclaude.aiChatGPTCursorVS CodeWindsurfClineGemini CLIZedn8nOpenAI Agents SDKVercel AI SDKLangChain

Greatmessagingtakesmorethananendpointthatsends.

Itisknowingwhotoreach,onwhichchannel,whentowait,andwhentostop.

Sendingturnsthatjudgmentintoautomationsyouragentwrites,runsandcorrectsacrossemail,WhatsAppandTelegram.

Yousetthelimits.Itdoestherest.

How it works

What an agent can actually do here

Connect over MCP

One OAuth connection hands your agent the tools: contacts, templates, campaigns, automations, inboxes. You pick the permissions on the consent screen and change them later from Connections, without reconnecting.

Consent · Claude CodeOAuth 2.1

Pick what it can do. Change it later from MCP connections, without reconnecting.

contacts:readRead contacts, lists and tagsgranted
automations:writeCreate and edit automationsgranted
email:sendSend from verified domainsgranted
billing:writeChange plan and payment methoddenied

Write automations as code

A flow is a graph, so it can be written, read back and corrected. Validation refuses a loop with no exit, a wait set two different ways and a trigger that leads nowhere, before a single message leaves.

The flow, as JSON
{ "type": "wait", "duration": "PT1H" }
{ "type": "branch", "if": "contact.tags contains 'cliente'" }
{ "type": "message", "channel": "email" }
validateJourney()2 refused
CYCLELoop with no goto: the contact would never leave it
WAIT_AMBIGUOUSWait set as a duration and as a date
OKTriggers, conditions and sends all connected

Send inside guardrails

Verified domain, suppression list, required idempotency key, plan quota and a per-contact frequency cap. They are enforced server-side, so an agent that convinces itself it has permission still does not send.

Before every sendserver-side
Domain verifiedmail.tobo.solar · DKIM, SPF, DMARC
On the suppression list1 recipient dropped before the queue
Frequency cap1 message deferred to tomorrow
Idempotency keyThe retry writes nothing new
Plan quota412 of 3,000 this month

Read back what happened

Every contact that walks a flow leaves a step with a reason in words: skipped, in suppression, quota reached. That is the answer to why this person never got the email, without opening a container log.

Log · [email protected]get_automation_log
Wait 1 hourdone10:04
Did they buy?done · No branch11:04
Email · reminderskipped · in suppression11:04
WhatsApp · reminderdone · delivered11:05
Outcomes

Fewer moving parts. More of the loop closed.

The work an agent cannot do is the work nobody sees: the domain that was never verified, the retry that sent twice, the flow that died quietly.

Deliverabilityyour domain
SPFDKIMDMARC

mail.tobo.solar

Amazon SES · eu-west-1 · your own signature

Outcome 01

Delivery that stays yours

Mail leaves Amazon SES from your own verified domain with your own DKIM. The reputation you build is not pooled with ours.

What happenedAPI · MCP
Campaign · Septemberhuman opens 34%
Flow · Welcome3 stuck for 197 min
Outcome 02

A loop that closes

Campaign metrics, automation stats and stuck enrollments are API and MCP surfaces, not just a dashboard page. An agent that can send but cannot read the result never learns.

Same contact
Emailbouncedfallback
WhatsAppconsent on file · delivered
Outcome 03

Three channels, one flow

Email, WhatsApp and Telegram behind the same contact model, with consent held per channel, so a flow can fall back instead of stopping.

One workspace

Every part of the send, in one place.

Contacts and segments, templates, campaigns, flows, deliverability, attribution and the agent inbox. One model underneath, so nothing has to be kept in sync by hand.

Automation canvas

Triggers, waits, conditions, splits, tags, sends. Twenty-one node types, each one actually executed by the worker: a node that draws but does nothing is worse than not having it.

Added to a listTrigger
Bought before?
EmailWhatsAppAdd tag

Guardrail engine

Every send is checked against domain, consent, suppression, quota and frequency cap before it is queued, and what the cap held back is shown rather than dropped in silence.

Checksserver-side
Domainverified
Consentper channel
Cap1 deferred

Bring what you already have

Import contacts, tags, lists, campaigns and automations from ActiveCampaign. Nothing that arrives can send on its own: flows land as drafts.

Import from ActiveCampaign
Contacts1,211
Tags and lists48
Automations3 · drafts

Attribution you can query

UTM tagging on the way out, first and last touch on the way back, Stripe and PostHog as conversion sources, and CSV whenever you need it elsewhere.

Contact journey
utm_sourceclickStripe

First touch and last, within 90 days.

One inbox per agent

A real address on your domain that receives, threads and replies, with signed webhooks when mail lands and allow and block lists you control.

Re: quotereply received · signed webhook

“Anagentthatcansendbutcannotreadtheresultisnotautomatinganything.Itisjusttypingfaster.”

Sending · design note

FAQs

Everything worth asking before you connect it. Still missing something? Talk to us.

General

Resend works. Why would I switch?

You may not have to. If all you need is a send endpoint, keep it. Sending is for the point where an agent has to do the rest: build the follow-up, own an inbox, tell you why a message never left.

Do I have to use the MCP tools?

No. The REST API is the whole surface, with typed TypeScript and Python SDKs generated from an OpenAPI spec. MCP is the same thing, addressed differently.

Is the free plan a trial?

No. 3,000 messages a month, no card, no expiry date.

Guardrails and delivery

What stops an agent from sending something it shouldn't?

Verified domains, the suppression list, a required idempotency key, per-day volume and spend caps, and an audit log. All of it is enforced server-side, so a prompt cannot argue with it.

How do you have sending reputation if you're new?

Email goes out on Amazon SES from your own verified domain, with your own DKIM. The reputation you build is yours, and it is not pooled with ours.

Can I see why a contact did not get a message?

Yes. Every step a contact walks is recorded with a status and a reason in words, readable from the dashboard, the API and MCP.

Data and leaving

What happens to my automations if I leave?

They are graphs you can read. Fetch them as JSON over the API and take them with you. The import from ActiveCampaign works the same way, in reverse.

Where is my data stored?

Postgres in the European Union, Frankfurt. Email leaves from Amazon SES in eu-west-1, on your own verified domain.

Start with Sending

Give your agent something worth sending.

3,000 messages a month, free. No card. The MCP endpoint is on every plan, including this one.