Case Study · Green Light Offer · Real Estate Investment

Green Light Offer wanted dashboards they could trust. We fixed the data first.
A real estate investment team runs three departments - acquisitions, dispositions, and title and closing - on Salesforce, and every KPI they looked at was quietly wrong: lead ownership overwritten by intake staff, twenty-second dials counted as conversations, no idea how complete a deal record was. In 98 hours we fixed each one at the source, then built the reporting layer on top.
Industry
Real estate investment
Platform
Salesforce Sales Cloud + Flow + Apex
Timeline
Ten weeks
Outcome
KPIs the leadership team can act on
The challenge
Green Light Offer: a fast-moving property business with numbers nobody believed
Green Light Offer buys and resells properties through an inbound sales floor split into acquisitions, dispositions, and title and closing. They run on Salesforce with a real estate CRM package and a call-tracking phone system, and they had dashboards - the problem was what the dashboards were measuring. "New Leads" counted outbound calls instead of leads. Per-agent charts hid company totals. Ratios displayed as 1, .5, and 0 instead of percentages. Underneath, the data feeding those charts had structural problems no chart could fix.
Lead ownership kept getting overwritten
Leads were created by intake staff, so the "original owner" field pointed at whoever typed them in - and every reassignment wiped the previous value. Long-term reporting on who actually worked a lead was impossible.
A twenty-second dial counted as a conversation
Contact-rate metrics treated every logged call the same. There was no distinction between a real conversation and a voicemail, so the floor's most important efficiency number meant nothing.
Nobody knew how complete a deal record was
Transactions and opportunities had dozens of fields and no way to see what was missing. A static formula would break every time the field list changed - which it did constantly.
Everyone saw everyone's numbers
The home page showed the same dashboards to every user. An acquisitions agent had no personal view, and department leads had no department view.
It worked in sandbox and failed in production
A second active flow in production was firing first and blocking the new ownership logic - the kind of drift that only shows up after go-live.
The architecture
Fix the fields, then build the charts
The order mattered. We corrected the three sources of bad data - lead ownership, contact qualification, record completeness - with flows and Apex that enforce the rules automatically, then rebuilt the reporting layer on top of data that was finally true.
Sources
Corrected in Salesforce
Outcomes
What we built
Original Lead Owner, locked at first real assignment
A before-save flow stamps the first genuine acquisitions agent assigned to a lead - skipping intake users and queues - and never overwrites it, including through round-robin assignment. Diagnosing why it failed in production (a conflicting active flow) was part of the job.
"Meaningfully Contacted" defined by one hard number
A checkbox on Lead and Contact that flips only when a logged call exceeds 120 seconds, and does not re-trigger on later calls. Repointed to the call-duration field the client's phone system had actually been writing to for years, not the Salesforce default.
A record-completeness engine that admins can extend
Completion % on every transaction, calculated by invocable Apex and configured through custom metadata - the client adds a field to the calculation by creating a metadata record, no code change. Historical records were backfilled in production.
Opportunity completeness, bulk-safe
A trigger-based version for opportunities that recalculates only when a field flips between blank and filled, so a value simply changing from 6 to 8 costs nothing.
Twenty reports, four dashboards, one standard
Individual and department dashboards for acquisitions, dispositions, and title and closing, plus a company performance dashboard - with company totals, agent comparisons as bars, real percentages, and inventory counted as properties rather than dollars.
A home page that knows who you are
Dynamic component visibility shows each user their department's dashboards and their own numbers; an admin-only dashboard covers the CRM package itself.
The KPIs leadership asked for
Speed to Lead, Meaningful Contact Rate, Average Days in Title and Closing, Days in Assignment by month, quarter, and year, Transaction Closing Rate, Cancelled Title-Issue Deals, and Projected versus Actual Profit.
How we did it
Why we fixed the fields before we touched a single chart
When a sales floor says its dashboards are wrong, the tempting move is to rebuild the dashboards. We did the opposite. A dashboard is only ever as honest as the fields underneath it, and three of Green Light Offer's most important fields were structurally broken: the original lead owner was being overwritten on every reassignment, a twenty-second dial counted the same as a real conversation, and there was no way to tell how complete a deal record was. Rebuild the charts on top of that and you get prettier lies. So the first phase was entirely below the surface.
Lead ownership was the subtle one. Because leads are created under intake users' accounts, the "owner" field pointed at whoever typed the lead in, and every round-robin reassignment wiped the last real value. We built a before-save flow that stamps the first genuine acquisitions agent assigned to a lead, skips intake users and queues entirely, and never overwrites itself afterward. It passed in the sandbox and failed in production, which turned out to be its own lesson: a second, older active flow was firing first and blocking ours. Finding that conflict was as much of the job as writing the flow.
The completeness engine was built to survive change. Rather than a static formula that breaks every time the team adds a field, we drove it with custom metadata, so an administrator adds a field to the calculation by creating a record, not by calling us. The opportunity version runs as a bulk-safe trigger that only recalculates when a field actually flips between blank and filled, so a value merely changing from six to eight costs nothing. Meanwhile the contact-qualification rule was reduced to one hard number, 120 seconds, pointed at the call-duration field the client's phone system had genuinely been writing to for years rather than the Salesforce default.
Only then did we rebuild the reporting layer: twenty reports and department dashboards for acquisitions, dispositions, and title and closing, a consolidated company view, and a role-aware home page where each user sees their own numbers and their department's. Because the data underneath was finally true, the KPIs the team had asked for for months - Speed to Lead, Meaningful Contact Rate, Projected versus Actual Profit - were numbers leadership could act on rather than argue about.
How we delivered
Ten weeks, start to finish
Diagnose the data
Mid-December: traced why ownership, contact rate, and completeness could not be trusted, and set up a fresh sandbox.
Fix at the source
Late December: ownership flow, 120-second contact rule, and the completeness engine built and tested.
Rebuild reporting
Late December: twenty reports and the department and company dashboards on corrected data.
Production and backfill
January: deployed, historical completion percentages backfilled, the production-only flow conflict found and fixed, role-aware home page live.
Refine with the floor
February: metrics revised on client feedback - Speed to Lead, Projected versus Actual Profit - and completeness extended to every opportunity field.
The results
What changed for the business
| Metric | Before | After |
|---|---|---|
| Original lead owner | Overwritten on every reassignment | Locked to the first real agent |
| Contact rate | Any dial counted | Only calls over 120 seconds |
| Record completeness | Unknown | Live % on every transaction and opportunity |
| Reporting | Wrong counts, per-agent noise | 20 reports, 4 dashboards, company totals |
| Home page | Same view for everyone | Role-aware by department and user |
| Engagement | — | 98 hours, fixed scope, every task demoed on video |
Dashboards you do not trust? The data underneath is usually the problem.
Book a free 30-minute scoping call. We will look at how your leads, calls, and records are actually captured, and hand you a fixed-scope plan to make the numbers true, at no cost.
Client identifying details have been anonymized at the client's request. Metrics reflect the outcomes of a real engagement.
