Sequencers
Connect a sending tool account once, then export mailboxes into it with warmup and limits set.
A sequencer is the tool your customer sends cold email from: Instantly, Smartlead or EmailBison. Connect an account there once, then export mailboxes into it: one, a list, or every mailbox on a domain. For each mailbox we trust the tool's Google app on the domain, add its tracking record if you turned custom tracking on, put the mailbox into the tool, and set its warmup, limits and tags.
Nothing here is billed. Connecting, exporting, retrying and removing are free.
Not on every account yet
Sequencers are switched on account by account. Until they are on for yours, every call here
answers 422 not_available. Sub-resellers can't use them yet.
What each tool needs
| Tool | platform | A connection needs |
|---|---|---|
| Instantly | instantly | apiKey with full access. workspace is optional and must be the key's own. |
| Smartlead | smartlead | apiKey, loginEmail and password. We sign in to add each mailbox for you. |
| EmailBison | emailbison | appUrl (your instance), apiKey, loginEmail and password. workspace is optional. A white-labelled instance with its own Google app also needs its clientId. |
GET /v1/sequencers/platforms answers the same list, with each field, whether it is required,
and the range of every setting. Build a form from it rather than writing the ranges down.
Connect an account
curl -X POST https://resellerhq.com/api/v1/sequencer-connections \
-H "Authorization: Bearer $RHQ_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{ "name": "Acme Instantly",
"platform": "instantly",
"apiKey": "…",
"settings": { "warmupLimit": 20, "dailyLimit": 30, "customTracking": true } }'We check the account with the tool before saving it. One the tool refuses is answered 422
with the reason (api_key_invalid, invalid_credentials, missing_credentials,
workspace_expired or workspace_not_found), and nothing is saved. If the tool can't be
reached, it's 502 sequencer_unavailable: try again.
Keys and passwords are never shown again. They are kept sealed by our mailbox platform and
used only to add mailboxes for you. ResellerHQ never stores them, and no answer, event or log
line carries them: a connection only says hasApiKey and hasPassword.
Each connection is checked with its tool every day. One the tool stops accepting turns
status: invalid with a statusReason and a statusMessage saying what to do, and sends
sequencer_connection.invalid. New exports to it are refused with connection_invalid until
you fix it with PATCH /v1/sequencer-connections/{id} (new details are checked first) or it
passes POST /v1/sequencer-connections/{id}/validate.
Settings
Applied to every mailbox exported through the connection. Null leaves the tool's own default.
| Field | Range | |
|---|---|---|
warmup | Turn warmup on for each mailbox. On unless you turn it off. | |
warmupLimit | 1 to 500 | Warmup emails a day at most. |
warmupIncrement | 1 to 100 | Warmup emails added each day until the limit. |
warmupReplyRate | 0 to 100 | Share of warmup emails that get a reply, in percent. |
dailyLimit | 1 to 1000 | Campaign emails a day, per mailbox. |
sendingGapMinutes | 0 to 1440 | Minutes between campaign emails (Instantly, Smartlead). |
slowRamp | Instantly's slow ramp-up. | |
customTracking | Track opens on each mailbox's own domain. We add the record for you: inst.<domain> for Instantly, open.<domain> for Smartlead. EmailBison has none. | |
tagIds | up to 50 | The tool's own tag IDs to add to each mailbox. |
A change to the settings applies to mailboxes exported from then on.
Export mailboxes
curl -X POST https://resellerhq.com/api/v1/sequencer-exports \
-H "Authorization: Bearer $RHQ_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{ "connectionIds": ["sqn_01K6..."], "mailboxDomainId": "mdm_01K6..." }'Send mailboxIds (up to 1,000) or mailboxDomainId for every mailbox on a domain, and one to
five connectionIds. You get one export per mailbox and connection: 12 mailboxes to 2 tools are
24 exports. The answer (202) has three lists:
created: the new exports.alreadyExported: pairs that already had one, on its way, done or failed. A repeat never makes a second.skipped: each mailbox that got no export, with itsreasonand amessage. Only a mailbox that is set up (active) can be exported, so one still being set up ismailbox_not_active. None is ever left out silently.
Each export then runs on its own, in steps:
step | |
|---|---|
client_id | Trusting the tool's Google app on the domain. Exports on one domain share this. |
tracking | Adding the tracking record, when custom tracking is on. |
connect | Putting the mailbox in the tool. Instantly's takes up to five minutes. |
settings | Warmup, limits and tags. |
done | status: completed, with the tool's own accountId for the mailbox. |
A step that goes wrong for a passing reason is tried again with backoff: the export stays
queued with retrying: true, lastError and nextRunAt. One that needs something fixed at
the tool stops as failed with a reason, and sends sequencer_export.failed.
GET /v1/sequencer-exports lists them, one row per mailbox and tool, filtered by
connectionId, mailboxId, mailboxDomainId, platform or status. Its counts say how many
are in each status across every page.
Which tools a mailbox is in
GET /v1/mailboxes and GET /v1/mailboxes/{id} show each mailbox's sequencers: the
connection, tool and status of every export it has that wasn't removed. GET /v1/mailboxes
filters by sequencerConnectionId or platform, and notExported=true lists the mailboxes in
no tool at all.
When an export fails
Fix the reason at the tool, then retry: POST /v1/sequencer-exports/{id}/retry for one, or
POST /v1/sequencer-exports/retry with up to 500 ids. Each export also has reasonMessage,
which says the same as this table.
reason | What to do |
|---|---|
api_key_invalid | The tool refused the API key. Paste a new key with full access in the connection. |
invalid_credentials | The tool refused the sign-in email or password. Update them in the connection. |
missing_credentials | This tool needs more sign-in details. Fill in every field of the connection. |
workspace_expired | The workspace at the tool has expired. Renew it there, then retry. |
workspace_not_found | The tool has no workspace by that name. Check the workspace in the connection. |
trial_expired | The trial at the tool has ended. Upgrade the account there, then retry. |
no_mailbox_slots | The account at the tool has no room for more mailboxes. Raise its limit there, then retry. |
account_capacity_reached | The account at the tool has reached its limit. Raise it there, then retry. |
instantly_trial_limit_reached | An Instantly trial takes only a few mailboxes. Upgrade the plan in Instantly, then retry. |
smartlead_password_expired | Smartlead asks for a new password. Change it there, update the connection, then retry. |
mailbox_already_exists | The mailbox is already in the tool. Nothing to do, or remove it there and retry. |
mailbox_already_in_another_account | The mailbox is in another account at the tool. Remove it there, then retry. |
mailbox_already_exists_other_workspace | The mailbox is in another workspace at the tool. Remove it there, then retry. |
google_account_disabled | Google has disabled this mailbox. Contact support. |
google_password_changed | The mailbox's password changed while it was being added. Retry the export. |
google_password_change_required | Google asks for a new password on this mailbox. Contact support. |
sequencer_account_blocked | The tool has blocked this account. Contact the tool, then retry. |
sequencer_unavailable | The tool can't be reached right now. Try again shortly. |
connection_invalid | The tool no longer accepts this connection. Update its details or check it again. |
connection_deleted | The connection was removed. Export the mailbox again through another one. |
conflict | Another change to this mailbox at the tool got in the way. Retry the export. |
other | The tool refused this mailbox. Retry, or contact support if it fails again. |
One EmailBison login, one workspace at a time
An EmailBison login works in one workspace at a time, so exports through the same login to
different workspaces take turns. Those for one workspace run together; the others wait at
connect until they are done.
Remove a mailbox from a tool
DELETE /v1/sequencer-exports/{id} takes the mailbox back out of the tool where its API allows
it (Instantly and EmailBison, removedAtSequencer: true) and marks the export removed, either
way. Smartlead has no way to, so take the mailbox out in Smartlead yourself. A removed pair can be
exported again.
DELETE /v1/sequencer-connections/{id} forgets the account and its keys. Mailboxes already in
the tool stay there. Exports still on their way stop as failed with connection_deleted.
From the dashboard
Everything above is in the dashboard too, under Sending tools, once sequencers are on for your account.
- Connect a tool asks for what that tool needs and checks it with the tool before saving. A key or password it refuses is said under its field. Editing a connection keeps a saved key or password unless you type a new one.
- Export to tool is on the mailbox list (by mailbox), a domain's page (every set-up mailbox on it) and the domain list. Choose up to five connections and it shows what will happen first, for example "12 mailboxes × 2 tools = 24 exports". A mailbox that can't go yet is listed with why, not dropped.
- The Exports tab lists every export with its status. Filter it to failed ones, read what to fix, and retry or remove them together.
- On Mailboxes, switch to the list by mailbox to see which tools each one is in, or filter to the ones not exported yet.
From an AI agent
The MCP server can list your connections, export mailboxes, follow the exports and retry or remove them, with a Read and manage key. It can't connect an account: the key and password would end up in the chat, so connect it in the dashboard or over the API first. Then ask, for example:
Export every mailbox on northwind-mail.com to Acme Instantly, then tell me which ones failed and what I need to fix.
The assistant calls export_mailboxes_to_sequencer, then list_sequencer_exports with
status: failed, and reads each reasonMessage back to you.
Sandbox
In the sandbox nothing reaches any tool, and exports finish within seconds. A key starting with
invalid is refused with api_key_invalid. A connection whose key starts with full takes
exports that fail with no_mailbox_slots, and go through once retried.
Permissions and webhooks
Reading needs sequencer.read, and connecting, exporting, retrying and removing need
sequencer.manage (a manage API key or above). See team and roles.
The sequencer_connection.* and sequencer_export.* events are listed in the
webhooks guide's Events table, with an example payload. None carries a
key or a password.