Je Instantly dashboard opent met 200 leads in de wachtrij, templates klaar, en datzelfde holle gevoel — nog een batch "Hi {firstName}, I noticed your company..." staat op het punt verstuurd te worden. Elk bureau haat cold email. Wij ook. Niet omdat outreach niet werkt, maar omdat elk platform waar we voor betaalden nog steeds uren handmatig onderzoek nodig had, nog steeds kopij verstuurt die voelt als geschreven door een bot, en nog steeds €300/maand kostte om te doen wat we wisten dat Claude beter in seconden kon doen. We stopten met huren. We koppelden Claude, Hunter, Instantly en Supabase aan elkaar in een systeem dat contextuele openers schrijft uit live web scrapes, replies scoort op intent, en logt elke interactie zonder de SaaS tax. De architectuur is niet ingewikkeld — maar de reply rate sprong omhoog, het drukwerk verdween, en we bezitten de hele stack.

Dit is geen theoretisch architectuur artikel. We runnen dit systeem al maanden in productie, versturen duizenden gepersonaliseerde e-mails die daadwerkelijk replies krijgen. Ik zal je precies laten zien waarom we het bouwden, hoe de stukken passen, en wat we op de hard way hebben geleerd.

Inhoudsopgave

Waarom We Ons Eigen Cold Email Systeem Bouwden met Claude, Instantly & Supabase

Het Probleem Met Off-the-Shelf Outreach

We probeerden de gebruikelijke verdachten. Lemlist. Apollo. Woodpecker. Het zijn fijne tools voor veel use cases. Maar als headless web development bureau, waren onze outreach behoeften op manieren specifiek waar deze platforms niet mee overweg konden.

Hier is wat steeds fout ging:

Generieke personalisatievelden zijn geen personalisatie. Iemands bedrijfsnaam en functietitel in een template stoppen bedrieg niemand in 2026. We hadden e-mails nodig die verwezen naar een prospect's werkelijke tech stack, hun site performance problemen, of specifieke architectuurbesluiten zichtbaar op hun openbare website.

De onderzoeksstap was het knelpunt. Onze best presterende outreach betrok altijd iemand van het team die daadwerkelijk naar een prospect's site keek, deze door PageSpeed Insights haalde, hun framework checkte, en iets specifieks schreef. Dat duurde 10-15 minuten per lead. Op schaal is dat een fulltime baan.

Data leefde op te veel plekken. Leads in één spreadsheet, e-mail sequences in ander platform, resultaten in derde dashboard. We konden geen feedback loops bouwen omdat niets met elkaar sprak.

De AI integraties waren oppervlakkig. Sommige platforms voegden "AI writing" features toe, maar het waren eigenlijk GPT wrappers die dezelfde saaie kopij genereerden die iedereen verstuurde. Geen mogelijkheid om aangepaste context in te voeren, geen controle over prompts, geen manier om multi-step reasoning chains te bouwen.

We hadden een systeem nodig waar AI het onderzoek deed, niet alleen het schrijven.

Onze Tech Stack en Waarom We Kozen

Hier is wat we uiteindelijk na wat iteraties aflandden:

Component Tool Rol Maandelijkse Kosten
Leads vinden & email verificatie Hunter.io Vind en verifieer e-mailadressen €49 (Starter)
AI onderzoek & copywriting Claude (Anthropic API) Analyseer prospects, genereer gepersonaliseerde e-mails ~€30-60
Database & orchestration Supabase Sla leads op, beheer state, trigger workflows €25 (Pro)
Email verzending & warmup Instantly.ai Leverbaarheid, verzendinfrastructuur, warmup €30 (Growth)
Automation lijm Custom Edge Functions + Cron Verbind alles met elkaar €0 (inbegrepen in Supabase)

We evalueerden veel alternatieven. Hier is de korte versie van waarom we kozen wat we kozen:

Claude over GPT-4: We testeden beide uitgebreid. Claude 3.5 Sonnet (en nu Claude 4 Sonnet in 2025) produceerde consistent e-mails die natuurlijker klonken en minder "AI-achtig." Het was ook beter in volgen van complexe system prompts zonder af te drijven. De prijsstelling was vergelijkbaar, maar Claude's langere context window betekende dat we meer onderzoeksdata per prospect konden invoeren.

Supabase over Airtable of een aangepaste Postgres setup: We hadden een echte database nodig met row-level security, maar we wilden geen infrastructuur beheren. Supabase gaf ons Postgres, Edge Functions, Cron jobs en een fatsoenlijk dashboard — alles op één plek. We gebruiken Supabase zwaar voor klantprojecten dus het team kende het al goed.

Instantly over Lemlist of Smartlead: Instantly's warmup netwerk is echt goed, hun API is schoon, en de prijsstelling maakte zin voor onze volume. We hebben Instantly's ingebouwde sequence builder niet nodig omdat we sequencing logic zelf afhandelen.

Hunter over Apollo of Snov.io: Hunter's email verificatie is consistent het nauwkeurigst dat we testeden. Hun domain search API is snel en de data kwaliteit is hoog. Apollo heeft meer data punten, maar we vonden hun email accuracy lager, wat leverbaarheid doodt.

Architecture Overzicht

Het systeem werkt in vijf stadia, elk onafhankelijk draaiend:

[Lead Sources] → [Hunter Enrichment] → [Supabase DB] → [Claude Research + Copy] → [Instantly Sending]
     ↑                                       ↑                                           |
     |                                       |                                           |
     +----------- Feedback Loop -------------+-------------------------------------------+
  1. Ingest: We voeren prospect domeinen in uit verschillende bronnen (handmatige lijsten, scrapers, referral data)
  2. Enrich: Hunter vindt contacten en verifieerd e-mails
  3. Store: Alles belandt in Supabase met status tracking
  4. Research + Write: Claude analyzeert elke prospect en genereert gepersonaliseerde kopij
  5. Send: Goedgekeurde e-mails pushen naar Instantly campaigns
  6. Learn: Reply data stroomt terug naar Supabase, informeert toekomstige personalisatie

Elk stadium is ontkoppeld. Als Hunter's API uitvalt, wordt de enrichment queue gewoon onderbroken — het breekt verzending niet. Als we Claude willen vervangen met een ander model, veranderen we één functie.

Waarom We Ons Eigen Cold Email Systeem Bouwden met Claude, Instantly & Supabase - architecture

Leads Vinden en Verrijken met Hunter

Hunter.io handelt twee kritieke banen af: de juiste persoon in een bedrijf vinden en verifiëren dat hun e-mailadres daadwerkelijk werkt.

Hier is een vereenvoudigde versie van onze enrichment functie:

import { createClient } from '@supabase/supabase-js';

const HUNTER_API_KEY = Deno.env.get('HUNTER_API_KEY');

async function enrichLead(domain: string) {
  // Domain search om decision makers te vinden
  const searchRes = await fetch(
    `https://api.hunter.io/v2/domain-search?domain=${domain}&department=executive,it&api_key=${HUNTER_API_KEY}`
  );
  const searchData = await searchRes.json();
  
  const contacts = searchData.data.emails
    .filter((e: any) => e.confidence > 70)
    .slice(0, 3); // Top 3 contacten per domein
  
  // Verifieer elke e-mail
  for (const contact of contacts) {
    const verifyRes = await fetch(
      `https://api.hunter.io/v2/email-verifier?email=${contact.value}&api_key=${HUNTER_API_KEY}`
    );
    const verifyData = await verifyRes.json();
    
    if (verifyData.data.status === 'valid') {
      await supabase.from('leads').insert({
        domain,
        email: contact.value,
        first_name: contact.first_name,
        last_name: contact.last_name,
        position: contact.position,
        confidence: contact.confidence,
        status: 'enriched',
        enriched_at: new Date().toISOString()
      });
    }
  }
}

We filteren op de executive en it afdelingen omdat dat onze kopers zijn — CTOs, VPs of Engineering, technische founders. Hunter's afdeling filtering is niet perfect, maar het filtert veel ruis weg.

Een ding wat we leerden: sla email verificatie nooit over. Zelfs met Hunter's confidence scores, verifiëren we nog steeds elk adres. Een bounce rate boven 3% zal je sending domein's reputatie slopen. We hebben domeinen zien gaan van 95% inbox placement naar 40% spam folder van één slechte batch.

We runnen ongeveer 500 credits van Hunter searches per week, wat comfortabel in hun Starter plan past.

AI Personalisatie met Claude

Dit is waar dingen interessant worden. De Claude integratie is niet zomaar "schrijf me een cold email." Het is een multi-step onderzoeks- en schrijfpipeline.

Stap 1: Website Analyse

Voordat Claude iets schrijft, voeren we het gegevens over de prospect's website in. We schrapen basis informatie met een lichtgewicht functie:

async function analyzeProspectSite(domain: string) {
  // Fetch homepage en key pages
  const homepage = await fetch(`https://${domain}`);
  const html = await homepage.text();
  
  // Extract tech signalen uit HTML
  const signals = {
    hasNextJs: html.includes('__next') || html.includes('_next/static'),
    hasReact: html.includes('react') || html.includes('__REACT'),
    hasWordPress: html.includes('wp-content') || html.includes('wp-includes'),
    hasShopify: html.includes('shopify') || html.includes('cdn.shopify'),
    hasGatsby: html.includes('gatsby'),
    usesJQuery: html.includes('jquery'),
    metaGenerator: extractMeta(html, 'generator'),
    pageSize: html.length,
    // ... meer signalen
  };
  
  // Voer PageSpeed check uit via API
  const psiData = await fetchPageSpeedInsights(domain);
  
  return {
    ...signals,
    performanceScore: psiData.lighthouseResult.categories.performance.score * 100,
    lcp: psiData.lighthouseResult.audits['largest-contentful-paint'].numericValue,
    cls: psiData.lighthouseResult.audits['cumulative-layout-shift'].numericValue,
    fid: psiData.lighthouseResult.audits['max-potential-fid'].numericValue
  };
}

Dit geeft Claude echte gegevens om mee te werken. Niet "Hoi, ik merkte op dat je bedrijf X doet" — meer als "Je homepage LCP is 4.2 seconden en je runnen nog steeds jQuery naast React, wat 90KB aan je initial bundle toevoegt."

Stap 2: Claude Research Prompt

We gebruiken Claude's API met een zorgvuldig ontworpen system prompt. Hier is een vereenvoudigde versie:

const researchPrompt = `Je bent een senior web developer die een prospect's website analyzeert voor een headless development bureau. Gegeven de volgende technische gegevens over hun site, identificeer:

1. Hun huidige tech stack (wees specifiek)
2. 2-3 concrete performance of architecture problemen
3. Wat een migratie naar moderne headless architectuur zou kunnen verbeteren
4. Een specifieke, niet-voor-de-hand-liggende observatie die echt analyse toont

Wees NIET generiek. Mocht je niets specifieks kunnen vinden, zeg dat dan.
Noem NIET "in today's digital landscape" of soortgelijke vulling.
Wees direct en technisch.

Site gegevens:
${JSON.stringify(siteAnalysis, null, 2)}

Prospect: ${lead.first_name} ${lead.last_name}, ${lead.position} op ${lead.domain}`;

const research = await anthropic.messages.create({
  model: 'claude-sonnet-4-20250514',
  max_tokens: 1000,
  messages: [{ role: 'user', content: researchPrompt }]
});

Stap 3: Email Generatie

De research output voert in naar een tweede Claude call die de werkelijke e-mail schrijft. Het splitsen van onderzoek van schrijven was een sleutel inzicht — toen we probeerden beide in één prompt te doen, waren de e-mails slechter. Claude zou het onderzoek overslaan om sneller tot schrijven te komen.

const emailPrompt = `Schrijf een cold email van een senior developer op een headless web bureau.

Underzoeks notities:
${research.content[0].text}

Regels:
- 4-6 zinnen max. Elke zin moet zijn plaats rechtvaardigen.
- Begin met de meest specifieke technische observatie.
- Geen vleierij. Geen "Ik hou van wat je doet."
- Één duidelijke CTA: vraag of ze een performance audit willen zien.
- Klink als een developer, niet een verkoopster.
- Gebruik hun voornaam. Geen achternaam in aanhef.
- Onderwerpregel: kort, specifiek voor hun tech issue, kleine letters.`;

Het resultaat? E-mails die beginnen met dingen als "Je Shopify Plus store rendert product pagina's server-side die statisch gegenereerd zouden kunnen worden — dat voegt 2+ seconden toe aan elk product view" in plaats van "Ik merkte je indrukwekkende bedrijf op en wilde bereiken."

Supabase als de Orchestration Layer

Supabase is het brein van de operatie. Hier is ons kern schema:

create table leads (
  id uuid primary key default gen_random_uuid(),
  domain text not null,
  email text,
  first_name text,
  last_name text,
  position text,
  confidence int,
  status text default 'new', -- new, enriched, researched, drafted, approved, sent, replied, bounced
  site_analysis jsonb,
  research_notes text,
  email_subject text,
  email_body text,
  instantly_campaign_id text,
  sent_at timestamptz,
  opened_at timestamptz,
  replied_at timestamptz,
  created_at timestamptz default now(),
  updated_at timestamptz default now()
);

create index idx_leads_status on leads(status);
create index idx_leads_domain on leads(domain);

Het status veld drijft alles aan. Supabase Cron jobs runnen elke 15 minuten, pakken leads op in elk stadium en duwen ze naar het volgende:

-- Cron: Verwerk verrijkte leads via Claude onderzoek
select cron.schedule(
  'process-research',
  '*/15 * * * *',
  $$select net.http_post(
    'https://your-project.supabase.co/functions/v1/process-research',
    '{}',
    '{"Authorization": "Bearer your-service-key"}'::jsonb
  )$$
);

We batch verwerken 20 leads per run om binnen Claude's rate limits te blijven en kosten voorspelbaar te houden.

De site_analysis JSONB kolom is ongelooflijk nuttig. We kunnen over alle onze leads queryen om patronen te vinden — zoals "toon me alle leads die WordPress runnen met een performance score onder 50" — en gericht campagnes van die segmenten bouwen.

Verzenden op Schaal met Instantly

Instantly handelt de werkelijke email deliverij af. We pushen goedgekeurde e-mails via hun API:

async function pushToInstantly(lead: Lead) {
  const response = await fetch('https://api.instantly.ai/api/v1/lead/add', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      api_key: INSTANTLY_API_KEY,
      campaign_id: lead.instantly_campaign_id,
      skip_if_in_workspace: true,
      leads: [{
        email: lead.email,
        first_name: lead.first_name,
        last_name: lead.last_name,
        company_name: lead.domain,
        personalization_1: lead.email_subject,
        personalization_2: lead.email_body
      }]
    })
  });
  
  if (response.ok) {
    await supabase
      .from('leads')
      .update({ status: 'sent', sent_at: new Date().toISOString() })
      .eq('id', lead.id);
  }
}

Instantly's campaign templates gebruiken {{personalization_1}} en {{personalization_2}} variabelen, die mappen naar onze Claude-gegenereerde onderwerp en body. De campaign zelf is alleen een shell — alle intelligentie leeft in ons systeem.

We runnen 3 verzendaccounts via Instantly's warmup voor minstens 2 weken voordat we outreach versturen. Domein warmup is niet optioneel. We leerden dit op de hard way met ons eerste domein dat flagged werd binnen een week.

Leverbaarheid Setup

Onze verzendinfrastructuur:

  • 3 domeinen (variaties van onze brand, niet ons hoofd domein)
  • SPF, DKIM en DMARC geconfigureerd op alle
  • Google Workspace accounts (niet Outlook — Google handelt cold email beter af in onze testing)
  • Instantly warmup continu draaiend, ook op actieve verzend dagen
  • Max 35 e-mails per account per dag
  • Willekeurige verzend intervallen tussen 3-7 minuten

De Automation Lijm

Supabase Edge Functions verbinden alles. Hier is de flow in pseudocode:

Elke 15 minuten:
  1. Pak leads met status='new', voer Hunter enrichment uit → status='enriched'
  2. Pak leads met status='enriched', voer site analyse uit → status='analyzed'
  3. Pak leads met status='analyzed', voer Claude onderzoek + email gen uit → status='drafted'
  4. (Mens review draft e-mails in Supabase dashboard)
  5. Pak leads met status='approved', push naar Instantly → status='sent'
  6. Trek engagement data uit Instantly API → update opened_at, replied_at

Stap 4 is belangrijk. We automatiseren verzending niet volledig. Elke e-mail krijgt een menselijke beoordeling voordat deze uitgaat. Dit vangt de occasionele hallucinatie (Claude claimde eens dat een site met Remix gebouwd was toen het duidelijk Next.js was) en laat ons persoonlijke toetsen toevoegen.

De beoordeling stap duurt ongeveer 2-3 seconden per e-mail omdat Claude 95% van het werk correct doet. We keuren in batches goed met een eenvoudig Supabase dashboard view.

Resultaten en Wat We Geleerd Hebben

We runnen dit systeem sinds Q1 2025. Hier zijn echte getallen:

| Metriek | Ons Systeem | Industrie Gemiddelde (2026) | |--------|-----------|------------------------|| | Open Rate | 62% | 24% | | Reply Rate | 8.4% | 1-3% | | Positieve Reply Rate | 4.1% | 0.5-1% | | Bounce Rate | 0.8% | 3-5% | | Kosten Per Lead Gecontacteerd | €0.18 | €0.50-2.00 | | Tijd Per Lead (menselijk) | ~5 seconden (review) | 10-15 minuten |

De open rate is hoog omdat de onderwerpen specifiek zijn. "your shopify lcp is 4.2s" wordt geopend. "Quick question" niet.

De reply rate is hoog omdat de e-mails echt technisch kennis demonstreren. Wanneer een CTO een e-mail leest die correct hun tech stack identificeert en een echt performance problem, is het meer waarschijnlijk dat ze reageren — zelfs als ze weten dat het outreach is.

Wat Niet Werkte

Volledig geautomatiseerde verzending (geen menselijke beoordeling): We probeerden dit twee weken. Claude hallucineerde tech stack details ongeveer 5% van de tijd. Dat is een laag fout tarief voor een LLM, maar het versturen van een e-mail die zegt "je React app" naar iemand die Vue runnen is erger dan een generieke e-mail versturen. De vertrouwen schade is echt.

Lange e-mails: Onze eerste Claude prompts genereerden 8-10 zin e-mails. Reply rates waren half van wat we nu zien met 4-6 zinnen. Korter is beter. Altijd.

Meer dan 40 e-mails per dag per account versturen: Leverbaarheid valt van een klif af. 30-35 is het sweet spot in 2026.

Claude gebruiken voor vervolgingen op basis van opens: We probeerden vervolgings e-mails genereren getriggerd door opens. De vervolgingen voelden pushy en de conversion was niet de kosten waard. We versturen nu één eenvoudige, niet-AI vervolgingen drie dagen later.

Kostenoverzicht

Hier is wat dit ons maandelijks kost, ongeveer 2.000 leads verwerkt:

Service Maandelijkse Kosten Notities
Hunter.io (Starter) €49 500 searches + verifications
Anthropic API (Claude) €45 ~2.000 research + email generations
Supabase (Pro) €25 Database, Edge Functions, Cron
Instantly (Growth) €30 Verzending, warmup, analytics
Google Workspace (3 accounts) €21 Verzendinfrastructuur
Domeinen (3) €10 Afgeschreven jaarlijkse kosten
Totaal ~€180 €0.09 per lead verwerkt

Vergelijken dat met Apollo's €79/maand plan (gelimiteerde enrichment, basis sequences) of Lemlist's €69/maand per seat. We geven minder uit en krijgen dramatisch betere resultaten omdat de personalisatie echt is, niet template-gebaseerd.

Voor context, dit systeem heeft direct leads gegenereerd die omgezet zijn in Next.js development en Astro development projecten waard 50-100x de maandelijkse kosten. De ROI is absurd.

Veelgestelde Vragen

Hoe lang duurde het om dit systeem te bouwen? De eerste werkende versie duurde ongeveer twee weken deeltijds werk — misschien 40 uur totaal. We hebben er continu aan geiterasd sinds, vooral Claude prompts aanpassen en edge case handling toevoegen. Als je comfortabel bent met Supabase Edge Functions en REST APIs, je een basis versie in een weekend draaiend.

Is dit niet gewoon spam met extra stappen? Redelijke vraag. Het verschil is dat elke e-mail een echt technische observatie bevat over de website van de ontvanger. We blaasten geen "let's hop on a call" naar 10.000 mensen. We versturen specifieke, nuttige inzichten naar een gericht lijstje van mensen die werkelijk de problemen hebben die we oplossen. Onze unsubscribe rate is onder 0.5%, wat suggereert dat ontvangers het niet als spam zien.

Waarom Claude in plaats van GPT-4 of Gemini? We testeden alle drie. Claude volgde onze system prompts betrouwbaarder — vooral de constraints als "don't be generic" en "don't use filler phrases." GPT-4 zou afdrijven naar salesy language zelfs met expliciete instructies niet te doen. Gemini was snel maar de output kwaliteit was inconsistent. Dit kan veranderen als models evolueren, en ons systeem is ontworpen om modellen gemakkelijk te wisselen.

Hoe handelen jullie GDPR en CAN-SPAM compliance af? Al onze outreach richt zich op business e-mails (niet persoonlijk), bevat ons fysieke adres, en heeft een duidelijke opt-out in elke e-mail. Voor GDPR verwerken we gegevens onder legitimate interest voor B2B outreach, onderhouden records van verwerkingsactiviteiten, en eren verwijdeingsverzoeken onmiddellijk via een geautomatiseerde webhook. We wissen ook leads ouder dan 90 dagen uit onze database automatisch. Praat met een advocaat voor je specifieke situatie — dit is geen juridisch advies.

Wat gebeurt er wanneer een lead reageert? Reply's stromen terug uit Instantly's API naar Supabase. We krijgen een Slack notificatie voor elke reply, en een mens neemt het gesprek onmiddellijk over. We gebruiken nooit AI voor reply handling. Zodra iemand engage, verdienen ze een echt persoon. Geïnteresseerde prospects worden naar onze contact pagina of direct naar een call booking link verwezen.

Kan deze aanpak voor niet-technische services werken? De site analyse stuk is specifiek voor web development, maar het architecture patroon — verrijken leads, gebruik AI om onderzoek en personalisatie, verzend via een dedicated tool — werkt voor elke B2B outreach. Je zou net andere onderzoeks inputs nodig hebben. Een design bureau zou visual design en UX patronen kunnen analyseren. Een marketing bureau zou SEO metriek kunnen pullen. De sleutel is echte gegevens in Claude voeren, niet het iets verzinnen.

Wat is het moeilijkste deel van het onderhouden van dit systeem? Prompt onderhoud. Wanneer Claude modellen updaten, hebben prompts die perfect werkten soms aanpassing nodig. We besteden ook tijd aan email leverbaarheid bewaking — Google Postmaster Tools checken, spam rate spikes kijken, verzend accounts roteren. Het is misschien 2-3 uur per week onderhoud totaal.

Zou je dit als product verkopen? We hebben erover nagedacht, maar eerlijk gezegd is het competitieve voordeel te waardevol. Mocht elk bureau dit exacte systeem runnen, de effectiviteit zou dalen omdat ontvangers AI-onderzochte e-mails overal zouden gaan zien. Voor nu houden we het als internal tool. Mocht je hulp willen bij het bouwen van iets vergelijkaars voor je bedrijf, neem contact op — we helpen een aantal clients soortgelijke systemen opzetten als onderdeel van onze headless CMS development werk.