Cleaning Operations CRM
A step-by-step implementation guide covering every phase of the Salesforce build — from org setup and custom object configuration through to flow automation, security design, test results, and a full troubleshooting guide.
“This document captures the full implementation of the Cleaning Operations CRM in Salesforce — detailing every configuration step, automation build, security setup, and test result. Produced as a portfolio demonstration of end-to-end Salesforce administration capability.”
Cleaning CRM — Implementation Overview · Objects · Flows · Process
Key Features Delivered
The implementation delivers the following core capabilities for the cleaning business.
Automated Invoice Creation
A Cleaning Invoice is automatically generated every time a Cleaning Job is created — zero manual steps required.
Real-Time Payment Tracking
Payments update the Invoice balance instantly. Invoice status changes to Paid automatically when fully settled.
Real-Time Balance Calculation
Formula fields and roll-up summaries keep the outstanding balance accurate at all times with no manual calculation.
Clean Data Relationships
Master-Detail and Lookup relationships connect Account → Property → Job → Invoice → Payment in a clear, navigable chain.
Role-Based Security
Cleaners can only access their own Jobs. Financial data is restricted to management only via profiles and permission sets.
Operations Dashboard
6-component real-time dashboard covering job status, upcoming work, outstanding invoices, revenue, and cleaner workload.
Implementation Phases
The build was completed across 7 structured phases. All phases are complete.
- Configured Salesforce Developer Edition org — company settings, fiscal year, custom domain
- Built custom Lightning App: Cleaning Operations CRM with full object navigation
- Created 4 custom objects: Properties, Cleaning Jobs, Cleaning Invoices, Cleaning Payments
- Configured all fields — picklists, currency, formula, roll-up summary, lookups, master-detail
- Set auto-number formats: PROP-{000}, JOB-{0000}, INV-{0000}, PAY-{0000}
- Tailored page layouts for all 4 custom objects — removed clutter, organised related lists
- Compact layouts configured for Cleaning Jobs and Invoices to show key fields in highlights panel
- Flow 1: Job → Invoice — record-triggered on Job creation, auto-creates linked Invoice
- Flow 2: Payment → Invoice Update — updates Amount Paid, recalculates balance, sets status to Paid
- Flow 3: Job Completion → stamps Completed Date, updates Invoice status
- 3-tier Role Hierarchy: Owner/Admin → Operations Manager → Cleaner/Staff
- Custom Cleaner profile — read/edit own Jobs only, no Invoice or Payment access
- Permission sets: Job Management, Invoice & Payment Access, Read-Only Reporting
- 6 reports: Jobs by Status, Upcoming Jobs, Outstanding Invoices, Revenue by Month, Lead Pipeline, Property Activity
- Operations Dashboard with 6 components: donut chart, list, metric, bar chart, funnel, table
- Loaded 5 Accounts, 8 Properties, 12 Cleaning Jobs (various statuses), 12 Invoices, 9 Payments
- Demonstrates full end-to-end process flow live in the org
Automation Configuration
Three record-triggered Flows handle the core automation. Each is activated and tested end-to-end.
- Flow fires immediately after Job record is saved
- Creates a new Cleaning Invoice record
- Sets: Invoice Amount = Job Amount, Status = Unpaid, Due Date = Job Date + 14 days
- Links Invoice back to parent Job via Master-Detail
- Roll-Up Summary on Invoice recalculates Amount Paid automatically
- Flow evaluates Balance Due (formula: Invoice Amount − Amount Paid)
- If Balance = 0 → sets Invoice Status to Paid
- If Balance > 0 and Amount Paid > 0 → sets Invoice Status to Part-Paid
- Stamps today’s date into the Completed Date field on the Job
- Retrieves linked Cleaning Invoice
- Updates Invoice Status to reflect job completion
Test Results
Ten end-to-end tests were carried out to validate the implementation. All tests passed.
| Ref | Test Scenario | Expected Result | Result |
|---|---|---|---|
| T-001 | Create a new Cleaning Job | Job saved. Flow fires and creates a linked Invoice with Status = Unpaid. | Pass |
| T-002 | Invoice auto-created on Job save | Cleaning Invoice in related list. Amount populated. Status = Unpaid. | Pass |
| T-003 | Record a Cleaning Payment | Payment saved. Amount Paid on Invoice updates. Balance recalculates. | Pass |
| T-004 | Full payment clears invoice | When payments equal Invoice Amount, Invoice Status → Paid automatically. | Pass |
| T-005 | Mark Job as Completed | Completed Date stamped. Invoice Status updates via Flow 3. | Pass |
| T-006 | Lead conversion to Account | Lead converts. No duplicate Account created if one already exists. | Pass |
| T-007 | Property linked to Account | Property saved and visible in related list on Account record. | Pass |
| T-008 | Cleaner login — restricted access | Cleaner sees only own Jobs. No access to Invoices or Payments. | Pass |
| T-009 | Operations Dashboard loads | All 6 components render with current data. Refresh works. | Pass |
| T-010 | Part-payment updates balance | Partial payment logged. Amount Paid updates. Balance reduces. Status = Part-Paid. | Pass |
Troubleshooting Guide
Common issues encountered during implementation and their resolutions.
Flow not triggering on Job creation
Check the Flow is Activated (not just Saved). Confirm the entry condition is set to run when the record is Created. Use Flow Debug to step through logic with a new test record.
Invoice Amount Paid not updating
Verify the Roll-Up Summary field on Invoice is linked to Cleaning Payments via the correct Master-Detail relationship. Check field API names match exactly what the Flow references.
Invoice Status not changing to Paid
Check the Flow 2 decision condition. Ensure the Balance Due formula field is calculating correctly. Test with a payment equal to the exact Invoice Amount — rounding differences can prevent the condition firing.
Cleaner can see other users’ Jobs
Review the OWD setting for Cleaning Jobs — it should be set to Private. Confirm the Role Hierarchy is correctly configured with Cleaner at the bottom tier with no upward visibility.
Dashboard shows no data
Remove all report filters temporarily to confirm records are accessible, then re-add filters one at a time to identify which filter is excluding records from the component.
Property not appearing in Account related list
Confirm the Property object has a Lookup field pointing to Account. Check the Related List has been added to the Account page layout via the Layout Editor.
