Inspiration
Marketing teams drown in data but starve for signal. A typical campaign touches a CRM, an email tool, an analytics dashboard, and three spreadsheets, none of which talk to each other. We kept watching great outreach fail not because the message was bad, but because it hit the wrong person at the wrong time. We wanted to collapse that entire stack into one question: who should we reach, and what should we say?
ReachIQ is our answer.
What it does?
ReachIQ is an intelligence layer that sits on top of your audience data and turns it into precision outreach:
- Lead scoring — ranks contacts on fit and intent using a blend of behavioral signals and LLM-derived context, not just static rules.
- Semantic segmentation — clusters your audience by meaning (needs, pain points, buying stage) using vector embeddings instead of brittle tag filters.
- Auto-personalization — generates on-brand, per-recipient copy grounded in each lead's profile, with guardrails so the tone never drifts.
- Real-time intent — surfaces the accounts heating up right now so teams act on a window instead of a backlog.
How we built it
The system is split into a fast API surface and an asynchronous intelligence pipeline.
- Frontend: Next.js + React + TypeScript with Tailwind for the dashboard, server components for fast first paint, and streaming responses for the copy generator.
- Backend: FastAPI exposes the scoring and generation endpoints. Heavy work (embedding, enrichment, batch scoring) is pushed to Celery workers so the API stays responsive under load.
- Data + retrieval: PostgreSQL holds structured lead and campaign data; Pinecone stores embeddings for semantic search and lookalike matching; Redis caches hot scores and rate-limits outbound calls.
- Intelligence: We orchestrate LLM calls through LangChain, using the Claude API for reasoning-heavy tasks (intent classification, copy generation) and lighter models for high-volume enrichment. A scikit-learn model handles the deterministic fit-scoring so we're not paying LLM latency on every row.
- Infra: Containerized with Docker, deployed on AWS with the frontend on Vercel.
Challenges we ran into
- Latency vs. quality: Personalizing thousands of messages with an LLM is slow and expensive. We solved it with a two-tier approach — cheap models and cached embeddings for the bulk, premium reasoning only where it moves the needle — and batched everything through a queue.
- Grounding the copy: Early generations hallucinated details about leads. We fixed this with retrieval-augmented prompts that only feed the model verified profile fields, plus a validation pass that flags unsupported claims.
- Segment drift: Raw embeddings clustered on surface language, not intent. Tuning the embedding inputs and re-ranking with lightweight heuristics gave us segments a marketer would actually recognize.
What we learned?
- The winning architecture wasn't "more AI" — it was knowing exactly where AI earned its cost and letting cheaper deterministic logic carry the rest.
- Retrieval is the difference between a demo and a product. Grounded generation is what makes the output trustworthy enough to send.
- Marketing and engineering share the same north star here: relevance. Every technical decision traced back to whether it made outreach feel more human.
What's next for ReachIQ?
- Native CRM and email-platform integrations (HubSpot, Salesforce, Gmail) for one-click activation.
- A feedback loop that learns from replies and conversions to continuously sharpen scoring.
- Multi-channel reach beyond email: LinkedIn and SMS from the same intelligence core.
- A/B testing baked into generation so the model optimizes copy against real outcomes.
Built With
- amazon-web-services
- anthropic
- api
- celery
- claude
- docker
- fastapi
- langchain
- next.js
- openai
- pandas
- pinecone
- postgresql
- python
- react
- redis
- scikit-learn
- tailwindcss
- typescript
- vercel
Log in or sign up for Devpost to join the conversation.