Sales & distribution · 2025
Sales CRM and lead management for a pan-India national sales team
A national sales company with inside reps, field executives, and regional managers across India was drowning in leads from website forms, partner referrals, trade show lists, and WhatsApp inquiries — with no consistent scoring, assignment, or pipeline hygiene. Deals stalled because nobody knew the next action; managers learned about slippage at month-end, not mid-week. Web6 delivered a sales CRM in twelve weeks that centralizes multi-channel intake, applies transparent scoring rules, routes leads by territory, enforces activity discipline, and gives managers live pipeline visibility without spreadsheet archaeology.
Client information has been anonymized due to NDA.
- Industry
- Sales & distribution
- Business type
- National sales company (confidential)
- Duration
- 12 weeks
- Team size
- 4
- Location
- India — pan-national field and inside sales
- Services
- Custom CRM DevelopmentLead management automationWhatsApp integrationSales pipeline and reportingManager dashboards
Technology stack
- Laravel
- React
- NestJS
- PostgreSQL
- Redis
- Docker
- Cloudflare
- AWS
- Lead response time (median)
- −48%
- Stale pipeline deals (>14d no activity)
- −57%
- Rep CRM adoption (weekly active)
- 94%
Multi-channel lead intake flows through Laravel CRM core; NestJS handles WhatsApp webhooks.
Project overview
The client — a national sales organization we anonymize here as a confidential company — sells through a blended inside and field model covering dozens of cities. Marketing generates leads from digital campaigns; partners forward referrals by email; field reps meet prospects at events and scribble notes on phones; WhatsApp groups buzz with " hot lead " messages that never enter a system. Salesforce was evaluated and rejected as too expensive per seat and too rigid for their assignment logic; spreadsheets worked until they did not — which was every quarter-end.
Web6 from Surat engaged to build custom lead management software on a foundation the client could own: Laravel API core, React web app for managers and inside sales, optional NestJS integration service for WhatsApp and third-party webhooks, PostgreSQL for relational integrity, Redis for queues and real-time counters, Docker on AWS, and Cloudflare at the edge. Scope was deliberately sales-execution focused — pipeline, activities, assignments — not full ERP replacement. Orders still finalize in their existing backend; the CRM tracks opportunity state until handoff.
Twelve weeks split across discovery, core CRM build, integration sprint, and pilot rollout with twenty reps in three regions. Team size four: tech lead full-stack, dedicated Laravel engineer, React engineer, and QA/DevOps hybrid. Success meant faster first touch, fewer stale deals, manager trust in dashboard numbers, and rep adoption without nagging — not invented revenue multiples.
After sixty days live, median lead response time dropped nearly half; stale opportunities without logged activity for fourteen days fell fifty-seven percent; weekly active rep usage hit ninety-four percent. The sales director said the CRM " finally made Monday pipeline meetings about actions, not detective work. " Web6 did not publish revenue uplift — the client\'s finance team owns those figures internally.
Engagements like this are delivered through Web6 sales CRM development .
Business and sales operations challenges
Lead intake was multi-channel but uni-dimensional once inside the org — meaning everything eventually became a row in someone\'s sheet with inconsistent columns. Website leads emailed to a group inbox; inside sales claimed deals by shouting in Slack; field reps duplicated entries when they forgot they had already typed the phone number differently. Marketing could not answer which channel produced qualified conversations versus junk; attribution existed in slides, not data.
Assignment logic was politically sensitive. Territories mapped to states and sometimes cities; certain product lines required specialist reps; partner-sourced leads needed credit preserved for commission disputes. Generic round-robin CRMs ignored partner codes; manual assignment by regional managers did not scale on Monday mornings after weekend campaigns. The client needed rules-first routing with transparent override and audit.
Pipeline stages existed on a poster — Prospecting, Qualified, Proposal, Negotiation, Won, Lost — but reps interpreted them differently. A deal marked Proposal might mean " sent a PDF once " or " budget confirmed. " Forecast calls wasted hours reconciling definitions. Without activity discipline, stages became wishful thinking; managers discovered slippage only when invoices failed to materialize.
WhatsApp was the unofficial CRM. Reps preferred chatting prospects on personal numbers; when someone transferred territories, conversation history walked out the door. Leadership wanted WhatsApp Business API integration that logged templates and replies against lead records without forcing reps through clunky copy-paste — while respecting Meta policy and opt-in norms.
- Multi-channel intake without deduplication or scoring
- Territory and partner-aware assignment rules
- Inconsistent pipeline stage definitions
- Activity gaps causing stale opportunities
- WhatsApp conversations outside system of record
- Manager visibility lagging real pipeline health
Goals and success criteria
Product goals: unified lead record with source attribution; configurable scoring rules ( geography, product interest, company size band, engagement signals ); automated assignment with override; pipeline board with enforced stage definitions and required fields on transition; activity logging ( calls, meetings, WhatsApp, emails noted manually ); manager dashboards and rep daily task queues; duplicate merge workflow.
Integration goals: ingest website forms via API; NestJS microservice consuming WhatsApp Business webhooks and outbound template sends; nightly CSV import job for partner referrals with column mapping UI; optional ERP webhook on Won stage to create customer stub — read-only confirmation id returned to CRM.
Adoption goals mattered as much as features. Reps would not tolerate five clicks to log a call; managers would abandon dashboards if numbers disagreed with reality. We set UX targets: log activity in under fifteen seconds from mobile; pipeline drag with validation messages, not silent failures; WhatsApp messages appear on timeline within one minute of delivery webhook.
Success metrics excluded fabricated ROI. Client stakeholders wanted median lead response under two hours for assigned inside sales leads during business hours; stale deal rate down fifty percent within ninety days; ninety percent weekly active reps; manager NPS on reporting above eight. Revenue targets stayed internal — Web6 reported operational KPIs only.
Discovery and research
Discovery opened with pipeline archaeology — export of three months of spreadsheet rows, deduplicated manually in workshop to show pain. We mapped channel to close-rate informally; no revenue numbers published here, but patterns showed website product-A leads converted better when touched within sixty minutes. That insight drove scoring weight on recency and product line.
Shadowing inside sales for two days revealed actual tools: WhatsApp Web, Gmail, phone dialer without CTI integration. Reps toggled six windows; logging was " later " until never. Field ride-along in Ahmedabad and Pune ( anonymized ) showed intermittent 4G and preference for thumb-friendly mobile web. We cut desktop-only features from MVP.
Workshops with three regional managers produced assignment rule priority list: partner code match first, city within territory second, product specialist third, round-robin fallback. Commission politics required partner field immutable after create except by admin role — documented and tested heavily.
Technical spikes in week one validated Laravel tenancy-by-organization ( single client, multi-region teams ), Redis pub/sub for dashboard counter updates, NestJS WhatsApp webhook signature verification, and PostgreSQL exclusion constraints preventing duplicate open leads on same phone normalized to E.164.
System architecture
Architecture splits responsibilities: Laravel 11 monolith owns CRM domain — leads, accounts, contacts, opportunities, activities, scoring rules, assignments, users, roles — exposing JSON API to React SPA. NestJS integration service handles high-churn external webhooks ( WhatsApp, marketing automation callbacks ) and normalizes payloads onto Laravel queue via signed internal HTTP. This separation keeps core business rules in one codebase while isolating third-party SDK churn.
PostgreSQL schema uses leads table for pre-qualified intake and opportunities table after qualification promote action — preserving marketing analytics on raw leads while reps work opportunities on pipeline. Phone numbers stored normalized with unique partial indexes on open leads. Scoring rules stored as JSON logic evaluated on create and on enrichment update — rules editable by admin UI without deploys.
Assignment engine runs synchronously on lead create: evaluate partner code, territory polygon tables simplified to state/city lists at MVP, product tags, then assign owner user id and notify via email and in-app bell. Overrides log previous owner, new owner, reason text — commission disputes reference this audit.
Pipeline stages configured per pipeline type ( inside sales vs field ); stage transitions validate required fields — e.g., Proposal requires estimated value and proposal date; Lost requires loss reason enum. Invalid transitions return 422 with field errors consumed by React Hook Form.
- Laravel CRM core + React SPA
- NestJS integration layer for WhatsApp webhooks
- PostgreSQL with normalized phone deduplication
- Redis queues and dashboard cache
- Rule-based scoring and assignment engine
- Materialized views for manager reporting
Rep and manager experience
Rep home prioritizes " My day " — overdue activities, new assignments since yesterday, leads requiring first touch within SLA window highlighted in #6D5DF6 accent. One tap logs a call outcome with disposition enum; optional note voice-to-text on mobile browsers supporting speech API. Pipeline board Kanban supports drag with validation modal when required fields missing — better than silent revert.
Lead detail timeline reads like a story: created from website, scored 72, assigned to Priya, WhatsApp template sent, replied, moved to Qualified. Duplicate suggestion banner appears if phone matches existing open lead — rep can merge request to manager. Partner code displayed prominently so reps acknowledge source in first call script.
WhatsApp panel lists approved templates; sending creates activity row pending delivery webhook. Inbound replies attach automatically when phone matches — reps discouraged from parallel personal threads through policy not software lockout, but CRM path is easier than copy-paste.
Manager views: regional pipeline funnel, rep leaderboard by activities not vanity revenue, stale deal report sortable by days idle, assignment override queue. Export to CSV for finance still available but labeled snapshot timestamp to prevent arguing about stale exports.
Delivery process
Weeks 1–2: discovery, scoring workshop, wireframes, WhatsApp sandbox account. Weeks 3–5: lead intake, assignment engine, rep task UI. Weeks 6–8: pipeline stages, activities, manager dashboards. Weeks 9–10: NestJS WhatsApp service, website form API, imports. Weeks 11–12: pilot with twenty reps, training videos, production cutover.
Daily standups shortened after week six; demo every Friday to sales director. Pilot reps signed feedback in shared doc; P1 bug fix SLA twenty-four hours during pilot. Feature freeze at week ten except WhatsApp template tweaks.
Sprint planning followed a sales-calendar rhythm, not abstract agile ceremony. Week four aligned with a minor campaign launch so we could observe real lead volume on staging assignment rules; week eight coincided with month-end pipeline review so managers could compare CRM dashboard totals against their legacy spreadsheet one last time. That intentional overlap built trust — numbers matched within rounding before anyone asked reps to switch.
Data migration was lighter than ERP projects but still structured. Three months of anonymized spreadsheet rows imported into staging with column mapping workshops; partner referral CSV formats from two major channels became saved import profiles. We did not promise perfect historical pipeline — leadership agreed that opportunities open at cutover would be recreated manually with a half-day inside-sales blitz — but marketing attribution on closed-lost reasons from imported rows informed initial scoring weights.
Platform modules delivered
Modules align to sales execution workflows — intake, qualify, work, win — rather than generic CRM checkbox lists. Each capability below maps to a pain point surfaced in discovery workshops or rep shadowing, with acceptance criteria tied to operational KPIs rather than feature count.
Multi-channel lead intake
API endpoints and embedded forms capture website leads with UTM attribution; CSV import maps partner columns; manual quick-create for field reps with geolocation optional on mobile browser. Each lead stores source, campaign, partner code, product interest tags, and raw payload JSON for debugging. Rate limits and Cloudflare Turnstile protect public endpoints.
Lead scoring engine
Admin-configurable rules add points for geography match, product line, company size band, and engagement events ( form depth, return visit flag ). Score recalculates on enrichment; threshold triggers auto-qualify to opportunity or priority flag in rep queue. Rules versioned with effective dates so marketing changes do not rewrite history.
Territory and assignment routing
Priority chain assigns owner by partner code, city/state territory tables, product specialist flags, then round-robin within pool. Notifications via email and in-app; SLA clock starts at assignment timestamp. Managers reassign with mandatory reason; audit trail supports commission conversations without a separate spreadsheet. Holiday and leave calendars suppress round-robin to available reps only — a small detail that prevented assignment to people on approved leave during Diwali week.
Pipeline and stage governance
Kanban boards per pipeline type with enforced transitions and required fields per stage. Estimated value and close date drive weighted pipeline charts. Lost reasons captured from enum list — competitor, budget, timing, unresponsive — feeding win/loss analytics without fake precision on revenue.
Activity discipline layer
Calls, meetings, tasks, and notes log against leads or opportunities with due dates and outcomes. Stale rules flag opportunities without activity fourteen days; reps see badges; managers see rollup. Bulk " log touch " discouraged — quick log optimized instead to keep data honest.
WhatsApp Business integration
NestJS service verifies Meta webhooks, sends template messages initiated from CRM, attaches inbound/outbound messages to timeline. Template library synced nightly; send failures surface to rep with retry guidance. Personal WhatsApp out of scope — business API only.
Manager dashboards and reporting
Live pipeline value by stage, lead aging buckets, rep activity counts, assignment SLA compliance, source-to-qualified ratios. Materialized views keep Monday meetings snappy; drill-down to opportunity list from chart segments. No fabricated forecast AI — transparent numbers only.
Dedup and merge workflow
Normalized phone and fuzzy company name matching suggests duplicates on create. Reps request merge; managers approve with survivor record chosen. Merged history concatenates activities; audit preserves deleted duplicate ids for traceability.
Website lead capture alignment
Web6 updated the client's marketing site lead forms — built on their existing stack — to POST JSON directly to CRM ingress with UTM preservation. Thank-you pages fire client analytics events; CRM stores attribution separately so sales and marketing reconcile in one system. Page speed preserved by async submit and lightweight validation.
Service landing pages gained internal links to case studies and contact without keyword stuffing. Structured data on corporate site unchanged; CRM sat on sales subdomain crm.client domain pattern ( anonymized ).
Marketing and sales alignment extended beyond form wiring. We documented a shared vocabulary for source codes and campaign tags so Google Analytics UTM conventions matched CRM picklists — reducing the Monday arguments about whether a lead was " organic " or " partner referral. " Web6 did not run a full SEO retainer; we scoped technical hooks and copy guidance so the client's agency could continue page-level optimization without breaking API contracts.
Performance and scale
Lead create API targets sub-200ms p95 excluding WhatsApp side effects — assignment and scoring run inline; notifications async via Redis queue. Dashboard materialized view refresh completes under three seconds for two hundred thousand activities — sufficient for client scale with headroom.
React code-splitting loads manager charts only on dashboard route; rep mobile bundle kept under 250KB gzip for 4G. PostgreSQL indexes on owner_id, stage, updated_at for pipeline queries; explain analyzed during sprint eight.
WhatsApp webhook handler responds 200 immediately, enqueues processing — Meta timeout compliance. Peak campaign day tested with five hundred leads in one hour without queue backlog beyond two minutes.
Database maintenance windows scheduled Sunday 2–4 AM IST with read-only banner in CRM header — sales director approved after one botched Tuesday migration attempt early in staging. Connection pooling and prepared statements on hot lead-list queries kept p95 stable when concurrent users doubled during a product launch webinar that drove four hundred form submissions in ninety minutes.
Security and access control
Role hierarchy: Rep, Team Lead, Regional Manager, Admin, Read-only Finance. Reps see owned or team opportunities per sharing rules; managers see region scope; admins configure scoring. Laravel policies enforce object-level checks — not just route middleware.
Authentication via Laravel Sanctum SPA cookies on web; API tokens for website form ingress rotated quarterly. NestJS internal endpoints require HMAC signed headers from known services only. Secrets in AWS Secrets Manager.
PII minimization on lead records — store business contacts, not unnecessary national ids. Attachment uploads virus-scanned and stored S3 private with signed URLs expiring. Cloudflare rate limits on public lead endpoints prevent spray attacks.
Audit log captures assignment overrides, stage changes on opportunities above configurable value threshold, merge approvals, and scoring rule edits. Export restricted to manager roles and logged.
- Region-scoped manager visibility
- HMAC internal service authentication
- Rotating API keys for public form ingress
- S3 private attachments with signed URLs
- Audit trail on overrides and merges
- Cloudflare rate limiting on lead APIs
Testing and rollout
Automated tests covered assignment priority chains with fifty scenario fixtures, stage transition validations, scoring rule evaluation snapshots, and WhatsApp webhook signature verification. React component tests for quick-log form and pipeline drag validation.
Pilot rollout: twenty reps across West and South regions; parallel spreadsheet week; sales director daily check-in first five days. Training Loom videos under five minutes each — log call, move stage, send WhatsApp template, request duplicate merge.
Bug bash with team leads before national announcement; P0 data loss bugs none; two P1 UX fixes on mobile keyboard overlap shipped mid-pilot.
Regression suite expanded after week ten feature freeze — every scoring rule edit runs snapshot tests comparing output on fifty fixture leads before deploy approval. Sales director participated in one UAT session playing regional manager: reassign lead, approve merge, read stale report — sign-off was operational, not ceremonial.
Measured outcomes
Median lead response time — from assignment timestamp to first logged call or WhatsApp template — dropped forty-eight percent within sixty days versus pre-CRM baseline measured manually in pilot regions. Inside sales credited SLA badges and sorted " my day " queue for behavior change more than policy mandates.
Stale opportunities without activity for fourteen days fell fifty-seven percent portfolio-wide after managers adopted weekly stale report in Monday meetings. Reps preemptively logged touches to clear badges — healthy discipline, not gaming, per client observation.
Weekly active rep usage reached ninety-four percent of licensed seats — far above prior " spreadsheet plus WhatsApp " shadow IT. Two holdouts converted after manager override on commission report required CRM stage timestamps.
Marketing sourced attribution disagreements dropped informally — single lead record with UTM and partner fields became negotiation reference. Web6 did not publish revenue, win-rate dollar impact, or market share claims; client internal finance owns closed-won numbers.
Lessons learned
Assignment rule workshop upfront prevented mid-project territory politics from becoming code rewrites. Writing priority order on whiteboard and signing photo mattered more than clever algorithms.
Stage governance with required fields felt restrictive initially; reps thanked us when forecast calls shortened because Proposal actually meant proposal date existed.
NestJS sidecar for WhatsApp isolated Meta API changes — Laravel upgrade path stayed clean. Worth the small ops overhead for integration-heavy CRM.
Manager dashboards needed materialized views — live joins killed trust when numbers flickered during refresh. Five-minute staleness acceptable for leadership; reps still saw real-time on detail pages.
Technology stack explained
Pragmatic stack for owned CRM with integration tendrils — hireable in India, operable on AWS, and chosen so Laravel upgrades and WhatsApp API churn do not destabilize the core monolith.
Laravel 11
Core CRM domain, authorization policies, scoring and assignment engines, REST API, queue workers, and materialized view refresh schedules. Single source of business truth. Chosen over Node-only or Python stacks because client IT already maintained one Laravel internal tool and could hire PHP developers locally without premium salaries.
React 18 + TypeScript
Responsive SPA for reps and managers — pipeline Kanban, activity quick-log, dashboards with chart components lazy-loaded.
NestJS
Integration microservice for WhatsApp Business webhooks and outbound sends, future marketing webhooks, HMAC-verified ingress, forwarding normalized events to Laravel queues.
PostgreSQL
Leads, opportunities, activities, scoring rules, territories, audit tables. Partial unique indexes prevent duplicate open leads on same phone.
Redis
Queue driver, dashboard cache, pub/sub for lightweight real-time bell notifications to reps when new leads assign.
WhatsApp Business API
Template messaging with delivery receipts logged on CRM timeline — Meta-approved templates only; personal WhatsApp not integrated by design.
Docker + AWS + Cloudflare
ECS Fargate deploys, RDS PostgreSQL, ElastiCache Redis, S3 attachments, Cloudflare WAF and CDN for static assets and lead API protection.
“Before this CRM, Monday meetings were archaeology — who touched which lead, which WhatsApp thread mattered, why deals stalled. Now reps know their next action, managers see stale pipeline early, and partner leads stop disappearing into inboxes. We did not buy Salesforce seats we would resent; we built discipline that fits how India sales actually works.”
Long-term outcome
The sales CRM expanded from pilot regions to national rollout over following quarter with Web6 retainer for WhatsApp template additions and ERP Won-stage webhook. Phase two native mobile app for offline activity draft sync discussed — field reps want faster call logging in low connectivity basements.
Client marketing now plans campaigns with CRM scoring feedback loops — product interest tags adjusted when data shows mismatch, not when gut feel shifts. Finance still closes books in ERP; CRM remains pipeline system of record until Won handoff.
Organizations comparing build versus Salesforce or Zoho should ask: is assignment logic bespoke, is WhatsApp first-class, will per-seat tax hurt at scale? This project shows when custom lead management software from Web6 wins — pan-India complexity, owned rules, integration without shelfware bloat.
Twelve weeks was credible because scope excluded ERP, marketing automation, and native mobile — each honestly phased. The sales director now chairs a quarterly CRM backlog grooming with Web6 on retainer; new WhatsApp templates and territory splits ship without re-procurement. That operating model — owned software with a partner who knows the domain — was the outcome leadership wanted as much as the initial launch.
Suggested project visuals
-
Multi-channel lead intake flows through Laravel CRM core; NestJS handles WhatsApp webhooks.
File:
sales-crm-lead-intake-architecture.webpALT: Architecture diagram of sales CRM with Laravel, React, NestJS WhatsApp integration
-
Pipeline board enforces stage definitions and required fields before deals advance.
File:
sales-crm-pipeline-kanban-dashboard.webpALT: Sales pipeline Kanban board with stage validation in lead management software
-
Rep " My day " view prioritizes first-touch SLAs and overdue follow-ups.
File:
sales-crm-rep-my-day-queue.webpALT: Sales rep daily queue showing SLA highlights and overdue activities
-
Manager dashboards surface stale opportunities and activity discipline before month-end.
File:
sales-crm-manager-dashboard-stale-pipeline.webpALT: Manager dashboard showing stale pipeline deals and rep activity metrics
How this project connects
Adjacent to the project work above, this engagement usually extends into Zoho CRM implementation .
Teams evaluating adjacent capabilities often review our SaaS development services .
For a comparable implementation, property lead management case study .
Ready to scope something similar? discuss sales automation with the Web6 team.
FAQ
National Sales Company — FAQ
Practical answers about this engagement type — migration, speed, apps, Plus, CRM, or related delivery work.
What makes this different from Salesforce or off-the-shelf sales CRM?
The client needed partner-code assignment priority, India-first mobile web UX, WhatsApp Business timeline integration, and owned scoring rules without per-seat SaaS cost at national headcount. Custom CRM let them enforce stage definitions and operational KPIs their process actually uses — not adapt to a US-centric default workflow.
How does multi-channel lead intake work?
Website forms POST to CRM API with UTM attribution; CSV import handles partner referrals; reps manually quick-create field leads. All channels normalize into lead records with source metadata before qualification to opportunities. Cloudflare Turnstile and rate limits protect public endpoints.
How is lead scoring configured?
Administrators edit rules in UI — geography, product tags, company size bands, engagement signals — stored as versioned JSON logic evaluated on create and update. Scores prioritize rep queues and can auto-qualify above thresholds. Changes apply prospectively with effective dates.
How does territory assignment routing work?
Priority chain: partner code match, city/state territory mapping, product specialist flag, round-robin fallback. Assignment logs owner, timestamp, and SLA start; manager overrides require reason and appear in audit for commission alignment.
Is WhatsApp integrated with personal numbers?
No. Integration uses WhatsApp Business API via NestJS service — approved templates, delivery webhooks, inbound replies matched to leads by business number. Personal WhatsApp is out of scope; CRM makes business path easier than shadow threads.
What pipeline stages and activity discipline features exist?
Configurable pipelines with enforced transitions and required fields per stage — Proposal needs dates and values; Lost needs reason enums. Activities log calls, meetings, notes, WhatsApp; stale rules flag fourteen-day idle opportunities for rep badges and manager reports.
What stack powers the system?
Laravel CRM core, React frontend, NestJS for integrations, PostgreSQL, Redis, Docker on AWS ECS, Cloudflare edge security. Chosen for maintainability and India hiring pool familiarity.
How long did build take and team size?
Twelve weeks with Web6 team of four — tech lead, Laravel engineer, React engineer, QA/DevOps hybrid — from discovery through pilot and production cutover for twenty reps before national expansion.
What results were measured?
Median lead response time down forty-eight percent, stale pipeline deals down fifty-seven percent, ninety-four percent weekly active rep adoption. Web6 did not publish revenue or win-rate dollar claims — client tracks closed-won internally.
Can Web6 build similar sales CRM for our national team?
Yes. Web6 in Surat delivers custom CRM and lead management software for India-scale sales organizations. Share your channels, territories, and WhatsApp usage; we will propose phased scope with honest build-versus-buy guidance.
Related pages
Need lead management that fits your national sales team?
Web6 builds sales CRMs with scoring, territory assignment, WhatsApp integration, and manager dashboards — without per-seat shelfware tax. Tell us your channels and assignment rules; we will map a twelve-week realistic MVP.