Skip to main content

Case study · SaaS / Sales outreach

OutreachProCold email outreach through your own Gmail or Outlook mailbox

A cold email platform for lists, templates, multi-step sequences, and delivery through the sender's own Gmail or Outlook mailbox — with deliverability safeguards, reply detection, a public API, and signed webhooks.

OutreachPro social card: the OutreachPro logo with the line "Email the people who asked to hear from you."

The challenge

Outreach has to be paced, compliant, and deliverable: bulk senders must honour one-click unsubscribes, stay inside mailbox limits, and recover cleanly when a send fails — without a web request doing the sending.

The solution

Campaigns are queued, not sent, by the request that starts them. A scheduled worker claims batches with FOR UPDATE SKIP LOCKED, checks suppression lists and send windows, reserves a slot on the mailbox (daily and hourly caps, warm-up ramp, pacing) in a single atomic update, then sends and records the outcome.

What we built

  • Lists, templates, sequences with follow-ups threaded into the original conversation
  • Gmail and Outlook sending over OAuth
  • One-click List-Unsubscribe, account-wide suppression, and multipart text + HTML mail
  • Open, click, reply, and bounce tracking
  • SPF, DKIM, and DMARC checks plus a spam-risk score for templates
  • Public API with hashed keys and HMAC-signed webhooks

Architecture

Application
Next.js 16, React 19, TypeScript
Data
Supabase Postgres with row-level security
Integrations
Gmail API, Microsoft Graph, Cloudinary
Operations
Queue worker triggered every five minutes by GitHub Actions

Engineering challenges

  • A worker that never sleeps between messages: pacing lives in the database, so function time is spent sending
  • Failures classified into reconnect, bounce, or retry-with-backoff-and-jitter
  • OAuth tokens encrypted at rest; unsubscribe and tracking links use HMAC-signed, purpose-separated tokens
  • Row-level security with an explicit policy on every table, and a cron secret compared in constant time

Next step

Have a similar problem to solve?

A free 30-minute discovery call, then a written scope and a fixed-price quote — before you commit to anything.