All Projects
Slide 1 of 12
Slide 1
Software House CRM (Salesforce)
Personal build
Salesforce

Software House CRM (Salesforce)

Enquiry to invoicing, fully automated — a working example of the custom Salesforce systems I build for any business.

by Tayyab Nadeem

Personal build
SalesforceApexCRMLWC

A custom Salesforce CRM built for a software development agency — the kind of company that builds websites, mobile apps, Shopify stores, and custom software for clients. It manages the entire client lifecycle end to end: enquiry → deal → delivery → invoicing, inside standard Salesforce objects (Lead, Account, Contact, Opportunity) extended with a purpose-built delivery layer (Project, Milestone, Time Log).

Built as a Salesforce DX (SFDX) source-format project.

This is one example, built around a software agency's workflow — but the same approach (custom objects, Apex automation, and Lightning Web Components) is exactly how I'd build a bespoke Salesforce CRM or app for a retailer, a clinic, a logistics company, or any other business with its own specific process. The platform doesn't change; what gets modeled and automated does.

Business flow

A prospect comes in as a Lead with a service interest, budget range, and timeline. Once qualified, it converts into an Account, Contact, and Opportunity. The Opportunity moves through the sales pipeline; the moment it's marked Closed Won, a Project is created automatically — no manual step. Delivery work is tracked through Milestones (client-facing deliverables with an invoicing status) and Time Logs (internal hours against the project budget), which continuously recalculate the project's budget consumption and health.

Data model

ObjectTypeKey fields
LeadStandard (extended)Service Interest, Budget Range, Project Timeline
OpportunityStandard (extended)Project Type, Tech Stack, Estimated Hours/Value, Lost Reason
Project__cCustomStatus, Budget/Used Hours, Budget Used %, Health (formula)
Milestone__cCustomDue Date, Amount, Status, Invoice Status
Time_Log__cCustomDate, Hours, Developer, Billable

Health logic: Red if over 100% of budget hours or past deadline; Amber if over 80% of budget or within 7 days of deadline; Green otherwise — computed live, no manual status updates.

Case study: Umbrella Digital

A worked example from the project's own seed data, tracing one client through the full lifecycle:

  1. Opportunity — "Umbrella Brand Site" is created: Website project, Next.js, 150 estimated hours at $80/hr → Estimated Value auto-calculates to $12,000.
  2. Won — the deal closes at Closed Won. The trigger fires instantly and creates a Project named "Umbrella Brand Site," 150 budget hours, Planning status — zero manual data entry.
  3. Delivery kicks off — a Project Manager, start date, and ~1-month deadline are added; status moves to In Progress.
  4. Milestones defined — Design Approval ($3,000, already Delivered & Invoiced) and Final Launch ($5,000, still Pending & Not Invoiced) — the Unbilled Milestones report picks up the second automatically.
  5. Time logged — three entries bring Hours Used to 24, all billable.
  6. Health, computed live — 24 of 150 budget hours (16%) and 25 days to deadline evaluates to Green, visible instantly on the Project Health Card with no manual status updates.
  7. Invoicing — as Final Launch is delivered, its Invoice Status moves Not Invoiced → Invoiced → Paid, dropping off the Unbilled Milestones report the moment it's settled.

The same pattern repeats for every client in the sample data — a support retainer trending toward its deadline, and a completed, fully-invoiced ERP integration — showing the model handling both active delivery and closed-out engagements.

No image

Automated project creation

An Apex trigger creates a Project the instant an Opportunity is marked Closed Won — no manual step, and duplicate-proof even if a deal reopens and re-closes.

No image

Live project health card

A Lightning Web Component shows a live Green/Amber/Red health badge, computed from budget usage and days-to-deadline.

No image

Quick Time Log

Developers log hours in seconds from the Project record — the health card refreshes live via Lightning Message Service, with zero page reload.

No image

98% Apex test coverage

A shared TestDataFactory and per-class test classes exercise positive, negative, and 200-record bulk scenarios across every Apex class.

What's included

Sales & CRM

  • Lead capture with service interest, budget range, and timeline
  • Custom Lead Source values (Website, Upwork, Fiverr, LinkedIn, Referral, Cold Outreach)
  • Validation rule blocks "Qualified" without a stated budgetCUSTOM
  • Software-house-specific sales pipeline stages with win probabilities
  • Deal-sizing fields with an auto-calculated Estimated Value
  • Mandatory loss-reason capture on Closed Lost

Delivery & Project Management

  • Every won deal becomes a trackable Project automatically
  • Milestones with due date, amount, delivery status, invoicing status
  • Day-by-day Time Logs, billable or non-billable, per developer
  • Hours roll up automatically into budget consumption
  • Live Green/Amber/Red health indicator — no manual status updatesCUSTOM

Automation

  • Apex trigger creates the Project the instant a deal is won
  • Duplicate-proof even if a deal reopens and re-closes
  • Bulk-safe for 200 records per transaction — no SOQL/DML in loops

In-App Experience

  • Project Health Card: badge, budget progress bar, days-to-deadline
  • Quick Time Log form, refreshes the health card live
  • Account Projects Summary — every client project in one place

Reporting

  • Pipeline by Stage
  • Won vs Lost by Lost Reason
  • Leads by Source
  • Projects by Health
  • Unbilled Milestones

Tech stack

Salesforce DXApexLightning Web ComponentsSOQLLightning Message ServiceSalesforce CLI
98%Org-wide Apex coverage
5Custom/extended objects
3Lightning Web Components
200Bulk-safe record limit

Need a custom Salesforce build?

I design and build Salesforce orgs from scratch — Apex automation, Lightning Web Components, and the reports that actually show whether the business is working.

Get in touch

Command Palette

Jump to a section, project, or action.