Automated prospecting platform
Internal tool that orchestrates outbound prospecting (multi-channel sequences, lead scoring, contextualized replies) using CRM and scraping data.
At a glance
Context
The need came from our own commercial operation. Prospecting quality was diluted by lack of industrialization, and market tools were either too generic (flat templates) or too costly to integrate for internal use.
The need
Industrialize prospecting without degrading contact quality. Market SaaS tools (Lemlist, Apollo, Instantly) handle sequences but don't really tie scoring, client context and CRM history together. We needed a system that consumes our own signals.
The built response
Platform that orchestrates sequences from the CRM, generates messages tuned to each lead's context via LLM, triggers automatic actions based on replies, and proposes meetings directly inside the conversation.
What this project shows in practice
Proves that the internal building blocks (CRM, scraping, AI agent) can form a coherent system that reduces human time to final qualification only — not the whole chain.
Key features
Interconnections
What this changes
What was hard, what we settled
Technical stakes
- Generate replies that don't feel bot-like — deep context, on-brand voice, conversational fluidity
- Orchestrate multiple channels without sending 3 identical messages to the same lead 5 minutes apart
- Score in near-real-time without flooding the CRM with updates
- Strict compliance: CAN-SPAM, GDPR, opt-out handling, consolidated blocklist
- Detect when the agent must hand off to a human (buying signal, complex objection, frustration)
Stack choices
- Next.js + TypeScript (full-stack)
Consistent with the CRM and scraping, unified deployment, shared types between client and server.
- Postgres + Redis
Postgres for conversations, leads and logs (clean relations). Redis for locks and short caches (anti double-send).
- BullMQ for sequences
Delayed queues, exponential retry, time-zone aware sending windows. Essential for multi-channel orchestration over time.
- LLM API (with specific prompts)
For reply generation. We keep business logic (who to contact, when, on which channel) in deterministic code; the LLM only handles language.
- Webhooks back to the CRM
Every agent action (reply sent, meeting booked, prospect blocklisted) flows into the CRM in real time. No separate screen, no double entry.
Difficulties faced
The auto / human balance
Too much auto and the prospect feels it. Too much human and industrialization collapses. We defined clear criteria (keywords, sentiment, stage) that trigger an automatic handover to the rep.
Holding the brand voice
Standard LLMs sound generic. We combine detailed prompts, few-shot examples from real past conversations, and the option to manually override per template.
Detecting bounces and blocks
SMTP, LinkedIn API, email providers — each has its own failure signals. We normalize everything into a unified status and adapt the sequence accordingly (pause, retry, kill).
Unstable scoring at the start
Early on, the scoring model has no data. We started with simple business rules, then progressively recalibrated with a model that learns from real conversions.
What we learned
- AI helps but doesn't replace input data quality. Bad lead, bad context = bad message, no matter the model.
- Logging and traceability from day one. Without it, impossible to debug behaviors or explain a drift to a sales rep.
- Strict limits (volumes, frequencies, forbidden keywords) > trust in the agent. Better a cautious system than a reputation hit.
- Test on your own prospects before offering as a product. We dogfood internally, learn, then industrialize.