A self-directed program unifying a multi-family solar pipeline onto Salesforce — discovery through rollout, with a working org, migrated data, live automation, and a defect taken to closure.
A multi-family solar operation moved every project through nine specialized teams — Sales, Development, Site Survey, Design, Permitting & Interconnection, Incentives, Construction, Business Ops, and Project Management. Each team tracked its own work in its own spreadsheet.
The result was a pipeline nobody could see. Status lived in nine places and agreed in none. Handoffs happened by email and fell through. Data was re-keyed between stages, drifting a little more each time. Leadership had no reliable way to answer "where is this project?" or "how much capacity activates this quarter?"
The teams weren't the problem. The absence of a shared system was. The goal: unify the pipeline onto one system of record — without dragging the mess along, and without asking nine teams to simply work harder.
Eight phases, managed through a Jira board from first ticket to Done. Each phase gated the next: discovery before design, a working system before migrating data into it, testing before rollout.
The organizing principle throughout was one source of truth for every definition — a single meaning for each stage, each required field, and for "at risk" — so no two parts of the system could ever contradict each other.
Because this was a solo build, the judgment lives in the decisions. Four that mattered:
Remapping legacy values ("New" → "Intake") is a business decision, so it belongs in a readable table anyone can review — not buried in a formula. Unmatched values fail loudly rather than pass silently.
Two flows fire on the same stage-change event. I separated them because updating the record's own field and creating a related task are different operations that Salesforce optimizes differently.
Disabling the integrity guardrails to force known-bad data in would have recreated the exact problem the program existed to solve. Flagged rows get remediated instead.
Spilled and manually-filled columns had drifted out of alignment, so a lookup was returning real-but-mismatched values — with no error. The fix, and the lesson: match every pull on the Project ID key rather than on row position. A formula is only as right as what feeds it.
UAT surfaced a genuine defect too — migrated records had blank stage-timing data because the bulk load bypassed the automation that normally sets it. I root-caused it to a documented load-plan gap, backfilled, and retested to closure. The defect lifecycle working exactly as intended.
And a standard Salesforce component failed silently inside the intake flow — a Lookup that hung indefinitely. Diagnosed and swapped for a Record Choice Set, the modern reliable pattern.
As a simulated program, I report what the system makes possible rather than fabricating numbers:
Pipeline status, aging, and at-risk projects — previously invisible across nine spreadsheets.
Non-compliant records blocked by validation rather than by vigilance.
Probability-weighted Commit / Weighted / Best Case tiers that didn't exist before.
The Jira lifecycle across eight epics, the Salesforce board re-stamping dates and spawning handoff tasks on a stage change, the validation rule blocking a project that skipped its site survey, the two conflicting exports reconciled into one dataset, and the weighted forecast a leader can plan against.
Conduit took a fragmented, spreadsheet-bound operation and delivered a working, governed, tested pipeline with a clear path to production — planned, built, migrated, automated, measured, tested, and handed off.
It's the shape of the real job: not one deliverable, but a whole program held together by traceable decisions and a single source of truth.
Honest scope: built at teaching scale with a small, fully-verifiable dataset and production behavior documented rather than simulated. Next steps are named — add the external-ID field and re-run the load as an upsert, build the v1 integrations, implement production queue routing, and calibrate forecast probabilities from real conversion history.