FounderReply

Cold email

Compliant cold email automation, where the guardrails are the product.

Outreach runs behind one gate. A workspace must have accepted the Acceptable Use Policy and not be paused before it can send at all; then every individual lead is checked against do-not-contact, unsubscribes, a durable suppression list and business-only targeting. Anything that fails is blocked and logged with its reason, not sent.

  • Up to eight checks run before one email leaves; three of them stop every send in the workspace at once.
  • A footer is appended to both parts of every email — the sending business, an AI disclosure and an opt-out.
  • A refusal is written to the audit log with its reason — never silently skipped.

Business contacts only by default · You are responsible for your lawful basis

AUP acceptedNot pausedConsent · not DNCNot suppressedBusiness contactSentBlocked · logged
10
filters in the gate — up to eight before one email
3
representations you sign before the first send
5
spam complaints pause the workspace outright
0
deliverability, open or reply rates quoted on this page

Counted from lib/aup.ts, lib/eligibility.ts, lib/killswitch.ts and the send path in lib/outreach.ts — not from a benchmark.

The moving parts

A small number of emails, sent carefully.

This is not a list-blasting tool and it is not built to become one. It composes against what you already know about a lead, runs multi-step sequences that end themselves the moment a lead unsubscribes or the deal closes, and hands every inbound reply back to you before answering it.

Drafts grounded in the thread, not a mail merge

A message is composed against everything already recorded for that lead across email and calls — one timeline, not a spreadsheet row with a first-name token in it.

HOW · composeOutreach() reads the lead’s cross-channel timeline and the workspace persona. The send path composes only when you did not supply a body, and the credit is metered after a successful draft, not before.

Sequences that can stop themselves

A sequence is an ordered list of steps, each on a channel with a wait and a goal. A lead who unsubscribes, or who you mark won or lost, terminates their own enrollment without you unsubscribing them by hand.

HOW · a cron tick claims an enrollment by advancing its step BEFORE executing it, so an overlapping tick cannot double-send; the trade-off is at-most-once, which is the right default outbound.

Inbound replies are never auto-answered

When a lead writes back, the reply is recorded, the lead is marked engaged, a response is drafted — and then it waits for you, exactly like the social approval queue.

HOW · ingestInboundEmail() ends at enqueueOutreachApproval(); inbound text is untrusted, so nothing composed from it is ever dispatched without a human releasing it.

The gate

Ten filters, and what each one stops.

Not a description of a compliance philosophy — the list itself. A check marks a filter no workspace can switch off; a minus marks a default the workspace owns, and turning business-only targeting off is a decision you make and remain responsible for. A Digital PR pitch is an email, so it rides every row here except the two that only apply to a dial.

AUP acceptance
Every send and every call from a workspace that has not accepted the current policy versionaup.hasAcceptedCurrentAup()·Required
Payment on file
Sends from a workspace with no card, as an identity and accountability signalbilling.hasPaymentOnFile()·Required when billing is live
Compliance pause
Every send while the workspace is held, whether the kill switch or a human paused itkillswitch.isOutreachPaused()·Always
Do-not-contact
Any lead flagged dnc, on every channel, before any other lead-level checkconsent.canEmail(), consentGate()·Always
Unsubscribed
Leads whose status is unsubscribed, or who carry an email opt-out from a bounce or a complaintconsent.canEmail()·Always
Suppression list
Any address in outreach_suppressions for that workspace — on the channel, or on allsuppression.isSuppressed()·Always
Business-only targeting
Cold leads with no company name on the recordeligibility.hasBusinessContext()·businessOnly, on by default
Free-domain block
Cold leads at any of 30 consumer mailbox domains — gmail.com, outlook.com, icloud.com, proton.me and the resteligibility.FREE_EMAIL_DOMAINS·Part of businessOnly
Mobile line block
Calls to numbers the telephony lookup returns as mobile or personal. Cold leads only — a lead you marked warm is exempteligibility.lineTypeGate()·blockMobile, on by default
Calling window
Dials outside the recipient’s local calling window, resolved from their number’s own country. The dial is held for the next open slot, not droppedcalling-hours.resolveCallWindow()·09:00–18:00 local in every current country rule

How a send goes out

Four stages, in this order.

Email and voice share the workspace gate, so a paused workspace cannot route around it by switching channel. Below the workspace level, one function decides whether a given lead may be emailed at all — there is no second send path that skips it, which is also why Digital PR inherits all of this for free.

  1. 1

    The workspace is checked

    workspaceMaySend() runs first: has this workspace accepted the current AUP, does it have a card on file where billing is live, and is it currently paused. A failure here stops every send, not one.

  2. 2

    The lead is checked

    assertEmailable() is the single choke point: consent and do-not-contact, then the durable suppression list, then business-only targeting. A blocked lead is written to the audit log with the reason, not silently skipped.

  3. 3

    The email is built

    A footer carrying the sending company, an AI-assistance disclosure and an opt-out is appended to both the text and HTML parts — always. A one-click unsubscribe token is minted into the List-Unsubscribe headers whenever a signing secret is configured; with no secret the headers and the link are dropped rather than faked.

    On the wirelib/outreach.ts
    List-Unsubscribe: <https://…/api/outreach/unsubscribe?token=
                          {workspace}.{lead}.{sig}>
    List-Unsubscribe-Post: List-Unsubscribe=One-Click
    
    // mintUnsubToken() signs {workspace}.{lead} with HMAC-SHA256,
    // so a token cannot be forged or pointed at another lead.
    // No UNSUBSCRIBE_SECRET → both headers AND the footer link
    // are omitted rather than shipped dead. GET and POST are
    // both handled, which is what RFC 8058 one-click needs.
  4. 4

    The result feeds back

    The send records a sent signal. A later bounce suppresses the address; a spam complaint unsubscribes the lead and suppresses them; an unsubscribe does both. Each of those re-evaluates the kill switch.

The kill switch

It stops before you notice.

Bounces, spam complaints and opt-outs are recorded as signals against the workspace, and every negative one re-evaluates the thresholds. When a threshold trips, outreach is paused and stays paused until a human lifts it — the send path checks that flag before anything else.

  • Five spam complaints in the window trip it regardless of rate or volume.
  • Past twenty sends, the complaint, bounce and opt-out rates each get their own ceiling.
  • The pause is a workspace flag, so it blocks calls and press pitches as well as email.
  • Only an owner or admin can lift it, from workspace settings — nothing lifts it on a timer.
Defaultslib/killswitch.ts
// lib/killswitch.ts
export const DEFAULT_THRESHOLDS: KillSwitchThresholds = {
  windowHours:      24 * 7,   // rolling 7-day window
  minVolume:        20,       // rate rules need volume first
  maxComplaintsAbs: 5,        // absolute — trips regardless of rate
  maxComplaintRate: 0.005,    // 0.5% of sends
  maxBounceRate:    0.15,     // 15% of sends
  maxOptOutRate:    0.3,      // 30% of sends
}

What you accept

The policy is a gate, not a footer link.

Before a workspace can send anything, an owner or admin has to accept the Acceptable Use Policy and affirm three separate representations. A partial acceptance is rejected. The acceptance is stored with the user, their email, the policy version, the timestamp, the IP address and the user agent.

What outreach does with your list

You remain the sender of record on your own domain. These are the rules the send path applies to every address you give it.

Always
Screens every address against consent, do-not-contact and the durable suppression list.
Appends a footer to both parts of every email — by default it names the business and discloses AI assistance.
Signs the one-click unsubscribe token per workspace and per lead, so it cannot be pointed at anyone else.
Logs a blocked send with its reason, so a refusal is auditable.
Holds every inbound reply in the approval queue for a human to release.
Never
Emails an address on your suppression list, even after you delete and re-import the lead.
Auto-answers a reply from a lead, whatever the autonomy dial is set to.
Sends with no footer at all — a workspace may reword the disclosure, never delete it.
Ships an unsigned unsubscribe link: with no signing secret the headers are omitted, not faked.
Decides on your behalf that you have a lawful basis to contact someone.

The filters do not make your outreach legal. You do.

Accepting the policy is a set of claims you are making, and all three have to be affirmed — a partial acceptance is rejected:

  1. 1I have a lawful basis and, where required, prior consent to contact each lead I add — and I will honor every opt-out and do-not-contact request.
  2. 2I am solely responsible for the legality of my outreach (including TCPA, CAN-SPAM, GDPR/ePrivacy, and do-not-call rules). FounderReply's filters are tools I use at my discretion, not legal advice or a guarantee of compliance.
  3. 3I understand that violating this policy — or generating excessive spam complaints, bounces, or opt-outs — will result in my workspace being suspended or terminated, and that I indemnify FounderReply against claims arising from my outreach.

The policy carries a version. When its text materially changes the version is bumped and every workspace has to accept the new one before its next send — an old acceptance does not carry forward. Read the Acceptable Use Policy and the Terms of Service.

What this page will not tell you

No inbox-placement rate. No deliverability figure. No reply rate.

Those depend on your domain, your sending history, your list and your copy — none of which this product can measure on your behalf. Any number printed here would be decoration, and a page whose entire pitch is honesty about compliance cannot open with an invented one.

FAQ

Before you import a list.

Who you may contact, what the filters do and do not promise, and what happens the moment somebody complains.

A gate that runs before the sender does. A workspace cannot send at all until an owner accepts the Acceptable Use Policy, and each individual send is checked against do-not-contact, unsubscribes, a durable suppression list and business-only targeting. Every email gets an appended footer, and a signed one-click unsubscribe wherever a signing secret is configured.
No, and it says so in the policy you have to accept. The filters are tools you use at your discretion — not legal advice and not a guarantee of compliance. You are responsible for having a lawful basis to contact each lead under CAN-SPAM, GDPR, ePrivacy, TCPA and any do-not-call rules that apply to you. Read the Acceptable Use Policy before you start.
Not on a cold send while business-only targeting is on, which is the default. Thirty consumer mailbox domains are treated as non-business and blocked along with any lead that has no company name. A lead marked warm — someone who gave you their address directly — bypasses that targeting rule, though consent and suppression still apply.
The lead is marked unsubscribed and their address is added to the workspace suppression list, which is stored separately from the lead. Deleting and re-importing that contact does not resurrect them: the next send scrubs against the address, not the record. The opt-out also counts toward the kill switch.
A rolling 7-day kill switch. Five spam complaints trip it outright, regardless of rate. Past twenty sends, a complaint rate over 0.5%, a bounce rate over 15% or an opt-out rate over 30% each pause the workspace, and every bounce, complaint and opt-out re-evaluates it immediately.
Yes. A footer is appended to both the text and HTML parts of every outreach email, and no send path omits it. By default it names the business responsible, discloses that the message is sent with AI assistance and that the recipient may be contacted by an automated assistant, and offers an opt-out. A workspace may replace that wording with its own.
The reply is recorded on the lead’s timeline, the lead is marked engaged, and a response is drafted and placed in an approval queue. Inbound text is untrusted, so nothing composed from it is ever sent automatically — you release it, exactly as on the social side.
Not on its own. An enrollment ends when the lead is unsubscribed, won or lost — a reply marks them engaged, which is a signal, not a terminal state. If you want the cadence to stop, mark the deal or close the lead; the reply itself lands in the approval queue either way.

Ready when you are

Send less. Send it properly.

Accept the policy, add a business contact, and watch the gate refuse the ones it should refuse. The filters run whether or not you read this page — that is the point of putting them in the send path instead of the marketing.

Free to start · You remain the sender of record · Card on file required once billing is live