AutomationAI Automation

    We Built Our Own B2B Outreach Engine — Here's How It Works and What It Generated

    June 12, 2026
    We Built Our Own B2B Outreach Engine — Here's How It Works and What It Generated — product screenshot

    Project: GarunaCDX Internal B2B Outreach Automation System
    Built By: GarunaCDX Software Solutions LLP
    Stack: Claude API · TypeScript · Brevo SMTP · Prisma · PostgreSQL · Vercel · Next.js 15
    Status: Live in production — actively used for GarunaCDX's own outreach
    Outcome: Personalised cold email sequences running autonomously across Indian and international markets


    Why We Built This for Ourselves First

    At GarunaCDX, we don't sell things we haven't shipped. Before we offer B2B outreach automation to clients, we built it, ran it, broke it, fixed it, and ran it again — for our own agency.

    This matters for two reasons. First, it means we understand the failure modes intimately. Second, it means we can show you the actual system, the actual stack, and the actual results — not a theoretical proposal.

    This case study documents the system we built to run GarunaCDX's outbound motion across Indian manufacturing, real estate, and hospitality SMEs, and international markets in the US, UK, UAE, and Australia.

    ℹ️Did you know?

    The average B2B cold email open rate across industries is 23–28%. Personalised cold emails — where the first line references something specific about the recipient's company — achieve open rates of 40–60% and reply rates 3–5x higher than generic templates. The problem is that writing truly personalised emails at scale is impossible for a human. That is exactly the problem this system solves.


    The Problem We Were Solving

    GarunaCDX needed to run outbound consistently. Not in bursts when someone had time, but continuously, intelligently, and at volume.

    The challenge with B2B cold outreach at an agency level:

    • Volume without personalisation gets ignored. Spray-and-pray blasts burn your domain reputation and get zero replies.
    • Personalisation without volume doesn't scale. Writing individual emails is too slow to sustain a pipeline.
    • Follow-up is where deals are won — and nobody does it. 80% of deals require 5+ touchpoints. Most agencies give up after one or two.
    • Tracking is manual. Without automated reply detection, you don't know who responded, who bounced, and who needs a follow-up.

    The system we built solves all four.

    ⚠️Watch out

    Sending cold email at volume from your primary domain without proper warm-up, SPF/DKIM/DMARC configuration, and controlled send rates will get your domain blacklisted within weeks. Domain reputation damage can take months to recover. Always use a subdomain or a dedicated sending domain, warm it up over 2–3 weeks, and cap daily sends at 50–100 until the domain has history.


    System Architecture

    The system has five layers:

    Layer 1 — Prospect List Ingestion

    Prospect lists are sourced from:

    • Apollo.io filtered exports (company size, industry, geography, tech stack)
    • LinkedIn Sales Navigator exports (role, seniority, connection degree)
    • Manual research for high-value targets
    • Website contact forms and inbound signals

    All prospects are normalised into a standard schema and inserted into the PostgreSQL database via Prisma:

    Prospect {
      id
      firstName
      lastName
      email
      companyName
      companyWebsite
      industry
      companySize
      country
      linkedInUrl
      status         // "pending" | "queued" | "sent" | "replied" | "bounced" | "unsubscribed"
      sequence       // which email sequence they're enrolled in
      sequenceStep   // which step they're currently on
      createdAt
      lastContactedAt
    }
    

    Layer 2 — Enrichment

    Before any email is written, the system enriches each prospect with live context:

    • Apollo.io API — company headcount, revenue estimate, tech stack, recent news
    • LinkedIn scraper — contact's current role, tenure, recent posts or activity
    • Company website scraper — homepage headline, about section, recent blog posts

    This enrichment data is stored alongside the prospect record and passed to the personalisation engine as context.

    💡Pro tip

    The single most effective personalisation signal in a cold email is a reference to something the recipient's company recently did — a product launch, a funding round, a new hire announcement, or a recent LinkedIn post. It takes 30 seconds for a human to find this. The enrichment layer finds it automatically for every prospect in your list before a single email is written.


    Layer 3 — Claude Personalisation Engine

    This is the core of the system. For each prospect, we pass to Claude:

    • Prospect name, role, company, industry, size
    • Enrichment data (tech stack, recent activity, company description)
    • GarunaCDX's service offering for that industry vertical
    • The sequence type (cold intro, follow-up 1, follow-up 2, break-up email)
    • A structured prompt that enforces email length, tone, and format rules

    Claude generates a unique email for every prospect at every sequence step. The output is validated against a character limit, checked for placeholder artefacts (e.g., "[INSERT NAME]" left in), and logged.

    Prompt design principles we enforce:

    • First line must reference something specific to the company or contact — never generic
    • No buzzwords: "synergy," "cutting-edge," "leverage" are all filtered outputs
    • Maximum 150 words for cold intro emails — shorter emails get higher reply rates
    • Clear single CTA: one ask per email, no multiple options
    • Tone varies by segment: formal for enterprise/manufacturing, conversational for startups and agencies

    Layer 4 — Sequence Manager + Brevo SMTP

    Each prospect moves through a multi-step email sequence. The standard sequence GarunaCDX runs:

    StepEmail TypeSend DelayFocus
    1Cold introDay 0Problem + credibility signal
    2Follow-up 1Day 3Reframe value, add social proof
    3Follow-up 2Day 7Short check-in, lower ask
    4Break-up emailDay 14Permission-based close

    The sequence manager runs on a Vercel cron job that fires every hour. On each run, it:

    1. Queries for prospects whose lastContactedAt + delay ≤ now and status = "queued"
    2. Fetches their enrichment data
    3. Calls Claude to generate the step-appropriate email
    4. Sends via Brevo SMTP with the prospect's email as the recipient
    5. Updates the prospect's sequenceStep, lastContactedAt, and status in the database
    6. Logs the sent email to the EmailLog table for full auditability

    Brevo configuration:

    • Dedicated sending subdomain (e.g., outreach.garunacdx.com)
    • SPF, DKIM, and DMARC records fully configured
    • Daily send cap of 100 emails during warm-up, scaling to 300+ after 3 weeks
    • Bounce handling: auto-status update to "bounced" via webhook

    Layer 5 — Reply Detection + CRM Webhook

    This is the part most outreach systems skip — and it is where deals are won or lost.

    When a prospect replies:

    1. Brevo's inbound email webhook fires to our Next.js API route (/api/webhooks/inbound-reply)
    2. The webhook handler identifies the prospect by email address and updates their status to "replied"
    3. Claude analyses the reply — is it positive, negative, a referral to someone else, an out-of-office, or a request to unsubscribe?
    4. If positive: a Slack notification fires to the GarunaCDX team with the full reply context and a suggested response draft
    5. If unsubscribe: prospect is immediately moved to "unsubscribed" status — no further emails sent
    6. If out-of-office: sequence is paused and rescheduled for the return date extracted from the OOO message
    7. All replies are logged to the CRM with Claude's sentiment classification and suggested next action

    🖼️ Visual: Slack notification mockup — showing the inbound reply alert with prospect name, company, reply snippet, Claude's sentiment tag ("Positive — expressed interest in custom CRM"), and a "Draft Response" button.

    💡Pro tip

    Out-of-office handling is a small detail that compounds into real results over time. Most outreach tools either ignore OOO replies or re-send the next sequence step to someone who's on holiday. Detecting the return date from the OOO message and rescheduling the follow-up for that date takes a few lines of Claude logic — and it is the kind of thoughtfulness that gets replies when the person returns.


    Prospect Segments We've Run This Against

    GarunaCDX has used this system to run outreach across:

    Indian markets:

    • Manufacturing SMEs (auto components, textiles, packaging) — pitch: ERP and ops automation
    • Real estate developers (residential, commercial) — pitch: CRM + lead management platform
    • Hospitality (hotel chains, restaurant groups) — pitch: booking integration and ops dashboards
    • Schools and education institutes — pitch: school management systems

    International markets:

    • US: SaaS companies 20–100 employees — pitch: AI agent development and workflow automation
    • UK: Professional services firms — pitch: custom internal tools and CRM
    • UAE: Real estate and retail — pitch: web + CRM build
    • Australia: SMEs needing offshore technical partners — pitch: white-label dev capacity

    Results from Our Own Usage

    ⚠️Watch out

    Outreach results vary significantly by industry, list quality, and sequence design. The numbers below reflect GarunaCDX's own campaigns run between December 2025 and mid-2026. We share them because transparency builds trust — not as guaranteed benchmarks.

    MetricResult
    Average open rate (personalised sequences)41–58%
    Average reply rate8–14%
    Positive reply rate (interested or referred)3–6%
    Sequences running simultaneouslyUp to 4
    Prospects enrolled per week50–150
    Human time per week on outreach~2 hours (reply handling only)

    What This System Costs to Run

    ComponentMonthly Cost
    Claude API (personalisation)~$40–80
    Brevo (transactional email)$0–25 (free tier covers most volume)
    Vercel (cron + API routes)~$20
    Apollo.io (enrichment)Depends on plan — basic credits ~$49
    PostgreSQL (Supabase)$0–25
    Total~$110–200/month

    A system that runs your outreach, writes every email, detects every reply, and keeps your pipeline moving — for under $200/month.

    Key takeaways

    1. 01Personalisation at scale is only possible with AI — the system writes a unique email for every prospect at every sequence step
    2. 02Reply detection and OOO handling are where most outreach systems fail — ours handles both automatically
    3. 03Total running cost under $200/month for a system that runs the entire outbound motion

    Yes. The core architecture — prospect ingestion, enrichment, Claude personalisation, Brevo delivery, reply detection — is replicable across any B2B business that does outbound. The customisation is in the ICP definition, sequence design, and industry-specific prompt tuning. Typical build time: 4–6 weeks.


    About GarunaCDX

    GarunaCDX Software Solutions LLP builds AI automation systems, B2B outreach engines, custom software, and web products. We are based in Panvel, Navi Mumbai, and work with clients across India, the US, the UK, Australia, and the UAE.

    Work with us: garunacdx.com


    This case study documents GarunaCDX's own internal outreach system. All metrics are from live production usage. The system is available as a custom build for clients — contact us for scoping.


    Share

    Run a Automation business with similar operational pain?

    Tell us your bottleneck — we’ll scope yours in a free 30-minute call.

    Free consultation · Reply within 24 hours · No credit card

    Stay Updated

    Stay ahead of the curve. Join our newsletter.

    Subscribe to our newsletter

    Get the latest insights on AI, digital growth and business automation.

    No spam. Unsubscribe anytime.