Buy, adapt or build, and what a build involves
Three honest routes
A hosted CRM such as HubSpot, Zoho or Salesforce gives you a mature product on the first day, and if it fits with configuration alone you should stay with it. An open-source PHP CRM such as SuiteCRM or EspoCRM can be installed on your own server and extended, which suits teams whose needs are close to standard but whose data has to stay in-house. A custom build starts to pay when you are bending the process to suit the tool, maintaining a web of automations to fake a missing feature, or when the CRM has to be one part of a larger operational system. The trade is real: you take on a build cost and the responsibility of owning software, and in return it does what your business does.
The records and how they relate
Three decisions shape everything else. First, people and companies are separate records with a many-to-many link, since contacts change jobs and consultants work for several clients. Second, activities are one stream that can attach to a contact, a company or a deal, which is what makes a single timeline possible. Third, custom fields are defined by admins and not by developers, so adding "contract renewal date" does not need a release. We store those definitions as data and index the ones you filter on.
Mail and calls logged without typing
Reps abandon a CRM when it means typing everything twice. Mailbox integration through the Gmail and Microsoft Graph APIs, or plain IMAP, matches messages to contacts by address and files them on the timeline. We sync only conversations with known contacts and let users mark threads private, because pulling in an entire inbox is a privacy problem. For telephony, providers such as Twilio expose calls through an API and webhooks: click-to-call from the browser, inbound calls that open the record of the caller, and duration and recordings logged without anyone writing a note. Sync runs as a scheduled command-line job, so a slow mail server never freezes the screen a rep is working in.
Cleaning the export you start with
Every CRM project begins with a messy export. Our importer reads large files in chunks as a background job, maps columns, previews the result, and reports rows it could not place instead of silently dropping them. Matching normalizes email case, phone numbers to international format and company names without suffixes such as Ltd or Inc, then proposes merges for a human to confirm. The same matching runs on every new lead, so duplicates are stopped at the door after launch as well.
Numbers managers can defend
Because every stage change is recorded with a timestamp and a user, the system can answer how long deals sit in each stage, where they are lost and which sources produce customers as opposed to leads. We agree the handful of numbers management runs the business on and build those first.