Cold email software should sequence messages, stop when someone replies, keep the inbox work organized, and show what happened.
It does not automatically make the list accurate, the offer relevant, the DNS correct, or the mailboxes healthy. Some platforms sell those surrounding layers too. That can be useful. It also makes the pricing page harder to read.
Choose the sequencer first. Then decide which extras belong in the same product.
Separate the layers
| Layer | Job | Keep it separate when… |
|---|---|---|
| Prospect data | Find people and companies | Coverage needs to be tested independently |
| Verification | Classify address risk and status | Acceptance and suppression need their own record |
| Sequencer | Schedule steps, stop on reply, rotate accounts, manage campaigns | This is the main software decision |
| Mailboxes and domains | Supply and operate the sending infrastructure | Ownership, support, and provider choice matter beyond the sequencer |
| DNS and authentication | Set SPF, DKIM, DMARC, forwarding, and tracking records | Another operator owns the domain or records |
| Warmup | Run automated warmup activity and related checks | You need to inspect claims and evidence separately |
| Measurement | Store sends, replies, bounces, errors, and campaign identifiers | The sequencer's dashboard is not the only source of truth |
An all-in-one product can still be the right choice. Just price the layers it replaces and the layers it does not.
Write the sequencer job in plain language
The software decision gets easier when the team describes a normal campaign day.
who creates a campaign:
who approves copy and schedule:
how leads enter:
how duplicates and suppression are checked:
how mailboxes are assigned:
what stops after a reply:
who triages replies:
what happens to bounces and errors:
which client or workspace owns the data:
what must leave through export, webhook, or API:
how a mailbox is removed:
how the team exits the platform:
That description is the requirement. “Unlimited email accounts” is not.
Separate capacity from control
A plan may advertise high sending, contact, or account limits. The operator still needs to control who can use that capacity, which campaign owns it, and what happens when part of the system pauses.
Record these units separately:
| Unit | What it limits |
|---|---|
| Connected mailboxes | Accounts that can be attached to the sequencer |
| Active leads or contacts | People currently stored or running through campaigns |
| Monthly emails or sends | Attempts allowed under the software plan |
| Data or enrichment credits | Prospecting work, not sequencing capacity |
| Verification credits | Address checks, not sent messages |
| Users or seats | People who can operate the product |
| Workspaces or clients | Separation and permission boundaries |
| API or webhook access | Automation and event export |
Two plans with the same monthly price can buy very different combinations. Do not compress them into one “emails included” column.
Current cold email software pricing
Official pricing pages were reviewed on August 28, 2026. These are starting plan units, not direct equivalents.
| Software | Published starting point | Why the unit is different |
|---|---|---|
| Instantly | Outreach Growth $47/month; a bundle combining outreach and data starts at $94/month | Outreach contacts and sends are separate from Instantly data credits |
| Smartlead | Base $39/month; Pro $94; higher plans expand sending, contact, workspace, and platform capacity | Add-ons and higher operating features can change the real plan |
| lemlist | Email plan $69/month or $55/month equivalent billed yearly; Multichannel is per user | The Email plan lists unlimited users, while Multichannel prices per user and adds other channels |
| Saleshandy | Starter $41 monthly or $34/month equivalent billed annually | Plans bundle sequencing, data credits, mailbox connections, and different user counts |
| EmailBison | $599/month for 500,000 emails, with extra monthly buckets for more volume | It targets a larger operating scale and includes unlimited leads, workspaces, and teammates |
| PlusVibe | Personal starts at $37/month with 25,000 emails and 1,000 enrichment credits | Plan price changes with enrichment credits and broader campaign capacity |
| Snov.io | Starter $39/month with 1,000 credits and 5,000 recipients | Prospecting, finding, verification, campaigns, warmup, and recipient limits share the platform |
| Cheap Sequencer | Public product page describes send-capacity plans and the campaign workflow; a complete public price table was not available in this review | Treat it as a separate sequencer product and recheck pricing before publication |
Do not divide the monthly bill by connected inboxes unless the plan is actually priced per inbox. Do not call a full data-and-outreach bundle the price of sequencing. Keep monthly billing separate from a monthly equivalent billed annually.
Instantly
Instantly's reviewed pricing separated Outreach Growth at $47 per month from a broader bundle starting at $94 per month that combines outreach and data. Sequencing software and prospect data are different purchases even when one checkout can include both.
For the outreach plan, confirm the current connected-account, contact, send, workspace, user, warmup, API, and support scope under the exact tier. Then price data credits separately if the team intends to use them.
The pilot should test account connection, workspace permissions, campaign scheduling, duplicate and suppression behavior, reply handling, and event export. If the team is moving from another platform, test what campaign and reply history can be imported or preserved instead of assuming a mailbox connection completes the migration.
Smartlead
Smartlead's reviewed public pricing started at $39 per month, with Pro at $94 and higher tiers expanding sending, contact, workspace, and platform capacity. Add-ons and agency or operating features can change the plan that actually fits.
Map the required mailbox count, active-lead volume, sends, users, workspaces, client permissions, API, and reply operations to the selected tier. Do not use the base price when the actual workflow needs a higher plan or add-on.
During the trial, create two workspaces, connect a small account group, generate a reply and a provider error, and test removal. The result should show whether the product preserves the client boundary and exposes enough evidence for the operator.
lemlist
lemlist's reviewed Email plan was $69 monthly or $55 per month equivalent on annual billing. Its Multichannel offer is per user and adds other channels. The reviewed Email plan listed unlimited users, so the correct commercial unit depends on the product selected.
Keep email-only and multichannel evaluation separate. If the team does not need phone or social steps, do not pay for them to make the comparison look complete. If it does, test how tasks, replies, ownership, and reporting cross those channels.
For email operations, verify mailbox connections, campaign and step controls, reply handling, client separation, tracking-domain behavior, and data export. Preserve the annual commitment beside the monthly equivalent.
Saleshandy
Saleshandy's reviewed Starter price was $41 monthly or $34 per month equivalent billed annually. The plans combine sequencing with different amounts of prospecting credits, mailbox connections, and user capacity.
That bundle needs a layer-by-layer budget. Count the sequencer, data credits, mailboxes, users, and any required add-ons separately. If the team already owns data, test whether the unused prospecting capacity creates any real value.
Run the same send, reply, failure, and removal test. Also check whether client workspaces, team permissions, and exports fit the way campaigns are reviewed and handed off.
EmailBison
EmailBison's reviewed public price was $599 per month for a platform plan listing 500,000 emails, with additional monthly buckets for more volume. The product also advertises unlimited leads, workspaces, and teammates under that operating model.
This is not a $599 mailbox product. It is a higher-capacity sending-platform purchase. Compare it only when the team expects to use the scale, workspace, reply, API, and campaign operations included.
The pilot should prove that the organization can trace a send, reply, bounce, suppression, account state, and workspace owner at the intended scale. A large allowance is not useful when the incident record becomes less specific as volume grows.
PlusVibe
PlusVibe's reviewed Personal plan started at $37 per month with 25,000 emails and 1,000 enrichment credits. Larger and agency plans change campaign, enrichment, and operating capacity.
Separate email capacity from enrichment credits. Confirm connected inboxes, active leads, users, workspaces, API or integrations, reply handling, and the limits attached to the selected plan. If agency operations are the reason it is shortlisted, run the client-separation and handoff test in that tier rather than the individual plan.
Snov.io
Snov.io's reviewed Starter plan was $39 per month with 1,000 credits and 5,000 recipients. The platform combines prospect search, email finding, verification, campaigns, warmup, and other sales tools.
The credit balance and recipient limit solve different jobs. Map which actions consume credits, how recipients are counted, how sending limits apply, and whether the finder, verifier, warmup, and sequencer replace existing tools.
Test the outbound workflow independently of the prospecting features. The software still has to preserve suppression, schedule and stop behavior, replies, provider errors, and exportable campaign evidence.
CheapSequencer
CheapSequencer is a separate product from Cheap Inboxes. Its current public site documents Gmail, Outlook, and Cheap Inboxes account connections, CSV lead import, sequence building, scheduled sends, stop-on-reply behavior, and a unified inbox.
A complete public price table was not available in this review, so do not invent one. Confirm the current plan, send capacity, connected-account scope, billing cadence, and any limits before a commercial comparison is published.
The product belongs in the pilot on its documented workflow. Connect the intended account type, import a representative CSV, build the steps, schedule a test, generate a reply, and verify the inbox and stop behavior. Keep the infrastructure purchase separate: Cheap Inboxes supplies domains and Google or Microsoft mailbox operations, while CheapSequencer runs campaigns.
Compare the shortlisted plans on matched fields
Use one row per exact plan, not one row per logo.
| Field | What to capture |
|---|---|
| Plan and date | Exact name, public source, and review date |
| Billing | Monthly, annual equivalent, commitment, currency, and renewal |
| Connected accounts | Included number and overage or add-on path |
| Leads or contacts | Stored, active, uploaded, or monthly unit |
| Sends or emails | Included attempts and measurement period |
| Users | Included seats and administrator roles |
| Workspaces or clients | Included separation and permissions |
| Data | Included finder or enrichment units, if any |
| Verification | Included checks or separate product |
| Warmup | Included, optional, or separate, without outcome claims |
| Replies | Unified inbox, routing, ownership, and export |
| API or webhooks | Included tier, limits, and event coverage |
| Support | Current documented channel and plan scope |
| Exit | Export, cancellation, account removal, and data retention |
If a field is not documented, mark it for confirmation. Do not convert “not found on this page” into “the product does not have it.”
Decide what the sequencer must do
Start with the campaign workflow, not the feature grid.
Campaign control
- opening email and follow-up steps;
- delay and schedule rules;
- time zones;
- pause, resume, and stop behavior;
- mailbox assignment and rotation;
- duplicate and suppression handling;
- test sends and approval states.
Reply operations
- one place to review replies;
- stop-on-reply behavior;
- reply ownership;
- positive, negative, unsubscribe, and out-of-office handling;
- client or workspace separation;
- export or API access to reply events.
Failure evidence
- exact provider error or bounce response;
- mailbox connection state;
- account-level history;
- campaign and step identifiers;
- timestamps;
- exportable event data;
- a way to distinguish a skipped contact from a failed send.
The UI matters. If an operator cannot tell whether a contact was suppressed, scheduled, attempted, bounced, or replied, the software creates more work than it saves.
Decide the required controls before the demo
Lead and suppression control
The sequencer should preserve the source record, stable contact ID, campaign assignment, duplicate decision, suppression state, and reason. Test whether an unsubscribe or hard-bounce suppression applies only to one campaign, one workspace, or the whole organization according to the team's intended policy.
Import the same person twice with different casing or source files. Move the person between campaigns. Remove and re-import the record. The system should make the result visible enough for the operator to understand whether the person will be contacted.
Mailbox and schedule control
Connect a small mailbox group and assign it deliberately. Confirm time zone, send windows, follow-up delays, pause and resume behavior, mailbox rotation, and what happens when one mailbox becomes unavailable.
Do not treat the platform's maximum capacity as a sending recommendation. Google and Microsoft still apply their own rules, restrictions, and reputation systems. The sequencer schedules attempts; it does not override the provider or recipient.
Reply and stop control
Create a test reply before launch. Check how quickly the contact stops, what happens to scheduled follow-ups, where the reply appears, who owns it, and whether the event can leave the platform.
Test out-of-office, negative, unsubscribe, and ambiguous replies too. The operator needs a repeatable classification and reassignment path, not a colorful inbox with no owner.
Error control
Capture a provider rejection, authentication problem, disconnected account, malformed record, and skipped contact where safe to do so. The platform should expose the exact state, timestamp, account, campaign, step, and retry behavior.
A generic “failed” count is not enough to decide whether the problem belongs to the list, message, mailbox, provider, DNS, or connection.
Test the handoff, not just the campaign builder
Use a small pilot and run the complete path:
- Import a file with duplicates, suppressed contacts, and missing fields.
- Map fields and preserve the source.
- Connect a small mailbox group through the documented path.
- Build one opening message and two follow-ups.
- Test schedule and time-zone behavior.
- Send internal test messages.
- Generate a reply, bounce, unsubscribe, and connection error.
- Confirm the correct automation stops.
- Export the events or read them through the API.
- Remove a mailbox and test the recovery path.
That pilot will expose more than an hour of clicking through feature pages.
Score the pilot from evidence
| Test | Pass evidence |
|---|---|
| Import | Source IDs, mappings, duplicates, and errors remain reviewable |
| Suppression | The intended scope and reason survive re-import and campaign changes |
| Schedule | Time zone, delays, pause, resume, and stop behavior match the plan |
| Connection | Account, provider, workspace, and owner are visible |
| Reply | Follow-ups stop and the correct person receives ownership |
| Bounce or error | Full enough evidence exists to choose the next layer |
| Workspace | Client data, permissions, and reporting stay separated |
| Export or API | Required campaign and reply events can leave the product |
| Removal | Mailbox and user removal produce understood campaign and data outcomes |
| Exit | Lists, suppression, replies, and evidence can be retained as required |
Weight the tests for the actual operator. A founder may care most about setup clarity and reply handling. An agency may put workspace isolation, approvals, and client handoff first. A technical team may require event export and repeatable account lifecycle work.
Do not score a feature the team did not test. “Available” and “works in our workflow” are different statements.
Price the whole stack
For each finalist, use one worksheet:
sequencer plan
+ seats or workspaces
+ contact or active-lead tier
+ monthly send tier
+ data credits
+ verification
+ mailboxes and domains
+ DNS and infrastructure support
+ warmup or placement tools
+ API or integration tier
+ operator time
= complete monthly operating cost
The cheapest sequencer can create an expensive process if the team has to rebuild suppression, manually move replies, or buy several add-ons. A broad platform can also be wasteful when the team already owns the data and infrastructure layers.
Price two realistic scenarios
Use a normal month and a growth month. Include the exact number of mailboxes, active leads, sends, users, workspaces, data records, verifications, and API needs.
For each scenario, mark:
- current plan and billing cadence;
- next tier triggered by one exceeded unit;
- add-ons required;
- annual commitment or renewal change;
- costs already covered by another tool;
- tools genuinely replaced;
- operator work created or removed.
The plan that is cheapest at 5,000 contacts may become more expensive at 20,000 because the next tier changes several units at once. The broader platform may become economical only when the team actually removes another database, verifier, warmup product, or reply tool.
Do not count hypothetical consolidation as savings. Remove the old tool only after the pilot proves the replacement workflow and exit requirements.
Test migration and exit while the pilot is small
Before moving production campaigns, determine what can be imported:
- contacts and stable IDs;
- source and segment fields;
- suppression and unsubscribe history;
- campaign steps and schedules;
- replies and classifications;
- bounce and provider-error history;
- mailbox assignments;
- tracking and link settings;
- custom fields and workspace ownership.
Some history may not transfer. Record the gap and decide which system will preserve it. Do not flatten old reply and bounce evidence into one note just to finish the migration.
Then test leaving:
- Export the required contacts, suppression, campaigns, and reply evidence.
- Disconnect one mailbox and confirm credentials and campaign state.
- Remove one user and transfer ownership of shared work.
- Revoke API keys and webhooks.
- Confirm billing cancellation and data-retention behavior under current terms.
- Preserve the records needed for future suppression and incident review.
The exit test keeps the sequencer from becoming the only place that remembers who must not be contacted or why a previous campaign failed.
Test agency and team governance
A sequencer used by one person and one used across clients are different operating systems.
Workspace boundaries
Create two test workspaces with overlapping contact records, different mailbox groups, and different users. Confirm what is global and what is workspace-specific:
- suppression and unsubscribe state;
- mailbox access;
- campaign templates;
- contacts and custom fields;
- replies;
- analytics;
- API keys and webhooks;
- billing and usage;
- administrator permissions.
The correct scope depends on policy. The problem is an invisible scope. An operator should know whether suppressing an address protects one campaign, one client, or the entire organization.
Approval and change ownership
Decide who can create, approve, launch, pause, edit, and delete campaigns. A system with several users needs more than an administrator login everybody shares.
Test a copy edit after approval, a schedule change after launch, a mailbox reassignment, and a user removal. The product should expose enough history for the team to know what changed and who owns the next action.
If the platform does not provide the required approval record, keep it in a separate system and link the campaign version. Do not pretend a draft name is governance.
Client handoff
An agency handoff should include:
workspace and client owner
campaigns and current state
contacts and source fields
suppression and unsubscribe history
connected mailboxes and domain assignments
reply inbox and classifications
tracking settings and domains
API keys or integrations to revoke
exports completed
billing and cancellation owner
data-retention decision
Run the handoff during the pilot with test data. If the only exit is screenshots and a CSV without reply or suppression history, the limitation belongs in the buying decision.
Inspect API and automation as a lifecycle
API access is not one checkbox. The team may need to create leads, place them in campaigns, read status, receive replies or errors, pause work, manage accounts, and remove data.
Map the intended automation:
| Lifecycle step | Required behavior |
|---|---|
| Create or import | Stable external ID, validation, duplicate result, and error response |
| Assign | Campaign, sequence, mailbox group, workspace, and owner |
| Start or schedule | Explicit state and idempotent request behavior |
| Observe | Send, skip, bounce, reply, unsubscribe, and provider-error events |
| Pause or stop | Contact, campaign, mailbox, or workspace scope |
| Correct | Field update, suppression, reassignment, and history |
| Remove | Contact, campaign, integration, credential, and retention outcome |
Test retries. If the network times out after a create request, the integration should determine whether the lead or campaign already exists before creating another one. Stable external IDs and idempotent operations reduce duplicate sends and records.
For webhooks, verify signatures and event details only against the platform's current official documentation. Store the event ID, timestamp, workspace, campaign, contact, mailbox, type, and processing result. Design a replay path for events that fail inside your system.
Do not build automation around an endpoint seen in a demo without confirming the selected plan, documented contract, limits, and support path.
Keep warmup, placement, and tracking claims in their own lane
Many cold-email platforms include warmup, placement tests, custom tracking domains, or deliverability scores. Those features may reduce tool switching. They do not collapse the underlying evidence into one outcome.
For warmup, record what the product actually does, what data it exposes, how mailboxes enter and leave the workflow, and which claims are vendor positioning. Do not treat the feature as proof of inbox placement or account safety.
For placement tests, preserve the seed set, sender, message, authentication, time, and tool version. A seed result is a controlled sample, not the result for every real recipient.
For custom tracking domains, document the provider-specific CNAME, validation, certificate, redirect, workspace, and rollback path. The tracking hostname is not the SPF or DKIM identity and cannot repair a disabled mailbox or poor list.
For open and click reporting, decide which event changes an action. Privacy systems, scanners, and bot traffic can distort those counts. Replies, bounces, provider errors, and real campaign decisions still need separate records.
Make the final decision from disqualifiers first
Remove a platform from the shortlist when it fails a required workflow:
- suppression scope cannot match policy;
- replies do not stop follow-ups reliably in the tested path;
- client data or mailbox permissions cannot be separated;
- provider errors are too generic to operate;
- the required event or export cannot leave the product;
- the real plan and billing units cannot be forecast;
- account or user removal has unclear consequences;
- contract, retention, or permitted-use requirements are unresolved;
- the team cannot preserve the evidence required during migration or exit.
Score the remaining platforms on the tested requirements. Weight campaign control, reply operations, workspace governance, evidence, automation, and total cost according to the actual team.
Save one decision record:
selected platform and plan:
public or quoted price checked at:
billing cadence and commitment:
capacity assumptions:
pilot results:
known limitations:
tools replaced:
tools retained:
infrastructure provider and owner:
migration gaps:
exit test result:
decision owner:
renewal review date:
The runner-up and rejection reason belong there too. At renewal, the team can recheck the plan and workflow instead of reopening a generic “best cold email software” list.
Implement the winner without moving everything at once
Use a staged implementation even after the product wins the pilot.
Stage 1: operating shell
Create the organization and workspace structure, administrator roles, user permissions, suppression scope, reply ownership, and naming rules. Connect only test or low-risk mailboxes. Configure API keys and webhooks with the smallest required permissions.
Exit evidence:
- every workspace has a business or client owner;
- every user has an individual role;
- suppression scope matches the written policy;
- reply ownership and escalation are documented;
- credentials can be revoked without sharing them;
- usage and billing can be attributed to the intended plan.
Stage 2: one representative campaign
Import a small accepted list with preserved source IDs. Build a real sequence under the approved schedule. Connect a small mailbox group and run the send, reply, failure, suppression, pause, removal, export, and tracking tests.
Keep the previous system available for comparison without allowing both systems to contact the same people. Define the cutover boundary by campaign or contact state, not by “we switched Tuesday.”
Exit evidence:
- contacts and suppression are reconciled;
- every campaign state is visible;
- replies stop follow-ups and reach the owner;
- provider errors retain the account, response, and timestamp;
- required events leave through export or API;
- one mailbox and one user can be removed cleanly.
Stage 3: controlled migration
Move a limited set of campaigns or one client. Reconcile contacts, suppression, replies, scheduled work, mailbox assignments, and tracking settings before the next group moves.
Record what will not migrate. Preserve old evidence in the system chosen during the pilot. Do not rebuild reply or suppression history from memory.
Stage 4: production review
After enough normal operation exists, compare the assumptions with reality:
| Metric | What it reveals |
|---|---|
| Active leads and sends by workspace | Whether the selected tier matches actual use |
| Connected and unavailable mailboxes | Capacity and account-operation load |
| Duplicate and suppression events | Whether imports preserve policy |
| Replies requiring reassignment | Whether ownership rules work |
| Provider and connection errors | Whether evidence is specific enough to act |
| API/webhook failures and retries | Automation reliability and duplicate risk |
| Data, verification, or warmup units consumed | Whether bundled extras are replacing real tools |
| Operator time by recurring task | Whether the platform reduced or moved the work |
If operators maintain side spreadsheets to understand campaign state, find the missing field or workflow. Do not call the implementation complete while the actual source of truth lives outside the product without a deliberate reason.
Stage 5: retire the old path
Export required evidence, reconcile suppression, remove mailbox connections, revoke integrations, transfer ownership, cancel the correct plan, and record retention decisions. Keep the old platform read-only only when the contract and operating need justify it.
The migration is finished when the new system owns the declared workflow and the old system no longer controls a hidden reply, suppression, credential, tracking, or billing dependency.
Test the reply workflow with awkward cases
Most demos show a clean positive reply. Production has duplicate replies, automatic responses, forwarded messages, out-of-office notices, replies from a different address, and contacts who answer after they were moved or suppressed. Those cases decide whether the team can operate the platform without losing context.
Create a small reply test before the wider migration:
- Send from two connected mailboxes into accounts the team controls.
- Reply once from the original address and once from another address at the same company.
- Send an out-of-office response and a later human response in the same thread.
- Reassign one reply between users or workspaces.
- Apply suppression, then attempt another import and schedule.
- Disconnect one mailbox while a reply and scheduled step still exist.
- Export the resulting thread, status, owner, suppression, and timestamps.
The record should show which reply stopped later steps, who owns the conversation, whether suppression followed the right identity, what happened to the disconnected mailbox, and which evidence survives export. If the system requires an operator to remember that a second address belongs to the same contact, document the manual step and count the work.
Test shared access without sharing personal credentials. Confirm which users can read, assign, edit, export, reconnect, and delete. For agencies, repeat the test across two client workspaces and confirm a user cannot move contacts, replies, mailboxes, or suppression into the wrong client by accident.
Do not assume the API fixes a weak inbox workflow. The API should expose the same stable IDs, state changes, timestamps, and ownership that the interface uses. If the webhook says “reply received” but cannot identify the contact, campaign, mailbox, thread, workspace, and event ID, the automation inherits an investigation problem.
Add the reply cases to the pilot scorecard. A product that launches sequences quickly but loses response ownership is solving the smaller part of the job.
Repeat one case on mobile if replies are handled there. Check whether the owner, campaign, contact history, suppression state, and next action remain visible without opening a desktop session. If the mobile view only shows a message, document the escalation path instead of assuming the operator has enough context to act.
Recheck the software when the team changes
A platform selected for one founder may not remain right for an agency with several clients. A product selected for high-volume operations may be wasteful after the workflow becomes smaller. A data-and-outreach bundle may stop making sense when the organization changes its data provider.
Review the decision when connected-account count, active leads, users, workspaces, automation, reply ownership, provider mix, data strategy, or contract terms materially change. Repeat the relevant pilot cases. The chosen software should keep passing the current job, not survive because migration feels annoying.
Keep the inbox decision independent
Cheap Inboxes supplies Google and Microsoft mailbox infrastructure, domains, DNS operations, and human service around that commoditized layer. It is not the sequencer.
Cheap Sequencer is a separate product. Keeping the two decisions separate means you can change the campaign software without pretending every sending domain, workspace, and mailbox has to be rebuilt.
Before connecting anything, use the cold email infrastructure checklist. If the question is warmup rather than sequencing, compare the email warmup tools on their own workflow and evidence.
The right cold email software is the smallest platform that runs the campaign cleanly, preserves the evidence, and fits the people who operate it every day.
