All articles
Case Study11 min read2025-04-22

How We Built Salesvora: A WhatsApp-First CRM with Automated Follow-Ups

Most CRMs are built for sales teams who live in dashboards. Salesvora was built for businesses whose customers live in WhatsApp. Here's the full architecture, the decisions we made, and why we threw out our first design.

How We Built Salesvora: A WhatsApp-First CRM with Automated Follow-Ups

The idea for Salesvora came from a pattern we kept seeing. A small business owner — a clinic, a real estate agent, a tutoring center — manages their entire customer relationship over WhatsApp. Leads come in via WhatsApp. Quotes get sent on WhatsApp. Follow-ups happen on WhatsApp. But their CRM sits empty because entering data into a dashboard after every conversation is something nobody actually does. We wanted to build a CRM that lives where the business already lives.

The Core Design Decision: WhatsApp as the Interface

Most CRMs treat WhatsApp as one of many integrations — a tab you can look at. We inverted this. In Salesvora, WhatsApp IS the primary interface. When a lead messages the business number, it flows into Salesvora's pipeline automatically. The business owner responds from within Salesvora (which delivers the message over WhatsApp), or lets the AI handle the response entirely. The pipeline updates itself based on conversation content — no manual data entry.

The best CRM is the one that gets used. If using it requires a context switch, it won't get used.

The Tech Stack

  • WhatsApp Business API (via Meta's Cloud API) for message send/receive
  • Next.js + Supabase as the core app — realtime subscriptions for live conversation updates
  • Supabase pgvector for contact memory and conversation embeddings
  • Claude claude-sonnet-4-6 for AI response generation and lead stage classification
  • n8n for automation workflows — follow-up sequences, reminders, re-engagement
  • Resend for email notifications when the owner is away from the dashboard

The Webhook Architecture

Meta's WhatsApp Cloud API pushes inbound messages to a webhook endpoint. Our first design had a single Next.js API route handling everything — receive message, classify intent, update pipeline stage, trigger automations, generate AI reply. This worked fine in development and fell apart in production on day two. A single slow LLM call (intent classification) was blocking acknowledgment back to Meta, which caused Meta to retry the webhook, which caused duplicate processing.

The fix was a proper queue. Incoming webhooks now do one thing: push the raw payload to a Supabase queue table and return 200 immediately. A separate worker process (a Next.js background function on Vercel) pulls from that queue, runs the classification and AI logic, and updates the database. Supabase realtime pushes the update to the dashboard UI. Decoupling the acknowledgment from the processing was obvious in hindsight but cost us a frustrating day.

AI Follow-Up Sequences: How They Actually Work

The follow-up system is the part that generates the most interest in demos. Here's the actual mechanic: when a lead goes quiet for a configurable period (default: 24 hours after their last message), n8n fires a trigger. That trigger calls a Salesvora API endpoint with the lead's conversation history and current pipeline stage. Claude generates a contextually appropriate follow-up message — not a template, but something that references the actual conversation. The owner can review it in one click and send, edit, or discard.

We deliberately kept a human in the loop for follow-ups rather than fully automating them. Two reasons: (1) a wrong automated follow-up to a sensitive lead does more damage than a delayed one, and (2) the one-click review flow is fast enough that it doesn't feel like a burden. Fully autonomous mode is available but off by default, requiring explicit opt-in per contact.

Lead Stage Classification Without Fine-Tuning

Automatically moving a lead through pipeline stages (New → Contacted → Qualified → Proposal Sent → Closed) based on conversation content sounds like it needs a fine-tuned model. It doesn't — or at least not for most businesses. We use a structured prompt that gives Claude the pipeline stage definitions, the last 10 messages, and asks it to return a JSON object with the current stage and confidence score. When confidence is below 0.7, the stage doesn't update automatically — it flags for manual review instead. This approach required zero training data and works correctly on about 88% of conversations in our test set.

The Marketing Broadcast Layer

WhatsApp Marketing is the second product surface in Salesvora. Businesses can send templated broadcast messages to segments of their contact list — promotional offers, appointment reminders, re-engagement campaigns. WhatsApp has strict rules here: only pre-approved message templates can be used for outbound broadcasts, and contacts must have opted in. We built a template submission flow that handles the Meta approval process, a consent management layer that tracks opt-in source and date, and a campaign builder with delivery analytics.

Broadcast delivery uses Meta's batch message API with rate limiting built in — Meta throttles based on phone number quality rating, and hitting those limits silently kills your delivery rate. We built an exponential backoff system with per-campaign delivery logs so the business owner can see exactly which messages delivered, which were read, and which bounced.

What We Threw Out

Our first design included a mobile app. The reasoning was that business owners are on their phones — they should manage leads from a native app. We killed it after user interviews. The people we spoke to already had WhatsApp open all day. They didn't want another app to check; they wanted WhatsApp to become smarter. The web dashboard became the back-office tool (for setup, analytics, bulk actions) and WhatsApp became the front-office tool. That reframe made the whole product simpler.

  • Cut: native mobile app — replaced by WhatsApp-first flow
  • Cut: custom AI model training — Claude with structured prompts was sufficient
  • Cut: real-time typing indicators and read receipts (Meta API doesn't support this reliably)
  • Added late: conversation search with semantic embeddings — turned out to be highly requested

Where It Stands

Salesvora is live at salesvora.com. The architecture described here handles the current user base comfortably — Supabase's realtime layer has been the most stable piece of the stack, and the n8n automation layer gives non-technical users enough flexibility to build their own follow-up sequences without writing code. If you're building something in the WhatsApp + CRM space, or want to see how the follow-up AI behaves in practice, the demo walk-through is linked from the site.

Ready to build?

Let’s build your AI product together.

Tell us what you’re working on and we’ll get back within 24 hours.

Start a project