- 1Intro
- 2Follow-ups
- Every inbox warmed up and reputation-scored; below the bar it sends less, automatically
- Warm-up ≥90% gates send volume, with daily limits enforced per inbox
A founder, a marketer and an engineer see three different problems in one funnel. I think in all three, so I find the one that matters. Outbound is one of them, and the system below runs in production.
You'll leave knowing what to automate first






One fresh-intent pipeline books most of the meetings. Four more run underneath it on the same qualification, copy and delivery layer. Here's the flagship in depth first, then the whole estate.
The numbers below are the fresh-intent pipeline alone, for one cycle. The other pipelines run on the same qualification layer but their own signals and schedules.
Someone likes a post from a person our buyers follow. Thirteen stages later they are a qualified lead in a campaign with copy written for them. Nobody touches it.
Every stage that costs something sits behind a stage that costs nothing. A cheap screen on the job title we already have runs before any enrichment API is called. Whether the person fits runs before we enrich their company. The company score runs before we go looking for an email address. By the time we spend real money on a record, three separate filters have already agreed it is worth it.
It runs twice a day and drains each stage to empty before moving on, so an interruption costs time and not correctness.
Every message is written off the prospect's most recent LinkedIn post, their company and them, then tailored to the channel it goes out on.
LinkedInRead once from production, July 2026. Totals only, nothing live.
Outbound isn't one pipeline. Five of them start from different signals and converge on the same qualification, copy and delivery layer, backed by the loop that keeps all of it running unattended.
Engagement on posts from accounts we watch
Full rate — 15% email · 30% LinkedIn reply · 40% connection accept
Twice a day. The flagship, and the source of the funnel below.
Intent leads already sitting in the outreach platforms, never replied
~25K reached (15K email · 10K LinkedIn) · half the fresh-intent rate
Weekly and deliberately off-peak, because it shares rate limiters with the daily runs. High volume, colder audience.
Leads whose email sequence ran out without a reply
~11K leads · 20% accepted · 15% reply (LinkedIn only)
Twice a week. A second touch on a different channel costs almost nothing, because the enrichment is already paid for.
Curated lists, routed by region
~50-60 calls/day · ~5 meetings/day
Built in n8n on Retell rather than in the TypeScript stack. A voice channel alongside email and LinkedIn.
Funding announcements pulled from the news
~6.5K reached (email + LinkedIn) · half the fresh-intent rate
Daily, on its own tenant. A company that just raised is a company that just started spending. Newest and smallest.
One scoring prompt, one set of copy frameworks, one delivery layer. A new pipeline only has to produce qualified leads; everything after that already exists.
Five pipelines are only worth having if they stay up without anyone watching them. Three loops make that true, each on its own schedule.
It reads the last 24 hours, works out what broke and why, posts to Discord, opens GitHub issues, and ships approved fixes.
Cold email only works while the mailboxes stay healthy. This watches every one of them and pulls the burned ones out.
Live row counts across the whole database, conversion at every stage, and campaign performance by channel. When a number moves the wrong way I can see which stage did it.


Trigger.dev v4, not a no-code tool like n8n. Every stage drains its own queue to empty before the next one starts, and selects its work with a query rather than being handed a batch, so a crash mid-run costs time and not correctness.
PostgreSQL with Drizzle. Cache-first on a 60-day TTL, which is what keeps enrichment spend flat while volume grows. A repeat profile costs nothing.
Claude and GPT behind BAML, so every model call returns a typed structure instead of prose to parse. Scoring is negative-selection: the model argues why a company fails, which is far more reliable than asking it to rate one.



The only genuine waterfall in the system. Providers are tried in cost order and stop at the first hit, then every address is MX-verified before it is allowed anywhere near a campaign.

Managed mailboxes scored on warm-up, bounce and blacklist health. An inbox that drops below the bar sends less, automatically, before it can take a domain down with it. Replies attribute back through HubSpot.
Stall watchdogs on every stage, reporting into Discord. Known failures repair themselves from a whitelist of pre-written SQL behind a row cap, a cooldown and a dry-run default. No model writes a query that touches the database.
Most of what's above started as somebody's manual Tuesday. If you can describe the version of that you're living with, I can usually tell you which part is worth automating first.
Almost every growth problem is one of three things: not enough of the right people arriving, too few of them converting once they do, or too much of the business still being done by hand. The method doesn't change between them.
The expensive part of demand generation isn't the tools, it's the manual loop running between them. These replace the loop.
Signal to qualified lead to written copy to delivery, on a schedule, with nobody in the middle. The engine above is one of them.
Calls, qualifies, routes and writes back to the CRM without anyone listening in. Region-aware, with its own daily caps.
Warm-up, health grading and rotation across hundreds of mailboxes, so deliverability stops being luck.
Traffic that doesn't convert is just cost. This is the half I spent nine years and up to €1.5M a month learning before I started building.
Google, Meta and LinkedIn at scale, with the pacing and account structure that holds a target return rather than chasing it.
Landing pages, audience testing and A/B, with the GA4, GTM and HubSpot tracking wired underneath so a test means something and a booked call traces back to the campaign that caused it rather than being argued about later. Part of how the 2 to 3x month-on-month at Social Beat happened.
Storefront build and optimisation, then the funnel around it.
Most of the manual work inside a company was never customer-facing. It's the spreadsheet nobody owns, the handover that gets forgotten, the report someone rebuilds every Monday.
Any repeated manual process turned into something that runs on a schedule, reports on itself and says so when it breaks. That's what everything above this section is.
Bespoke internal tools and interfaces for when the off-the-shelf option doesn't fit the process — built on a real token system rather than a template, so the tenth screen still looks like the first. The Mhari console and this page are both these.
Live numbers read from the source instead of a monthly export, plus the tracking underneath that makes them trustworthy. The operations console further up this page is one of these.
Both tracks get built the same way: find the expensive manual loop, then build the thing that runs it and watches itself.
Up to €1.5M a month at GroupM. Running growth at that scale shows you which decisions actually need a person, and which ones are coordination a system does better.
Some shipped and in use, some in progress, some scaffolded with the research done and the build not started. Labelled honestly, newest proof first.
Passion project · Sonic Weaver
A browser visual engine that listens to sound. Low, mid and high frequencies each move a different part of the picture, and the whole thing stays one image instead of three.
JavaScript · WebGL · Web Audio · Storybook

Built for a café
Expense and sales tracking for a café, on Supabase and Vercel. No build step, plain HTML and JS, with three small serverless functions for the one thing that needs elevated privileges.
Supabase · Vercel · Vanilla JS

Client internal tool
Customer feedback capture and an admin dashboard for a jewellery brand, backed by Shopify and running on Vercel serverless. Tracks which review links went out, which got opened, and which turned into an actual rating.
JavaScript · Shopify · Vercel
Claude Code plugin
A plugin that packages everything I learned building the Intent Engine into something any Claude Code session can use: 24 implementation docs, 25 code templates, 8 skills and an architecture agent.
TypeScript · Claude Code
CodeClaude Code plugin
The self-healing loop, pulled out of Qubit's codebase and made generic. Collects health signals from any system, scores it 0-100, fingerprints and dedupes issues, discusses them in a chat channel, and on approval opens GitHub issues and runs safety-gated repairs.
TypeScript · PostgreSQL · Discord · GitHub
CodeSide product
Export compliance and tariff research for small manufacturers.
In progress
The paid media half of the same idea. Nine years of campaign judgement, encoded as a system that runs accounts rather than reports on them.
Visual prototype
One tool for the whole DJ prep workflow instead of four that don't talk to each other. Currently at the stage of working out how it should look and behave.
I perform and make things under the name Your Flow State. Electronic music, DJing, abstract photography, calisthenics.
This is not a hobbies section. The way I build is the way I mix: find the rhythm, iterate in small passes, keep the whole thing coherent instead of impressive in pieces, and show up consistently over a long stretch. The audio-reactive engine exists because those two halves are the same brain, and I wanted to see what happened if I pointed the engineering at the music.
I take on a small number of consulting projects at a time.
Tell me roughly what your outbound looks like now and where it's costing you time. I'll come back with what I'd change first, whether or not it turns into work.
Bring how your outbound runs today. You'll leave knowing which stage is leaking and what I'd fix first, whether or not we end up working together.