← All Projects/GTM Intelligence Platform

AI Product · Enterprise Signal & CRM Infrastructure

GTM Intelligence Platform

Signal-to-outreach system for Kinage: a Python pipeline ranks market signals, a Next.js layer turns them into enriched, ICP-classified contacts in HubSpot.

Status
Production
My role
AI Product · Enterprise Signal & CRM Infrastructure
Language
TypeScript
Year
2026
Category
ai, fullstack
Private repoOmodunjo11/enterprise-signal-platform
01The Problem

Kinage's analysts were manually trawling news sources every morning to spot market signals, and even when they found one, turning it into a named, qualified contact in the CRM was a separate manual job.

The product decision
I traced the analyst's whole morning before writing code. Finding the signal was only the first hour. Knowing who to contact and whether they fit was the rest of the day, so the architecture follows that sequence end to end.
Outcome

Replaced the analysts' daily manual news trawl with a ranked feed refreshed every two weeks, wired through to outreach-ready HubSpot contacts. ~$215K annual GTM stack cost reduction for Kinage.

02What I Built

A two-layer GTM intelligence system: a Python ingestion and scoring pipeline with a three-tier signal model, and a Next.js dashboard and outreach layer with author scoring, Clay enrichment, Claude ICP classification, and HubSpot sync.

03Overview

Kinage's analysts spent the first hour of every morning trawling news for signs that a family, advisor, or attorney might need help managing an aging adult's finances. I built the system that replaced that hour and carried the signal all the way to outreach. A Python pipeline ingests 88 RSS feeds plus Reddit, web, and LinkedIn sources, scores every chunk with domain-specific embeddings, and publishes a ranked feed on a two-week refresh. A Next.js layer curates that feed against Kinage's intake profile, scores authors, hands candidates to Clay for enrichment, classifies each contact's ICP role with Claude, and writes them into HubSpot ready for outreach.

04Key Objectives
  1. 1.
    Multi-Source Signal Ingestion: Ingest from 88 RSS feeds, subreddits, web sources, and LinkedIn, chunked and embedded into one corpus. Track 10 named competitors and a taxonomy that grows as the GTM team adds new buyer domains.
  2. 2.
    Tiered Signal Ranking: Classify every signal into three tiers: T1 for direct mentions of a portfolio company or named competitor, T2 for thematic shifts in adjacent markets, T3 for ambient context. Only T1 is alert-eligible.
  3. 3.
    Signal to Contact: Expose scored candidates to Clay, receive enriched contacts back via webhook, and classify each one into an ICP role (Daily Money Manager, Elder Law Attorney, Care Manager, Financial Advisor, Family Caregiver) before it lands in HubSpot.
  4. 4.
    Analyst Dashboard: A filterable feed by recency bucket, topic, and tier, with lenses for the questions the GTM team actually asks, such as cost of care and professional channels.
05Methodology
  • ◆
    Define the Signal Before Ingesting: Wrote the signal taxonomy and tier definitions first, so the feed reflects what an analyst would act on rather than what a scraper can reach.
  • ◆
    Weighted, Decaying Scores: Score = semantic relevance (60%) + recency (25%) + author credibility (15%), with a 14-day recency half-life so last month's story does not outrank this morning's.
  • ◆
    JSON Handoff Between Layers: The Python pipeline and the Next.js app talk through one ranked JSON file pushed to Vercel Blob. Either side can change without breaking the other, and a refresh is one script that scores, uploads, and redeploys.
  • ◆
    Spend and Access Guardrails: Clay enrichment sits behind a dry-run confirm so nobody burns credits by accident. Internal API routes require a shared secret, and the dashboard is gated to an allowlisted team.
06Surfacing a Signal Is Step One

A ranked news feed tells you something happened. It does not tell you who to call. The product question the GTM team kept asking was: who is the person behind this signal, and do they fit our buyer? So the system does not stop at ranking. Signals become Clay enrichment requests, enriched contacts come back with a classified ICP role, and HubSpot receives an outreach-ready record. The value is the chain, not any single layer.

07Two Repos, One Workflow

The signal pipeline started as a standalone Python project and was merged into the dashboard repo once the handoff stabilised. The outreach layer lives with the GTM team, who own HubSpot, Clay, and HeyReach, and never need to touch the pipeline. It refreshes every two weeks on its own.

← Previous
Kova
Next →
Regulatory Compliance Cockpit