What is HubSolution?
HubSolution connected advertisers with loan providers on a pay-per-conversion model. Applicant data came in from ad sites, got transformed to what each loan provider expected, and a response came back as approved or rejected. I was hired to work alongside the senior developer who had built most of it.
I was there for 7 weeks before the entire department was shut down as part of a company restructuring.
The Problem
Adding a new integration meant copy-pasting an existing file and manually wiring up field requirements, validation logic, and data mapping. Every integration did validation differently. Documentation from loan companies was often outdated, so there was constant back-and-forth over email just to figure out which fields they actually needed.
On top of that, when we rejected an application, ad sites just got "rejected" with no reason and no way to fix it on their end.
What I Built
I tackled this from three angles:
- A Validator framework with composable rules (AgeMin, AgeMax, SSN format, etc.) that standardized validation and auto-generated clear rejection reasons instead of generic "rejected" messages
- An Integration Builder web UI where you configure fields, constraints, and mappings visually, then export JSON that feeds into a template generator to scaffold new integration files
- Normalized error responses so ad sites could actually see why an application was rejected and fix issues on their end
Integration Builder
This was the piece I am most proud of. It pulls field definitions live from the HubSolution API, lets you configure requirements and validation per field, and outputs a JSON spec. That spec feeds into a Handlebars.js template that generates a ready-to-go integration file. Non-technical people at loan companies could use it to define their own field requirements, cutting out the email ping-pong.
Impact
In 7 weeks I shipped 20 new integrations on top of ~60 existing ones, updated many old ones with proper validation by digging through error logs in MariaDB, and built the tooling above. Everything was backwards-compatible as nothing could break for live integrations.