The system the company depended on
Between 2021 and 2026 I worked on Rocket Mortgage’s GSE (government-sponsored enterprise) loan-approval platform. Every loan the company originates needs approval from this system at several points in its life. When the system is down, the company cannot approve loans.
The system is .NET on AWS. More than ten internal tech teams integrate directly with its API. I took it from early MVP stage to the final cutover with my team.
| Period | Role | Work |
|---|---|---|
| 2021–2022 | Associate Software Engineer | MISMO 3.4 loan-data mappings. Per-loan access endpoint for the pilot. |
| 2023–2024 | Associate Software Engineer | Infrastructure as code. Blue/green CI/CD. Event layer. Routing dashboards. |
| 2024–2026 | Software Engineer | Workflow rebuild. Consolidation. API contracts. Retirements. Alerting. |
User workflow minimized, sixty seconds to five
I rebuilt the loan-approval workflow. Before the rebuild, the interaction defaulted to holding the banker on the screen until the vendor decision returned. I shadowed bankers and watched them scramble to stay productive on other work while the screen was locked.
I proposed a submit-and-notify model. Submit returns at once. The decision arrives as a notification. User interaction dropped from about 60 seconds to about 5 across the internal applications the company approves loans through.
One app
My team and I consolidated the orchestrator, vendor integrations, and models into one GSE-interfacing app. Internal HTTP calls between my team’s apps became method calls. A change that used to span several repositories now touches one. A model change ships as one release.
The consolidated app deployed through the infrastructure-as-code and blue/green CI/CD pipelines I had built earlier.
Contracts for more than ten teams
I owned the API contracts. For each change I worked with the integrated teams directly and shipped compatibility logic, so the old request and response shapes kept working until the last consumer moved. Each team migrated on its own schedule. The migrations ran with zero downtime.
Cutovers and retirement
I retired two legacy paths.
Underwriting data. Ownership of underwriting information moved to cloud services. I coordinated the consumer cutovers and then removed the old path.
Document webforms. The team ran an on-premises system that produced document webforms. I replaced it with an integration to the company’s in-house document service. The team no longer owns an on-premises system for it.
Decoupling legacy postbacks
I built an EventBridge and Lambda integration layer that decoupled legacy postbacks from the core GSE application.
EventBridge delivers at least once, so the same event can arrive twice. Uniqueness rules and state checks downstream make a duplicate a no-op.
Alerts only on failures
I isolated each vendor’s failure path from the others. Then I reworked the GSE outage alerting with vendor-error logging, configurable error classification, and thresholds. Alerts fire on loan-approval failures. The classification decides what counts as one:
| Cause | Pages |
|---|---|
| HTTP error | Yes |
| Internal vendor error | Yes, above a configured threshold |
| Ineligible loan | No. A denial is a valid outcome. |
Dynatrace dashboards with custom OpenTelemetry metrics show why a loan went to a particular vendor.
Scope
Employer code, service names, metrics, and internal design detail stay internal. This page covers what I was responsible for, the patterns I used, and the results.