ButlerCRM
Contacts, deals, email, calendar, and tasks in one app

Live landing page at butlercrm.com.
Challenge
Small teams run their pipeline across four disconnected tools — a spreadsheet for contacts, the inbox for email, a calendar for meetings, sticky notes for tasks — with no single source of truth. The first ButlerCRM build on NestJS then hit a wall the moment collaboration went multi-user: WebSocket connections buckled under load and Node's single-threaded model bottlenecked concurrent work.
Solution
Rebuilt ButlerCRM from the ground up on Elixir/Phoenix LiveView. Contacts, deals, email, calendar, and tasks live in one app, server-rendered with real-time updates pushed over the wire — no separate SPA to keep in sync. The BEAM VM gives per-user process isolation and fault tolerance, Phoenix Channels and Presence power live collaboration, and Ecto + PostgreSQL back a multi-tenant SaaS where every workspace gets its own subdomain. AI agents (with a SurrealDB memory layer) handle lead scoring and follow-up.
Results
- Migrated off NestJS to a single Elixir/Phoenix LiveView codebase
- Contacts, deals, email, calendar, and tasks unified in one app
- Real-time collaboration via Phoenix Channels + Presence
- Multi-tenant SaaS — every workspace on its own subdomain
- AI agents for lead scoring and automated follow-up
System Architecture
Elixir/Phoenix LiveView architecture with multi-tenant, fault-tolerant real-time collaboration
Elixir/Phoenix LiveView architecture with multi-tenant, fault-tolerant real-time collaboration
Facing Similar Challenges?
Every business is different, but the problems tend to rhyme. If someone sent you, get in touch and tell us about yours.