Hydra logoHydra · Hydra Support

Automation

Marketing — Outreach

The hub for cold-outbound marketing in Hydra. Review prospects discovered by the lead-gen pipeline, build email campaigns, and watch replies promote into your real CRM.

Marketing — Outreach

The Outreach page is the hub for Hydra's cold-outbound workflow. Find it under Marketing → Outreach in the left sidebar (admin-only). It pulls together three things in one place: the prospects your discovery runs have surfaced, the campaigns you've sent against them, and the discovery pipeline itself.

How the workflow fits together

┌─────────────────────┐    ┌─────────────────────┐    ┌─────────────────────┐
│ Lead Discovery      │ →  │ Outreach (this page)│ →  │ Campaign            │
│ (BigQuery → ICP →   │    │ Review + filter     │    │ Subject + body +    │
│  Firecrawl → SMTP)  │    │ prospects           │    │ recipient list      │
└─────────────────────┘    └─────────────────────┘    └──────────┬──────────┘
                                                                  │
                                                                  ▼
┌─────────────────────┐    ┌─────────────────────┐    ┌─────────────────────┐
│ Real CRM            │ ←  │ Promote on engage   │ ←  │ Reply / click       │
│ (leads + accounts)  │    │                     │    │ tracked by Resend   │
└─────────────────────┘    └─────────────────────┘    └─────────────────────┘

Cold prospects are kept separate from your real CRM until they engage. They only cross over into Leads + Accounts on a real engagement signal (reply or click). This keeps your live lists clean: a 30,000-row harvest doesn't show up in your inbox or distort your lifecycle stage counts.

The three sections of this page

1. Recent campaigns

Where sent and scheduled campaigns appear. Click any row to open the campaign detail page (recipient counts, per-send status, bounce reasons, opener cost). New campaigns are created with the New campaign button at the top of the table.

2. Lead Discovery

Shows the most recent discovery run with four headline tiles:

  • Domains scanned — how many domains the BigQuery harvest pulled before ICP scoring
  • Qualified — how many of those scored at or above the run's fit-score floor
  • With contact — how many qualified prospects had a verified-or-discoverable email
  • Cost — total marginal cost of the run (BigQuery + Firecrawl + Anthropic)

The status pill on the right shows whether the run is queued, running, completed, failed, or cancelled. Failed runs surface their error message inline so you can debug.

Click Start new run to kick off a harvest directly from this page. The terminal entry point (scripts/leadgen/discover.ts) is still available for advanced flags the UI doesn't expose. See Marketing — Lead Discovery for the full mechanics, supported flags, and cost picture.

3. Prospects

The full prospect list, sorted by fit score (highest first). Three filter rows let you narrow it down:

  • Vendor — which competing tool the prospect is currently running. none means greenfield (no detected vendor — usually a harder sell). other means a vendor exists but isn't one we're positioned against.
  • Fit score — Anthropic-assigned 1–10 score. Default floor is Any score; tighten to ≥ 7 or ≥ 9 when reviewing for a high-touch campaign.
  • Status — pipeline state. new is the default for fresh harvests. sent / replied / bounced / opted_out populate as campaigns send. promoted means the prospect has already crossed over into the real CRM.

The list shows up to 50 rows at a time. Tighten the filters to drill in further if you need to review more than that.

Each row carries:

  • Domain + Company name (if Anthropic was able to extract one from the homepage)
  • Vendor — the detected competing widget
  • Fit — the 1–10 score
  • Contact — email + (if available) name + verification method (smtp, hunter, manual, or unverified)
  • Status — pipeline state pill

Composing a campaign

Click New campaign at the top of the Recent campaigns table. The campaign builder has four sections:

Basics

  • Campaign name — internal label only; recipients never see it.
  • Send from channel — every campaign is bound to one of your email channels. The channel determines two things at once: the From: address recipients see (built from the channel's email address + display name), and where replies land (the same channel's inbox, via the existing inbound email path). Hydra has no tenant-level "main email" — channels are the unit. If you don't see any channels listed, create one at Channels before composing the campaign. The channel's domain must also be verified at Email domains — Hydra warns if it isn't and Resend will reject the send if you launch.

Compose

Subject + body, both supporting {{variable}} substitution. Available variables:

  • {{first_name}} — first word of contact_name; falls back to "there"
  • {{full_name}} — full contact_name; falls back to empty
  • {{company}} — company_name from the prospect row
  • {{vendor}} — detected competing vendor (zendesk, intercom, hubspot, etc.)
  • {{personal_line}} — the AI-generated opener captured during discovery
  • {{comparison_url}}/compare/hydra-vs-X URL on hydra-help.com (Hydra-tenant only; empty for friend tenants)
  • {{contact_role}} — decision-maker title
  • {{industry}} — detected industry tag

Click any variable chip below the body to insert it at the end. Unknown {{var}} references render as empty strings — the API warns you on save, but doesn't block the launch.

Recipients

Filter your prospect list. Eligible recipients:

  • Have a verified contact email (prospects flagged as manual-research-needed are skipped)
  • Status is in your filter (default: new only — already-sent / bounced / promoted are excluded)
  • Vendor is in your selected list (or all if none picked)
  • Fit score meets your floor (or any if none picked)

The page shows a rough live preview count; the server resolves the exact count on launch with all filters applied (including dedupe-on-email).

Throttle

Sends per hour. Cold-outbound deliverability rules of thumb: under 30/hour from a fresh domain, under 100/hour from a warmed one. v1 enforces this loosely (the recursive worker drains in batches of 25; spread depends on Vercel function concurrency).

Test send + launch

  • Save draft — persists the campaign without sending anything.
  • Send test to me — saves the draft if needed, then sends a single rendered email to the admin's auth email using the highest-fit prospect as variable substitution. Use this to preview the rendered shape before launching.
  • Launch campaign — saves, resolves the recipient list, flips the campaign to a sending state, and starts the dispatch worker. From there the worker drains pending sends in 25-row batches, retries failures with exponential backoff (30s → 2m → 10m → 30m → 1h → 4h, then gives up), and a daily safety-net cron sweep covers anything the worker misses.

Watching a campaign run

Click any campaign in the Recent campaigns table to see its detail page. The detail page surfaces three things:

Engagement funnel

Five tiles tracking the recipient's path through the campaign: Recipients (the resolved list), Sent (made it out the door), Opened (loaded the tracking pixel — noisy, mail-client prefetch counts), Clicked (followed any tracked link in the body — a stronger signal), Replied (sent an inbound reply that landed back in the channel inbox — the strongest signal). Each engagement tile shows its rate as a fraction of Sent so you can read conversion at a glance.

Deliverability tiles

Below the funnel: Bounced, Failed, Opted out, and Personalization cost. Bounce and opt-out tiles colour-shift when their rates cross the deliverability red lines (see below). Personalization cost shows when templates use the static {{personal_line}} captured at discovery time; it populates with real spend once per-send opener regeneration is enabled.

Vendor break-out

A bar chart showing how sends + opens are distributed across the competing vendors that discovery detected. Useful for noticing patterns like "Zendesk users open at twice the rate of Drift users on this subject line" — a hint to either lean in on the high-engagement segment or rework the messaging for the low-engagement one.

Recent sends + per-recipient timeline

Up to 50 recipients with their status badge, an inline engagement timeline (Sent → Opened → Clicked → Replied, plus Bounced / Opted out markers), and any bounce / failure reason. Hover over any timeline event to see the exact timestamp.

Engagement tracking and CRM promotion

Once a campaign goes out, Hydra watches three things and acts on them: engagement events from Resend (delivered / opened / clicked / bounced / complained), inbound replies through the channel's existing email flow, and one-click unsubscribes via the per-recipient link in every send.

Engagement signals tracked per send

  • Opened — first time the recipient (or their mail client) loads the tracking pixel. Mail-client prefetch makes this signal noisy, so opens are recorded but never trigger CRM promotion.
  • Clicked — first time any tracked link in the body is followed. Stronger signal than open. Promotes the prospect (see below).
  • Replied — first inbound reply arrives in the channel's inbox. The strongest signal. Promotes the prospect.
  • Bounced — Resend reports a hard bounce. The recipient email is added to your suppression list and future sends to that address are skipped automatically.
  • Opted out — recipient clicked the unsubscribe link or marked the email as spam. Both add the address to your suppression list.

Promote-on-engagement

When a cold prospect replies or clicks for the first time, Hydra:

  1. Creates an Account for them, marked as a Prospect (or reuses an existing Account if you already have one for the same domain on this tenant).
  2. Creates a Lead linked to that Account, with the source set to cold outbound. If the prospect was reply-driven, the Lead is also linked to the conversation that carries the reply.
  3. Marks the cold prospect as promoted so it never re-enters a recipient pool.
  4. Writes an entry to the team audit log noting the trigger (reply or click) and the originating campaign send.

The whole flow is idempotent — re-firing on the same prospect (the same recipient clicks a second link, or replies twice) is a no-op.

Unsubscribe

Every campaign send carries a per-recipient {{unsubscribe_url}} token. If your body template uses {{unsubscribe_url}} directly, it renders inline; otherwise Hydra appends a one-line Unsubscribe: <link> footer so every cold-outbound carries an opt-out path.

The token is HMAC-signed and never expires — a recipient who digs the email out of their archive months later can still opt out cleanly.

Hydra also sets RFC 8058 List-Unsubscribe and List-Unsubscribe-Post: List-Unsubscribe=One-Click headers so Gmail and Outlook show a one-click "Unsubscribe" button next to the From line.

Suppression list

Hydra maintains a per-tenant suppression list — the single source of truth for "do not send." The send worker checks it before every email goes out. Addresses land on the list from four sources:

  • Unsubscribed — recipient hit the unsubscribe link (or the one-click header)
  • Bounced — Resend reported a hard bounce
  • Complained — recipient marked the email as spam
  • Manual — admin added the entry directly (no UI yet; managed via API)

Sends to a suppressed address are marked as opted out and no email is dispatched.

Setup required

To capture engagement events, the Resend webhook must point at the Hydra app:

  1. In your Resend dashboard, Webhooks → Add Endpoint.
  2. URL: https://hydra-one-tau.vercel.app/api/marketing/resend-webhook
  3. Subscribe to: email.delivered, email.opened, email.clicked, email.bounced, email.complained.
  4. Copy the signing secret (whsec_…) and set it as RESEND_WEBHOOK_SECRET in your Vercel environment (Production scope).

Without this, sends still go out and replies still promote (the inbound flow is independent), but bounces and clicks won't get tracked or trigger suppression / promotion.

Cross-campaign analytics

Once you have at least one campaign with sends in the last 30 days, the Outreach hub renders a Cross-campaign analytics section above the Lead Discovery panel. It rolls up everything across every campaign you've sent in the window:

  • Headline tile group — Attempted (sent + bounced + opted out), Open rate, Click rate, Reply rate, Bounce rate, Opt-out rate. The bounce + opt-out tiles colour-shift when they cross the deliverability red lines below.
  • Top subjects by open rate — your top-5 best-performing subject lines (minimum 5 sends per campaign, otherwise the rate isn't meaningful). Use this to rotate winning subjects into future campaigns and retire underperformers.
  • Opt-out rate — last 7 days — current 7d opt-out rate plus a ±Xpp delta vs the prior 7 days (positive = trending worse, negative = trending better). The delta is a leading indicator: opt-out rates accelerate before deliverability problems become bounces.

The window is rolling — old campaigns drop off the back as new sends accumulate.

Deliverability red lines

The thresholds you should treat as hard rules, not suggestions:

  • Bounce rate ≥2% — pause your sending and warm the domain. A 2%+ bounce rate signals to mailbox providers (Gmail, Outlook, Yahoo) that your list quality is low, which throttles your inbox placement on every future send. Drop to a smaller, higher-fit recipient list and re-warm before scaling back up.
  • Bounce rate ≥5% — stop. Your domain is at real risk of being blacklisted; further sends compound the damage.
  • Opt-out rate ≥0.1% — warning. Tighten targeting or rework the subject + opener. Customers opt out faster than they reply, so this signal arrives before you see the reply-rate cliff.
  • Opt-out rate ≥0.5% — stop. Your audience is actively rejecting your messaging at a rate that will trigger spam-complaint thresholds at the major mailbox providers next.
  • Spam complaint rate ≥0.1% — stop immediately. Spam complaints are the most punishing signal; a single campaign over this threshold can blacklist your sending domain for weeks.

Hydra surfaces these thresholds visually — bounce + opt-out tiles on both the campaign detail page and the cross-campaign analytics section flip from neutral → amber → red as their rates cross the warning + red-line thresholds.

Why prospects stay separate from your CRM

Three reasons cold prospects stay out of the live CRM until engagement:

  1. Volume. A single HTTP Archive harvest can produce 30,000 rows easily, more for broad vendor filters. Mixing those into your Leads list would break list filtering and distort the lifecycle stage counts on your Accounts.
  2. Deliverability metadata. Cold prospects accumulate bounces, opt-outs, and engagement signals that have no business on a real Lead or Contact record.
  3. Mental model. "Lead" in your CRM means someone who came in through the front door — your widget, your inbox, a referral. Cold-outbound prospects haven't met that bar yet. The promotion event (reply / click) is the moment they earn the upgrade.

Permissions

The Marketing nav and the Outreach page are admin-only in v1. Members do not see the link in the sidebar, and direct navigation to /marketing/outreach redirects to login if not authenticated. Per-feature member-level permission gating is on the roadmap once a customer asks.

Related articles

  • Marketing — Lead Discovery — the BigQuery → Firecrawl → Anthropic → SMTP pipeline that fills the prospects table.
  • Email domains — verifying the sender domain you'll use for outbound campaigns (required before any campaign can send).