Cold outreach setup — SMTP, cold domains, review queue
Set up cold outreach the right way — a bring-your-own SMTP provider on an isolated cold subdomain, then source, draft, review, and launch a campaign behind a human approval gate.
Cold outreach — reaching people who haven't opted in — is a different sending path from broadcasts and transactional mail, and Tinbox keeps it that way on purpose. Cold never sends through Cloudflare's outbound mail (transactional-only by policy) and never touches your warm sending domain, so a cold-sending reputation can never bleed into the mail your customers actually asked for. That means two pieces of setup before you send: a bring-your-own SMTP provider and an isolated cold subdomain. Then the campaign itself runs source → draft → review → launch, with a human approval gate you can't skip.
Check what's missing for the cold lane at any point:
tinbox get-send-readiness --lane outreach --json
1. Configure a BYO SMTP provider
Cold mail sends through an SMTP account you bring. Every mainstream transactional ESP (Postmark, SES, Mailgun, Resend, SendGrid) forbids cold in their terms, so use a provider that permits cold outreach; check the provider's policy before you wire it.
Configure it entirely in-app — no wrangler, no redeploy:
Settings → Sending → Cold outreach (SMTP). Enter host, port, username, password (write-only — it's sealed at rest and never read back), and the from-address. You can bind SMTP per cold domain with an org default. Then use the pane's Send a test message button: it does a real SMTP round trip to an address you choose and reports honestly what happened — connected, authenticated, sent, or the exact failure (DNS, auth, TLS, rejected). A wrong password shows an auth failure here, not at launch time.
Deployments that set SMTP via worker env vars keep working — env config takes precedence over the in-app config, and the pane documents that precedence.
2. Set up the cold subdomain
Bind the campaign to a verified cold subdomain — something visibly separate
from your main domain (e.g. outreach.acme.dev or a dedicated cold domain), so
cold sending is walled off from your warm reputation. Add and verify it the same
way as any sending domain — see
Connect your domain — and confirm it:
tinbox check-sending-domain --domain outreach.acme.dev --json
The cold-domain gate is enforced server-side, not by convention: a prospect can never be approved, and a campaign can never launch, on a warm or unverified domain.
3. Create the campaign and source prospects
Create a cold campaign with a name and a brief — the ICP / goal prompt that drives sourcing and drafting. Bind the cold sending domain here; a domain that doesn't exist, or a deployment with no cold SMTP transport, is refused at creation with a fix link.
tinbox create-outreach-campaign \
--name "Q3 agencies" \
--brief "Boutique marketing agencies, 5–20 people, that run client newsletters"
Source and qualify prospects into the campaign — this writes sourced rows only, nothing sends:
tinbox source-prospects --id oc_…
4. Draft, review, approve
Draft a personalized cold body for every sourced prospect in one pass (needs a
model wired). Each prospect moves sourced → drafted; still nothing sends:
tinbox draft-all-pending --id oc_…
Read the ranked review queue — hottest-first by qualification score, with whether each prospect has a drafted body:
tinbox list-review-queue --id oc_… --json
Approving is where real, irreversible cold sends begin, so it's gated twice: the
outreach:send capability and the hard cold-domain gate. Approve the
prospects you want, then launch the campaign (the content lock that makes approved
prospects dispatchable):
tinbox approve-prospects --id oc_… --prospectIds p_1,p_2,p_3
tinbox launch-outreach --id oc_…
Actual sends fire on the scheduled tick, throttled and ramped. You can hold a
campaign mid-sequence with tinbox pause-outreach --id oc_… — it's resumable and
loses no prospects.
Let the assistant do the assembly
The whole source → draft → review flow can run from a single message to the in-app assistant: "Run a cold campaign for boutique agencies that send client newsletters." It checks readiness, creates the campaign, sources prospects, and drafts each body — then hands you a populated review queue and stops. It never approves a prospect and never launches; approval stays yours. See Cold outreach in one message.
Watch it run
tinbox outreach-campaign-status --id oc_… --json # sourced → drafted → approved → sent funnel
tinbox outreach-replies-digest --id oc_… --json # who replied, with a pointer to the inbox thread
Next steps
- Set up cold-outreach SMTP — the deeper reference on which providers work and how to create credentials.
- Cold outreach in one message — the assistant-driven path end to end.
- Run outreach with an external agent — driving the same flow from Claude or your own agent over the CLI.