All projects
CupidFaces Live GitHub

SalesCalls CRM

Open-source cold calling CRM: lead management, call logging, follow-up scheduling, and team management in one self-hostable PHP app

500+
Active cold callers
35+
Teams using the platform
15,000+
Leads managed
MIT Open Source
License
CRMSaaSNext.jsMulti-tenantCold CallingLead Management
SalesCalls CRM homepage
Homepage

The Problem

Sales teams at small and medium businesses needed a cold calling CRM they could fully own. SaaS alternatives required monthly subscriptions, did not allow data portability, and came with more complexity than most small teams would use. A self-hostable, open-source option that handled the full cold calling workflow simply did not exist.

Overview

SalesCalls CRM is a self-hostable cold calling and lead management system built for sales teams that want full control over their data. It covers the full cold calling workflow: managing lead lists, logging calls with outcomes, scheduling follow-ups, emailing leads directly from the platform, and tracking team performance across projects.

The app is structured around projects, with each project having its own pipeline columns and lead pool. Admins can create projects, configure custom pipeline stages, manage team members, and assign leads across users. Custom fields let admins extend the lead record with any fields their sales process needs, without touching the code. Email is sent directly from the app using per-user SMTP configuration.

The project is open source under MIT and available to download and self-host on any PHP/MySQL server.

My Role

  • Conceived the product and defined the full feature scope: lead management, call logging, follow-up scheduling, per-user email, team management, and CSV import/export
  • Designed the lead permission model: owner full control, shared-edit, and shared-view tiers, based on how real sales teams actually collaborate on accounts
  • Defined the pipeline structure: configurable stages per project that match the team's actual sales process
  • Designed the call log workflow and outcome taxonomy: 6 states (no answer, left message, interested, not interested, callback, converted) with follow-up date surfaced on the daily dashboard
  • Made the decision to use per-user SMTP rather than a shared platform address, preserving deliverability
  • Specified the custom fields system: admins extend lead records via the UI without schema changes
  • As a solo-stage project with no separate engineering team, I contributed directly to development alongside product ownership.

Stakeholders

  • Sales teams (primary users)
  • Sales managers and admins
  • Open source community (post-release adopters)

Technical Context

Single PHP application running on MySQL. No framework: plain PHP with PDO for database access, session-based auth with role checks on every page.

Custom fields are stored in a custom_fields table and their values in lead_custom_values. Email is sent via PHPMailer using credentials stored in an email_settings table per user.

Key Decisions

Lead permission model with owner, shared-view, and shared-edit tiers
Sales leads often need to be worked collaboratively but not symmetrically. The three-level model was designed around real workflows rather than a simpler all-or-nothing sharing approach.
Per-user SMTP instead of a shared sending address
Cold outreach sent from a shared platform address looks like automated bulk mail. Using the user's own SMTP credentials means the email comes from their actual sending domain.
Custom fields without schema changes
Different sales teams need different data on a lead record. The custom fields system lets admins define new fields via the UI without touching the database schema.
Self-hosted MIT open source as the distribution model
Sales teams often have compliance requirements around where lead data is stored. Releasing as self-hostable MIT open source means any team can run it on their own server with full data control.

Challenges

Building a permission system that is flexible without becoming complex to manage
The first version of lead sharing had only two states: owned or shared. That turned out to be too coarse. Adding the view/edit distinction solved the immediate problem but required revisiting the permission checks on every data-modifying action.
Custom fields that work for filtering without becoming a performance problem
Querying leads filtered by a custom field value requires a join. The current approach indexes on lead_id in the values table and accepts the join cost as reasonable for the expected scale of a self-hosted CRM.

Discovery

The brief came from a cold calling team manager with a specific, practical problem. One of his team members could not use standard office tools on her phone, which was where the team's fieldwork happened. They were tracking leads in a shared spreadsheet that broke constantly, had no call log, and gave managers no visibility into activity. The decision to release it as open source came from recognising that the same problem existed across a lot of small sales teams.

Stakeholder Friction

There was no real debate around open source versus proprietary. The friction came post-launch, when it became clear that different teams had very different mental models of what a pipeline stage was. Configurable pipeline stages were added directly from that feedback rather than forcing teams to fit their process into a fixed structure.

Outcomes

500+ active users across 35+ teams with no marketing spend
Reached 500+ active cold callers across 35+ teams through organic discovery and word of mouth. The MIT license removed the budget conversation entirely.
15,000+ leads managed across the platform
15,000+ lead records managed across all active teams, with full call log history, follow-up scheduling, and pipeline stage tracking per lead.

Technology Decisions

PHPMySQLPDOPHPMailerSession AuthCSV Import/Export

What I'd Change

I would rebuild it in Next.js, make it multi-tenant, and add a proper cold email layer with lead sourcing. The PHP stack was the right call for speed of delivery and ease of self-hosting, but it limits how far the product can grow.

From the blog

All posts
The Real Skills You Need as a Technical Product Manager
There’s a lot of confusion about what a Technical Product Manager actually does.
22 May 2026
JobHunt: What I Was Actually Trying to Fix
Most of the products I build start with a small, persistent frustration. Something I've experienced myself or watched someone close to me struggle with and couldn't stop thinking about.
17 May 2026
ProductManagement
Building JobHunt: A TPM's Notes on Shipping an AI Job Application Assistant
I'm a Technical Product Manager. I think in user journeys, prioritisation frameworks, and edge cases. What I don't usually do is write the code. JobHunt changed that, not because I suddenly became a software engineer, but because AI-assisted development has made the distance between an idea and a working product smaller than I've ever seen it. This is a record of what I built, why I built it that way, and what the decisions looked like in practice.
17 May 2026
← PrevNewLeaf WellnessVisibility LogicNext →FalkOne GS LtdCupidFaces