Turn up whatgets replies.

Test up to 50 versions of every step: split them evenly, by weight, or let replies pick the winner. Then pipe every send, reply and bounce into your own stack.

Version A: Quick idea for {company}

0%tested

Sent
250
Replies
6

Version B: {first_name}, a question

0%tested

Sent
250
Replies
9

Version C: Saw the Lisbon news

100%winner

Sent
1,250
Replies
13

Version D: Worth 15 minutes?

0%tested

Sent
250
Replies
4

Step 1 · First email2,000 people

C won on replies, 13 from 250. The 1,000 people left get C.

Split
Winner by

Daily cap 50 per inbox

Gap 10 minutes

A simulated round with example subject lines: every number here is made up, and a new draw each time. Your real reply rates are yours to find.

Every step is a channel.

A sequence runs up to 50 steps, each waiting its own delay and sending only inside your hours. Every step brings its own versions, up to 50, split evenly, by weight, or by a winner picked on replies, clicks or opens.

Alex Morgan, Northwind

4 steps of a possible 50

An example sequence for Alex Morgan at Northwind over 18 days, starting on a Tuesday. The first email, with four versions and a winner picked by replies, sends on day 1. The follow-up, two versions split 70 to 30 by weight, sends three days later. The new angle, three versions split evenly, is due on Saturday, day 12, and waits for Monday, day 14. Alex replies on day 16, so the last touch, due on day 18, never sends.

Patch it into your stack.

Every send, reply, bounce and stop leaves the back of the desk as a signed event. Plug in the tools you already run, or drive the whole thing from code.

  1. message.queued
  2. message.sent
  3. message.failed
  4. message.uncertain
  5. message.cancelled
  6. message.snippets_fallback
  7. delivery_event.recorded
  8. inbound_message.received
  9. enrollment.stopped
  10. enrollment.completed
  11. campaign.status_changed
  12. connection.health_changed
  13. import.completed
  14. export.completed
  15. suppression.created
  16. ai.budget_warning
  17. ai.budget_exceeded
  18. endpoint.test
  19. webhook_endpoint.disabled
  • Your warehouseSends, deliveries, bounces
  • Your CRMReplies, stops, unsubscribes
  • Your alertsCampaign status, inbox health
The back of the desk: an output for each of the 19 webhook events. In this example patch,message.sent, delivery_event.recorded to your warehouse; inbound_message.received, enrollment.stopped, suppression.created to your CRM; campaign.status_changed, connection.health_changed to your alerts.
  • 19 signed events, retried while your server is down. Replay an endpoint’s history or rotate its secret from the API.
  • A REST API with idempotency keys and cursor pagination, at 6,000 requests a minute per workspace.
  • TypeScript and Python SDKs that walk every page for you.
  • A CLI, with every resource as a command.
  • An MCP server, so Claude and other assistants work with only the scopes you grant.
import { Norbelys } from "@norbelys/sdk";

const norbelys = new Norbelys(); // reads NORBELYS_API_KEY
const campaigns = norbelys.campaigns.list({ limit: 20 });

for await (const campaign of campaigns) {
  console.log(campaign.name, campaign.status);
}

Everything for developers

An example patch: any endpoint can take any of the 19 events. There’s no built-in CRM sync, so your CRM gets them through an endpoint of your own.

Clean signal.

A test is only as good as what it counts. Each number means one thing, and the noise stays out of it.

Specifications: what each number counts, and the limits
MeasureValueCondition
Metering
SentAcceptedby the receiving mail server
RepliesPeople onlyauto-replies and out-of-office notes left out
Opens & clicksOff by defaulton your own tracking domain, bots left out
Bounces & unsubscribesSuppressedacross every campaign
Capacity
VersionsUp to 50a step, split evenly, by weight or by a winner
StepsUp to 50a sequence, each with its own delay
In and out
Rate limit6,000requests a minute, per workspace
ExportsCSV or JSONLpeople and their history, any time

The desk at the top of this page plays made-up numbers. These are the rules your real ones follow.

First experiment by half past nine.

Most of it is plumbing you already know: a key, a list and the versions you’d write anyway.

  1. 9:00

    Connect inboxes, make a key

    Google Workspace, Microsoft 365 or any SMTP inbox. Then a key that can do what your role can, and nothing more.

  2. 9:05

    Import your people

    Send people through the API, or drop in a CSV. Every column becomes a field you can write with.

  3. 9:20

    Add versions to each step

    Up to 50 versions a step. Split them evenly, by weight, or let replies, clicks or opens pick the winner.

  4. 9:30

    Start the experiment

    From the app, the API or the CLI. The sends go out from your inboxes, inside your hours.

Questions,answered.

Still curious? Read the docs

How does the automatic winner work?

You choose what decides it: replies, clicks or opens. While the test runs, every version goes to as many people. Once the window has passed (a week by default) and each version has gone to enough people (100 by default), the best rate per email sent wins and goes to everyone left in that step. A tie goes to the version listed first, and you can name a winner yourself at any time.

How many versions and steps can I test?

Up to 50 versions on every step, and up to 50 steps in a sequence, each with its own delay. Weights run from 1 to 100, and a version’s share is its weight over the total.

Which events can I subscribe to?

All 19, each signed: message.queued, message.sent, message.failed, message.uncertain, message.cancelled, message.snippets_fallback, delivery_event.recorded, inbound_message.received, enrollment.stopped, enrollment.completed, campaign.status_changed, connection.health_changed, import.completed, export.completed, suppression.created, ai.budget_warning, ai.budget_exceeded, endpoint.test and webhook_endpoint.disabled. Replay an endpoint’s history or rotate its secret from the API.

What are the API limits?

6,000 requests a minute per workspace, reported on every response. Every change takes an idempotency key, so a retry never sends a second email, lists page with cursors, and errors come back as problem details with a stable code.

Can I run it from Claude?

Yes. The MCP server gives Claude and other MCP clients the same operations as the API, in the workspace you choose and only with the scopes you grant. There’s a CLI too, with every resource as a command.

Do you count bot opens?

No. Open and click tracking is off until you turn it on, runs on your own tracking domain, and leaves bots out. Sent means the mail server accepted the email, and replies leave out auto-replies and out-of-office notes.

Can I export everything?

Yes, any time: people and their history (messages, send attempts, delivery events and replies) as CSV or JSONL, from the app or the API.

Your next customeris one reply away.

Connect an inbox, upload your list and launch your first campaign today. It’s $20 a month, everything included.