DEV3 GrowthPilot is a self-hosted, multi-tenant CRM and marketing platform. It captures leads from Meta, Google, TikTok, LinkedIn, forms and APIs and routes them to reps.
Stack: Next.js 15 (App Router) and MongoDB, with a worker process (or a per-minute cron on serverless hosting) for scheduled work.
Decisions that mattered
- Every channel goes through the same ingest step. It de-duplicates contacts across channels, attaches repeat enquiries to the open lead and writes every change to the timeline.
- Routing is configuration: lead pools choose a strategy (round robin, weighted, load-balanced, skills, language or territory, performance-weighted, claim queue) and respect availability, capacity and working hours.
- Every message goes through one queue that checks consent, the suppression list, the WhatsApp 24-hour window, quiet hours and frequency caps.
- SLA checks, campaigns, workflows, connectors and scoring are claimed before they run, so a worker and a cron call never do the same job twice.
- AI is an optional assistant. With no key every AI control shows a connect state and the rest works.
Limits: sends and social posts are simulated in the public demo.
Trade-off we chose: claiming scheduled work before running it makes overlap safe at the cost of some bookkeeping.
How do you handle consent across several messaging channels? Questions welcome.
#nextjs#mongodb#crm#case-study