Skip to content
← Tools

EmailBison

Sending and campaign QA

A cold email platform. It holds sender accounts, sequences and leads, and exposes almost all of it over an API so campaigns can be built and audited by script.

EmailBison is the other sending platform I work in. It does the same job as the rest of this category, and the difference that matters to me is that almost everything is reachable by API, so campaign QA can be a script rather than a person clicking through twenty campaigns.

How I use it

Everything gets read back. Before a launch I pull every campaign, every step, every sender and a sample of rendered leads, and check them against what the copy document says they should be. Presence, then logic, then quality: is the variable there, is the lead in the right segment, does the sentence read like a person wrote it. Three passes, in that order, because a quality judgement on a missing variable is wasted effort.

Infrastructure swaps go through a duplicate. Changing which senders a live campaign uses is not a field edit. I duplicate the campaign onto the new senders and move the uncontacted leads across, so the people who are mid sequence keep their thread and their history.

Signatures are checked on every attached sender, every time. They are a field on the sender account and they are easy to miss on a freshly connected batch, because nothing warns you. An unsigned mail from a named person is the fastest way to look like a robot.

Bulk variable updates go in batches of a few hundred. When copy changes and a variable has to be added to leads already loaded, I patch them in chunks rather than rebuilding the campaign, and confirm by fetching a sample back afterwards.

What I have learned the hard way

Moving leads to another campaign copies them. The leads stay in the source campaign as well, still scheduled. If you do not stop future emails in the source, the same person gets both sequences, and the first sign of it is a confused reply.

Page size is capped whatever you ask for. The campaign leads endpoint quietly returns a small page no matter what limit you send, so a script that asks for a thousand and takes the first response believes it has everything. Every count I take from that endpoint is paged to the end.

Search is fuzzy, so it will hand you the wrong person confidently. Never treat a search result as proof a lead exists. Assert an exact address match, or fetch the record by its id.

QA on a paused campaign returns nothing by default. Which looks exactly like a clean campaign with no problems. Pre launch campaigns are usually paused, so this is the state you are most likely to audit and most likely to misread.

Two small edges that cost a real send: a reply step gets Re: prepended automatically, so sending a subject that already has it produces Re: Re:. And sequence steps have no update endpoint, so editing one means deleting and recreating it, and the last remaining step cannot be deleted at all.

Resources

This is one part of a stack. The rest is on the tools page, and what I build with it is on work.

tools/emailbison.md
---
tool: EmailBison
role: Sending and campaign QA
category: Sending
url: https://mihajlomaiga.com/tools/emailbison
---

# EmailBison
A cold email platform. It holds sender accounts, sequences and leads, and exposes almost all of it over an API so campaigns can be built and audited by script.
EmailBison is the other sending platform I work in. It does the same job as the
rest of this category, and the difference that matters to me is that almost
everything is reachable by API, so campaign QA can be a script rather than a
person clicking through twenty campaigns.

## How I use it

**Everything gets read back.** Before a launch I pull every campaign, every step,
every sender and a sample of rendered leads, and check them against what the copy
document says they should be. Presence, then logic, then quality: is the variable
there, is the lead in the right segment, does the sentence read like a person
wrote it. Three passes, in that order, because a quality judgement on a missing
variable is wasted effort.

**Infrastructure swaps go through a duplicate.** Changing which senders a live
campaign uses is not a field edit. I duplicate the campaign onto the new senders
and move the uncontacted leads across, so the people who are mid sequence keep
their thread and their history.

**Signatures are checked on every attached sender, every time.** They are a field
on the sender account and they are easy to miss on a freshly connected batch,
because nothing warns you. An unsigned mail from a named person is the fastest way
to look like a robot.

**Bulk variable updates go in batches of a few hundred.** When copy changes and a
variable has to be added to leads already loaded, I patch them in chunks rather
than rebuilding the campaign, and confirm by fetching a sample back afterwards.

## What I have learned the hard way

**Moving leads to another campaign copies them.** The leads stay in the source
campaign as well, still scheduled. If you do not stop future emails in the source,
the same person gets both sequences, and the first sign of it is a confused reply.

**Page size is capped whatever you ask for.** The campaign leads endpoint quietly
returns a small page no matter what limit you send, so a script that asks for a
thousand and takes the first response believes it has everything. Every count I
take from that endpoint is paged to the end.

**Search is fuzzy, so it will hand you the wrong person confidently.** Never treat
a search result as proof a lead exists. Assert an exact address match, or fetch the
record by its id.

**QA on a paused campaign returns nothing by default.** Which looks exactly like a
clean campaign with no problems. Pre launch campaigns are usually paused, so this
is the state you are most likely to audit and most likely to misread.

**Two small edges that cost a real send:** a reply step gets `Re:` prepended
automatically, so sending a subject that already has it produces `Re: Re:`. And
sequence steps have no update endpoint, so editing one means deleting and
recreating it, and the last remaining step cannot be deleted at all.
## Resources
- [EmailBison](https://emailbison.com/)
- [Documentation](https://docs.emailbison.com/)