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}
- Sent
- 250
- Replies
- 6
Version B: {first_name}, a question
- Sent
- 250
- Replies
- 9
Version C: Saw the Lisbon news
- Sent
- 1,250
- Replies
- 13
Version D: Worth 15 minutes?
- Sent
- 250
- Replies
- 4
Step 1 · First email2,000 people
C won on replies, 13 from 250. The 1,000 people left get C.
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
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.
- 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
- webhook_endpoint.disabled
- Your warehouseSends, deliveries, bounces
- Your CRMReplies, stops, unsubscribes
- Your alertsCampaign status, inbox health
- 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);
}from norbelys import Norbelys
with Norbelys() as norbelys: # reads NORBELYS_API_KEY
campaigns = norbelys.campaigns.iter(query={"limit": 20})
for campaign in campaigns:
print(campaign["name"], campaign["status"])norbelys login
norbelys campaigns list --limit 20 --jsonAn 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.
| Measure | Value | Condition |
|---|---|---|
| Metering | ||
| Sent | Accepted | by the receiving mail server |
| Replies | People only | auto-replies and out-of-office notes left out |
| Opens & clicks | Off by default | on your own tracking domain, bots left out |
| Bounces & unsubscribes | Suppressed | across every campaign |
| Capacity | ||
| Versions | Up to 50 | a step, split evenly, by weight or by a winner |
| Steps | Up to 50 | a sequence, each with its own delay |
| In and out | ||
| Rate limit | 6,000 | requests a minute, per workspace |
| Exports | CSV or JSONL | people 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.
- 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.
- 9:05
Import your people
Send people through the API, or drop in a CSV. Every column becomes a field you can write with.
- 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.
- 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.