Vantage 🎯

Hackathon: H0: The Hackathon Zero

Live Demo: tryvantage.vercel.app


Inspiration

SDRs and AEs walk into 8 cold calls a day with whatever they could glance at during the 2 minutes between dials. The result: the rep hops on with a marketing-VP at a fintech who just announced a Series C three days ago and starts pitching them on "growing your team" — the exact angle the market just funded. The miss is excruciating to listen to on the playback. The cause isn't laziness, it's that the prep step is unbounded and the calendar isn't.

Existing "sales intelligence" tools solve the wrong half of this problem. ZoomInfo and Apollo give you contact data — emails, job titles, org charts. Useful, but not the thing you need before the call. What you need is: what changed at this account in the last 72 hours? Did they raise? Did they hire? Did the CEO post something on LinkedIn about pricing? Did a competitor ship the thing they were waiting for? That's "company news" research — and every rep does it manually, badly, in the two minutes before the dial.

The bet: Claude is now reliable enough at structured extraction that the overnight crawl-and-synthesize step doesn't need a human. You shouldn't have to open 12 Crunchbase tabs at 7:55 AM. Vantage flips the ratio — the rep gets the 1-pager in their inbox at 6 AM, and the 2-minute prep becomes a 30-second read.


What It Does

Connect Vantage to your Salesforce or HubSpot pipeline once. Every night while you sleep, Claude crawls every active-opportunity account, classifies what changed, and drops a structured 1-pager on each one before your 9 AM block.

  • Pipeline sync — read-only OAuth into Salesforce or HubSpot, pulls every Account in your active opportunities into the Vantage workspace
  • Overnight signal collection — for each account, crawls public surfaces (company blog, press, jobs page, podcast appearances, social, news mentions) and persists each delta as a typed signal in vantage_signals
  • AI classification — Claude tags every signal as launch / hire / funding / narrative / noise and ranks accounts by call-priority based on signal density + recency + your pipeline stage
  • Daily brief per account — a one-page synthesis: what changed, what to mention on the call, what to avoid mentioning, tone notes based on prior touches, and 3 suggested opening lines tuned to the account's current narrative
  • Morning email + dashboard — 6 AM digest hits the rep's inbox with the call list ranked by priority, each row linked to the full brief
  • Stripe subscriptions — $30/seat/mo Solo or $50/seat/mo Team, managed through Stripe Billing

Beyond the single account brief, Vantage gives you:

  • A signals timeline per account showing every delta crawled, classified, and dated — so the rep can see the narrative arc the account is on, not just today's snapshot
  • Tone notes per call — based on prior touches + the account's posture, Vantage tells you whether to lead with curiosity, urgency, or social proof
  • Call-priority ranking — accounts with recent funding + recent hiring + product-launch chatter float to the top; accounts that have gone quiet drop down
  • Per-rep voice tuning — your brand voice + your historical winning lines get fed back into Claude so the suggested opening lines match how you sell, not generic SDR speak
  • CRM-agnostic — same dashboard for Salesforce-shop teams and HubSpot-shop teams; the integration layer abstracts both

The promise: the 8-call cold-call day starts at 9 AM with 8 briefs already written, not 8 panicked browser-tab opens at 8:58.


How I Built It

Architecture

Salesforce / HubSpot (read-only OAuth)
    │
    ▼
/api/integrations/oauth/[provider]/start + /callback
    │  per-tenant access_token + refresh_token in vantage_integrations
    ▼
Overnight crawler (Vercel Cron at 03:00 UTC)
    │  per-account web scrape + RSS poll + news API
    ▼
Claude Sonnet 4.6 (per signal + per account)
    - signal classifier: launch / hire / funding / narrative / noise
    - brief synthesizer: emits BRIEF_JSON ranked by call priority
    │
    ▼
Amazon Aurora Postgres (shared cluster, multi-app)
    ├── vantage_accounts       — synced pipeline accounts
    ├── vantage_signals        — raw + classified deltas per account
    ├── vantage_briefs         — daily 1-pagers, JSONB structured
    ├── vantage_integrations   — OAuth tokens per tenant per provider
    └── vantage_settings       — per-user tone + priority weights
    │
    ▼
Resend → 6 AM morning email + Slack-pasteable summary + dashboard

The architectural bet is per-tenant overnight scheduling at low cost. Every customer's pipeline is different, so a one-size-fits-all batch job would be either too narrow (some accounts always crawled, others ignored) or too expensive (every account crawled every night for every customer). The solution is a per-tenant cron job that loads the customer's active opportunities, dedupes overlapping accounts across customers in the same cluster, and crawls each unique account once per night — then fans the results back to each customer's brief queue. The result: at 1,000 customers all targeting overlapping mid-market SaaS accounts, the crawl cost is roughly the same as it would be for 100 customers because the dedup eats the redundancy.

The OAuth flow is multi-tenant from day 0. The Vantage HubSpot Public App and Salesforce Connected App are both registered at the provider level — when a customer clicks "Connect", they authorize their own org, the tokens land in vantage_integrations.config keyed by (user_id, provider), and every downstream sync uses getFreshAccessToken() which auto-refreshes 60 seconds before expiry. No customer ever pastes a credential.

Tech Stack

Layer Technology
AI Model Anthropic Claude Sonnet 4.6
CRM Integrations Salesforce Connected App OAuth, HubSpot Public App OAuth
Database Amazon Aurora Postgres (vantage_* tables)
Backend Next.js 16 API Routes + Vercel Cron
Auth Supabase Auth + Google OAuth
Payments Stripe (subscriptions + webhooks)
Email Resend (templata.org)
Frontend Next.js 16, React 19, Tailwind CSS, shadcn/ui
Deployment Vercel (Fluid Compute, us-east-1)

Challenges

  • Multi-tenant OAuth, two CRM ecosystems — Salesforce and HubSpot have different OAuth flows (Salesforce returns an instance_url that's the customer-specific API base; HubSpot uses a single base + scope strings), different scope strings, and different token-refresh quirks. The fix was a per-provider config map in src/lib/oauth/providers.ts with provider-specific scope joining and a unified getFreshAccessToken() that handles both refresh shapes. One auth lib, two providers, zero per-flow forks downstream.
  • Crawl-cost math — naive overnight crawl would have been one HTTP request per account per source per customer per night. With 1,000 customers × 50 active accounts × 6 sources × 1 night = 300,000 fetches/night just to keep the lights on. The dedup layer cuts that by an order of magnitude by collapsing duplicate target accounts across customers (most B2B SaaS reps target the same 200 mid-market accounts as their peers).
  • "Noise" classification — the most important Claude tag is noise, because surfacing too many irrelevant signals makes the morning brief unreadable. Tuning the system prompt so that "VP of Marketing posted a thought-leadership LinkedIn carousel" lands as noise while "VP of Marketing started 3 weeks ago" lands as hire took two passes of prompt iteration and a per-account weighting layer.
  • Read-only forever — the temptation to write back to Salesforce / HubSpot (e.g. "auto-create a task to follow up") is real because every customer asks for it. We deliberately don't. Vantage is read-only on the CRM, period — the trust posture says "we read your pipeline, we don't touch it." This is a product decision baked into the scopes requested at OAuth time, not a runtime check that could drift.

What's Next

  • Battlecard generation — auto-build per-competitor battlecards from public sources + win/loss notes
  • Voice memo intake — record a 30-second voice note after the call, Vantage updates the account's "prior touches" memory automatically
  • Outbound queue — surface accounts that haven't been touched in 30+ days but show new signal activity
  • Slack integration — post the morning brief directly to the rep's Slack instead of email
  • Multi-rep account ownership — when an AE and an SDR both touch the same account, Vantage merges their brief context
  • Closed-lost playback — surface what changed at lost accounts 90 days post-loss; sometimes the deal comes back

Sample Pipeline Seeds

Vantage ships with a demo seed mode that populates the workspace with 12 sample target accounts (across mid-market SaaS, fintech, healthtech, and devtools) — each with a synthesized 30-day signal history and a generated daily brief. Judges can click "Load demo pipeline" from the empty-state dashboard and walk through the full read flow without authorizing a real Salesforce or HubSpot org. The OAuth flow itself is fully wired against the production HubSpot Public App and Salesforce Connected App for real-account connections.


Team

Built solo by @kyisaiah47 for the H0 Hackathon.

Built With

Share this project:

Updates