• White-label · built with Matteo Caruso
  • 2026
  • Handover

Find them. Email them. Catch every reply.

A marketing team was running outreach from spreadsheets. I replaced it with one app: a lead finder, campaigns sent from the team’s own Microsoft 365 mailboxes, and a CRM where no reply gets lost.

Spring outreach

Sending240 leads · 3 emails · 2 senders

Sending now09:00–17:00 local time · next in 4 min
Sent412of 720 planned
Replied379% of sent
Interested12set by the team
Bounced4moved to do-not-contact

Sequence progress

1Quick question, {{first_name}}100%
2Re: Quick question64%
3Last nudge22%

Latest replies

  • DW
    Dana WhitfieldSounds interesting, can you send times?
    New reply
  • LO
    Luis OrtegaWhat does this cost for a team of 5?
    Asked a question
  • TB
    Tom BeckerYes, let’s talk next week.
    ✦ Ready for a call

Recreated in HTML with demo data. The real app stays private.

Built with Matteo Caruso. Matteo runs the client relationship. I designed and built the system under his name, so the client stays private.

130 automated tests on the sending engine
~10 days from scope to working app
0 spreadsheets left

The problem

Outreach lived in a spreadsheet.

Leads were found by hand, emails were copy-pasted one at a time, and replies got lost across inboxes. Matteo brought me in to build one system for all of it, under his name.

outreach_FINAL_v3.xlsx
ABCD 1NameCompanySent?Replied? 2Dana W.Northwindyes?? check inbox 3Luis Oacme studioy (2x?) 4PriyaFieldnote#N/Ano 5Tom BeckerBluebirdsentreplied to Sam?? 6ana costaLumenbounced
LeadStatus
DW
Dana WhitfieldNorthwind · step 2 of 3
New reply
LO
Luis OrtegaAcme Studio · step 1 of 3
Asked a question
PR
Priya RamanFieldnote · step 3 of 3
Not replied
TB
Tom BeckerBluebird Labs · replied
✦ Ready for a call
AC
Ana CostaLumen & Co · bounced
Do not contact

01 · Find

Leads, without the copy-paste.

Filters, one search bar, saved searches or the team’s own CSV. One search runs every chosen source, merges what it finds, drops anyone already in the CRM and ranks the rest. Every address is verified before anything is sent.

NameCompanyEmail check
Dana WhitfieldHead of Marketing Northwind Valid
Luis OrtegaFounder Acme Studio Valid
Priya RamanOperations Lead Fieldnote Catch-all
Tom BeckerCEO Bluebird Labs Valid
Ana CostaEvents Manager Lumen & Co Invalid
Kenji MoriOffice Manager Harbor Supply Valid

02 · Send

Campaigns that send themselves, carefully.

A campaign is a lead list, a sequence of emails and a schedule. It sends from the team’s own Microsoft 365 mailboxes, follow-ups land in the same thread, and a reply stops the sequence for that person.

240leads in the list
1
Day 0 · 09:00–17:00Quick question, {{first_name}}
2
+2 days · same threadRe: Quick question
3
+4 days · same threadLast nudge

Daily limit per mailbox

20Start at, a day
+5Then add, a day
50Max, a day
20 1
20 2
20 3
20 4
20 5
20 6
20 7
25 8
30 9
35 10
40 11
45 12
50 13
50 14

First week: 20 a dayThen +5 a day, up to 50

Template

Quick question, {{first_name}}

Hi {{first_name}}, I came across {{company}} and loved what your team is building. Would a short call next week be useful?

{{sender_name}}

Live preview for Dana · Northwind

FromSam Taylor

Todana@northwind.co

SubjectQuick question, Dana

Hi Dana, I came across Northwind and loved what your team is building. Would a short call next week be useful?

Sam

A lead missing a variable is skipped with a note. Nothing goes out half-filled.

03 · Catch

Every reply, in one inbox.

The engine reads every mailbox each minute. A real reply stops the sequence and lands in the Unibox as New reply. An out-of-office is logged and the sequence carries on. A bounce goes straight to do-not-contact.

  • New replysequence stops
  • Out of officesequence carries on
  • Bounceddo-not-contact
All replies3
DW
Dana Whitfield 2mSounds interesting, can you send times?
New reply
KM
Kenji Mori 14mAutomatic reply: I’m away until Monday
Out of office
JP
Jonah Price 38mHappy to see a demo, what’s next?
Interested
LO
Luis Ortega 1hWhat does this cost for a team of 5?
Asked a question
You · Step 1 · Mon 09:14Quick question, DanaHi Dana, I came across Northwind and loved what…
You · Step 2 · Wed 10:02Re: Quick question, DanaJust bumping this in case it got buried…
Dana Whitfield · Wed 11:37

Sounds interesting, can you send a couple of times for next week?

Set status ▾Reply in Outlook ↗

04 · Close

A pipeline the team moves by hand.

Everyone who replied sits on a drag-and-drop board, with search, filters and a detail panel for each lead. The app only ever sets New reply. Every other status is a person’s call.

New reply2

DW
Dana WhitfieldNorthwind
SR
Sofia RossiAtlas Events

Asked a question1

LO
Luis OrtegaAcme Studio

Interested1

JP
Jonah PriceCopperline

Ready for a call1

TB
Tom BeckerBluebird Labs

Needs follow-up0

How I built it

The schedule lives in the database.

A schedule inside Supabase (pg_cron) runs the engine every minute, so nothing depends on someone keeping a laptop open. Mailbox credentials sit in an encrypted vault, and row-level security decides who sees what. About ten days from scope to a working app.

Everyminute
1Verify new addresses 2Read every inbox 3One careful send round
  1. Failures that aren’t the lead’s fault never cost the lead its email.A full mailbox or a wrong secret pauses sending with Microsoft’s reason, and throttling just waits. The lead keeps its place.
  2. An email Microsoft didn’t confirm is never retried.If a send can’t be confirmed, it is skipped, not repeated. Nobody gets the same email twice.
  3. No open tracking. People set the status.The app only marks New reply when an answer arrives. Interested, Ready for a call and the rest are a person’s call.
  4. Catch-all addresses are capped at 20%.Addresses that can’t be fully verified still go out, but never more than a fifth of a mailbox’s sends.

$ vitest run

  • ✓sends inside the window on a weekday, never outside it
  • ✓follows the ramp: 20 a day for the first week, then +5 a day
  • ✓sends at most one email per mailbox per round and spaces them out
  • ✓sends follow-ups after their delay, from the same mailbox, in the same thread
  • ✓never sends a half-filled email: a lead missing {{company}} is skipped once, with a note
  • ✓a reply in the thread stops the sequence and shows as New reply
  • ✓an out-of-office answer is logged and the sequence carries on
  • ✓a bounce marks the email bounced, puts the address on do-not-contact and stops the sequence
  • ✓a timeout after Microsoft accepted the email counts as sent (no second send)
  • ✓a database error after a successful send never sends the same step twice
  • ✓an outage spreads its failures over different leads instead of using up one lead
  • ✓a wrong app secret pauses every mailbox and uses up no lead; after Resume the email goes out
  • ✓daylight saving day (25 hours): the limit holds and the window follows local time
  • ✓never verify the same address twice (each check costs a credit)
  • ✓HTML and header injection in lead data is escaped / flattened
  • ✓only the owner sets or removes a key, and nobody signed in can read it back
  • ✓the team always keeps an owner

Tests130 passed (130)

  • Next.js 16
  • React 19
  • Tailwind 4
  • Supabase
  • Postgres + RLS
  • Vault
  • pg_cron
  • Microsoft Graph
  • Vercel
  • Vitest

Where it is now

Handover.

The app is being handed over through Matteo, with a step-by-step Microsoft 365 setup guide and a plain-English running-costs sheet. Zero spreadsheets left.

Next side quest Playivity One design system and a cast of animated characters for a kids’ activity platform used in schools.
Yanis Schweizer
Want something like this built? I decide, AI types. You own the code. Fixed price.