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

ToolplatformA connection needs
InstantlyinstantlyapiKey with full access. workspace is optional and must be the key's own.
SmartleadsmartleadapiKey, loginEmail and password. We sign in to add each mailbox for you.
EmailBisonemailbisonappUrl (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.

FieldRange
warmupTurn warmup on for each mailbox. On unless you turn it off.
warmupLimit1 to 500Warmup emails a day at most.
warmupIncrement1 to 100Warmup emails added each day until the limit.
warmupReplyRate0 to 100Share of warmup emails that get a reply, in percent.
dailyLimit1 to 1000Campaign emails a day, per mailbox.
sendingGapMinutes0 to 1440Minutes between campaign emails (Instantly, Smartlead).
slowRampInstantly's slow ramp-up.
customTrackingTrack opens on each mailbox's own domain. We add the record for you: inst.<domain> for Instantly, open.<domain> for Smartlead. EmailBison has none.
tagIdsup to 50The 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 its reason and a message. Only a mailbox that is set up (active) can be exported, so one still being set up is mailbox_not_active. None is ever left out silently.

Each export then runs on its own, in steps:

step
client_idTrusting the tool's Google app on the domain. Exports on one domain share this.
trackingAdding the tracking record, when custom tracking is on.
connectPutting the mailbox in the tool. Instantly's takes up to five minutes.
settingsWarmup, limits and tags.
donestatus: 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.

reasonWhat to do
api_key_invalidThe tool refused the API key. Paste a new key with full access in the connection.
invalid_credentialsThe tool refused the sign-in email or password. Update them in the connection.
missing_credentialsThis tool needs more sign-in details. Fill in every field of the connection.
workspace_expiredThe workspace at the tool has expired. Renew it there, then retry.
workspace_not_foundThe tool has no workspace by that name. Check the workspace in the connection.
trial_expiredThe trial at the tool has ended. Upgrade the account there, then retry.
no_mailbox_slotsThe account at the tool has no room for more mailboxes. Raise its limit there, then retry.
account_capacity_reachedThe account at the tool has reached its limit. Raise it there, then retry.
instantly_trial_limit_reachedAn Instantly trial takes only a few mailboxes. Upgrade the plan in Instantly, then retry.
smartlead_password_expiredSmartlead asks for a new password. Change it there, update the connection, then retry.
mailbox_already_existsThe mailbox is already in the tool. Nothing to do, or remove it there and retry.
mailbox_already_in_another_accountThe mailbox is in another account at the tool. Remove it there, then retry.
mailbox_already_exists_other_workspaceThe mailbox is in another workspace at the tool. Remove it there, then retry.
google_account_disabledGoogle has disabled this mailbox. Contact support.
google_password_changedThe mailbox's password changed while it was being added. Retry the export.
google_password_change_requiredGoogle asks for a new password on this mailbox. Contact support.
sequencer_account_blockedThe tool has blocked this account. Contact the tool, then retry.
sequencer_unavailableThe tool can't be reached right now. Try again shortly.
connection_invalidThe tool no longer accepts this connection. Update its details or check it again.
connection_deletedThe connection was removed. Export the mailbox again through another one.
conflictAnother change to this mailbox at the tool got in the way. Retry the export.
otherThe 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.