
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
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
| Object | Type | Key fields |
|---|---|---|
| Lead | Standard (extended) | Service Interest, Budget Range, Project Timeline |
| Opportunity | Standard (extended) | Project Type, Tech Stack, Estimated Hours/Value, Lost Reason |
| Project__c | Custom | Status, Budget/Used Hours, Budget Used %, Health (formula) |
| Milestone__c | Custom | Due Date, Amount, Status, Invoice Status |
| Time_Log__c | Custom | Date, 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:
- Opportunity — "Umbrella Brand Site" is created: Website project, Next.js, 150 estimated hours at $80/hr → Estimated Value auto-calculates to $12,000.
- 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.
- Delivery kicks off — a Project Manager, start date, and ~1-month deadline are added; status moves to In Progress.
- 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.
- Time logged — three entries bring Hours Used to 24, all billable.
- 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.
- 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.
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.
Live project health card
A Lightning Web Component shows a live Green/Amber/Red health badge, computed from budget usage and days-to-deadline.
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.
98% Apex test coverage
A shared TestDataFactory and per-class test classes exercise positive, negative, and 200-record bulk scenarios across every Apex class.
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
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