VC Fundraising Pipeline Intelligence

MESA Cohort C4 · AI and its Applications · Final examination · Nawaz Alam. Built and deployed on Vercel with Gemini Flash, Neon Postgres and live public data.

1 · Automation brief

😣 Pain

Vikram tracks 50 VCs in a spreadsheet. It records who and when he last spoke, but not who is worth contacting now. Finding out means googling 50 people twice a week. So he chases on gut feel, spends energy on quiet VCs and misses the moment an active one would have replied.

👤 User

Vikram, first-time founder of a seed-stage B2B logistics SaaS, two months into the raise. Works his pipeline twice a week. Not technical; lives in his table.

🎯 Outcome

On Monday and Thursday morning his table is already up to date: who to contact this week, the observable signal from the last 30 days behind each pick (with a link), who is quiet, and what to do. His own notes stay untouched.

Journey today → with VC Pulse

Today (manual)With VC Pulse
Open spreadsheet, google each VC, skim LinkedIn/news (~2-3 h, often skipped)07:00 IST Mon/Thu: cron refreshes all 50 VCs from 5 live sources (~2 min, unattended)
Judge relevance by gut; easy to miss a logistics deal or a podcastGemini Flash reads every item: is it really this VC, what did they do, how close to logistics?
Copy findings into notes by hand, sometimes overwriting old contextOnly 4 signal columns are written; his notes are protected by the database itself
Write a generic "just following up" emailEvidence-backed hook + one-click Gemini draft (he edits and sends it himself)

2 · The Nine Checks: does this deserve to be built?

Nine checks
01
Kill switch

Problem real

Timing decides whether a cold or follow-up email gets read. 50 VCs × 5 places to look × twice a week = 500 lookups a week. No founder does that consistently, so outreach falls back to gut feel.

PASS
02
Kill switch

Workflow repeated

Every Monday and Thursday for the whole raise (typically 3-6 months): around 50 repetitions of the same research loop.

PASS
03
Kill switch

Input available

Yes, from public, official feeds: Google News RSS, the VCs' own blog/Substack RSS, Apple's Podcasts search API, and Gemini's Google Search tool when the API plan allows it. LinkedIn/X are deliberately not scraped (terms of service, account bans).

PASS
04
Sizing

Output valuable

A ranked "this week" board (reach out / warm / wait / park), a one-line action per VC, the evidence links, and an email draft that cites the signal.

PASS
05
Sizing

Impact measurable

Research time per session (≈2-3 h → ≈3 min of review); share of outreach that has a concrete hook (target 100% of "reach out" picks); reply rate of signal-timed emails versus generic follow-ups (tracked from his contact history).

PASS
06
Boundary

Failure risk OK

Risks: wrong person with the same name, stale news, AI invention. Controls: every signal carries a source link and the source's own date; Gemini may only classify items it is given (never invent); items it rejects stay visible; a failed AI call keeps the previous verdict rather than wrongly marking someone "quiet". The worst case is one email sent at a slightly worse moment, which is cheap and recoverable.

PASS
07
Boundary

Judgment protected

The system recommends; Vikram decides and sends. It never emails a VC and never edits his contact history or notes. That is enforced by Postgres column permissions, not just by good intentions.

PASS
08
Sizing

ROI worth it

Measured AI cost ≈ $0.10 (≈ ₹9) per run via the course OpenRouter key (Gemini 3.5 Flash-Lite, the cheapest model that also scored best), about ₹75 a month at twice a week; feeds, Vercel and Neon are free. It saves ~4-5 founder-hours a week in the busiest months of a company.

PASS
09
Boundary

Owner clear

Vikram owns the relationships and his columns. VC Pulse (the pulse_engine login) owns exactly 4 signal columns. The builder owns the sources, the prompt and the scoring rules (all in the public repo).

PASS

3 · The Cut: what we deliberately do not automate

Sending the email. Fundraising is a relationship business; one tone-deaf automated email to a partner can cost a relationship. VC Pulse drafts, Vikram sends.

Writing to his contact history or notes. The brief says they must remain untouched, so the engine's database login has no permission to write them at all.

Scraping LinkedIn / X. It would add signal, but it breaks their terms and risks bans. We use official public feeds instead and say so openly.

Deciding the score with AI. Gemini classifies evidence; plain code does the arithmetic. Same evidence → same score, every time, and it can be explained line by line.

4 · Components map

VC Pulse components map: actors (Founder, Scheduler, System, Live data, Gemini, Database) across Trigger, Input, Context, Processing, AI, Output

5 · How Vikram's notes are protected (the critical requirement)

Four layers, each enough on its own:

  1. Database permissions. The engine logs in as pulse_engine, which Postgres allows to UPDATE only last_signal_date, signal_summary, follow_up_score, recommended_action. Any attempt to write notes fails with permission denied. Try it live on the Notes guard tab.
  2. Separation of duties. The edit screen logs in as pulse_founder, which can write only Vikram's columns, so it can't fake a score either. The all-powerful owner login is not even stored on the server.
  3. Targeted updates. The engine never does "read the whole row, change it, write the whole row back" (the classic bug that wipes a note Vikram typed mid-run). It runs one UPDATE … SET the four columns WHERE id = ….
  4. Proof on every run. An MD5 fingerprint of all of Vikram's columns is taken before and after each run and stored in the run log; matching fingerprints prove nothing of his changed.

Supabase vs Neon: the brief says "Supabase table". Supabase and Neon are both hosted Postgres; our schema (db/schema.sql) and permissions (db/roles.sql) are plain Postgres and run unchanged on Supabase. Neon was used because the free Supabase project slots on this account are in use by earlier portfolio apps. Switching means pointing the two connection strings at Supabase; no code changes.

6 · Live data: where signals come from

SourceFindsWhy this one
Google News RSS: "Name" when:30dinterviews, quotes, op-eds, event coverageOfficial public feed; no key; India/US editions by region
Google News RSS: "Firm" (logistics OR "supply chain" OR freight…)the firm's deals in Vikram's spaceCatches "new portfolio investment in a logistics company"
VC blog / Substack RSSthings they wroteAuthoritative: their own words, their own dates
Apple Podcasts Search APIpodcast episodes they appeared onPublic API; "said in an interview"
Gemini + Google Search groundingtalks, panels, demo daysSwitches on automatically when the Gemini API plan allows it (the free tier doesn't). Only links Google actually returned are kept

Every item keeps its URL and the source's own publish date. Anything older than 30 days is dropped before the AI sees it.

7 · Scoring (explainable by design)

A past investment in the same space is not, by itself, a reason to invest again. If the company is a direct competitor, the investor is usually less likely to back Vikram's startup; if it is adjacent, it shows conviction but proves nothing about a new slot. So each signal is weighted by what it means for Vikram's startup:

Meaning (Gemini labels, code checks)WeightWhy
🎯 Thesis: they say/write they want logistics or supply-chain software42An open invitation; the clearest sign they want more deals like Vikram's startup (general SaaS writing doesn't count)
🚀 Deploying: new early-stage cheques right now (new fund, bigger seed cheques, new cohort)34Allocation is open at the startup's stage
🤝 Complement: backed an adjacent, non-competing company26Conviction + a partnership/warm-intro angle, nothing more
👀 Visible: publicly active on other topics10Reachable this week
⚠️ Overlap: backed a direct competitor0, and −15Usually a no: VCs rarely fund a portfolio company's rival

Signal points = meaning weight × topic fit × who acted (the partner 1.0 · their firm 0.85) × freshness (100% for 7 days, fading to 40% at day 30). Signal strength = best + 40% of 2nd + 20% of 3rd, capped at 70. Fit (who is likely to meet an Indian seed company?): thesis +3 / +8 / +15 · India-based +10 · not India-based with no sign of India investing −5 · US-only/other-market mandate −15 · seed/early confirmed +5 · later-stage only −8 (geography/stage flags come from Gemini, so its caveats change the score, not just the text). Timing (from Vikram's own columns, read-only): followed up <7 days ago −30 (don't pester), 7-13 days −10, waiting 14+ days with a fresh signal +10 (perfect nudge), not contacted yet with a fresh signal +10.
Actions: followed up <14 days ago → WAIT (hook saved for later) · score ≥ 55 → REACH OUT / NUDGE · 35-54 → WARM · weak/off-topic activity → LOW · no signal → PARK, worded by relationship ("waiting 60 days and quiet: one light check-in next month, or move on") and by how long they've been quiet (a 1-year lookback of news naming them with their firm separates "quiet this month" from "quiet for 3+ months"). Open any investor to see their maths.

7b · How accurate is the AI? (measured, not claimed)

57 real items from the live pipeline were labelled by hand (is this really about that investor or their firm? is it about logistics?), then run through Gemini + our code checks (tests/eval_judge.py, labels in data/eval_gold.json).

QuestionPrecisionRecallAccuracy
Is it really them / their firm?100% (no false claims)85-89% (varies by run)93-95%
Is it about logistics? (on correct items)100%100%

Measured on the fallback model (Gemini 3.5 Flash-Lite, before the gateway switch), i.e. the worst case. The design deliberately trades a little recall for precision: a missed signal costs Vikram little; a wrong one could embarrass him in front of an investor. The misses are headlines that don't name the investor, which our "evidence must name them" rule rejects on purpose.

7c · Reliability and security

8 · Assumptions & red flags (stated, not hidden)

9 · Viva Q&A

Where exactly does AI add value? Couldn't this be keyword matching?

Keywords can't tell "Rajan Anandan co-wrote a book" (him acting) from "a company Peak XV once backed raised money from someone else" (not him), or a consumer-TV deal from a freight deal. Gemini reads each headline and classifies actor, act and topic fit, then writes a specific hook. The arithmetic stays in code so it is auditable.

How do you stop the AI from hallucinating signals?

Gemini never searches or invents in the main path. It only labels items we fetched, each with a real URL and the source's date. The JSON schema forces structured output, temperature is 0.1, and anything it rejects is still shown. Code also double-checks it: a "3/3 logistics" rating is lowered to 2 unless the source text itself contains a logistics word. For Google Search grounding, we keep only links whose domain Google actually returned.

Prove the notes can't be overwritten.

Open the Notes guard tab and press "Attack my own database": the engine login tries to overwrite a note and Postgres answers "permission denied for table vcs". Column privileges are read live from information_schema. Every run also stores before/after fingerprints of his columns.

Why twice a week, and how is it scheduled?

Vikram works his pipeline twice a week (from the brief). Vercel Cron calls /api/cron at 01:30 UTC (07:00 IST) on Mondays and Thursdays, protected by a secret. It processes all 50 investors in parallel in about two minutes.

What would you build next to make it a product?

Multi-founder accounts (row-level security per founder), Gmail integration to log replies into contact history automatically (with consent), signal alerts in Slack/Telegram, a reply-rate dashboard to tune the weights from real outcomes, and paid Gemini search grounding for event coverage.

What does it cost?

About $0.10 (≈ ₹9) of Gemini per run via the course OpenRouter key, logged per run; the news, blog and podcast sources are free public feeds.

10 · Downloads

⬇ Components Map (PNG) ⬇ Nine Checks (PNG) ⬇ Viva guide: simple version (PDF) ⬇ Full study guide (PDF) ⬇ Demo video (MP4) GitHub repository