One of our largest property management integrations started as a partnership with a middleware vendor, not a direct build. Property management software has no shared standard: every system uses its own schema and terms, which is exactly the gap a middleware vendor is built to fill. We picked one to standardize that connection for us.
I gave their engineer complete product requirements and detail up front, so that was never the issue. What followed was a pattern I couldn’t fix from my side: things broke often, I couldn’t get them to move at the pace we needed, and I rarely got an actual root cause. I was putting out fires without ever learning why they started. At one point, they deleted our project documentation entirely.
I didn’t wait for them to explain it or fix it. Delaying would have only pushed their own fix further out, and it would have cost us clients in the meantime. I rebuilt the mapping and documentation myself, immediately, so the integration kept working while the vendor relationship kept failing around it.
That crisis settled a question we had already been circling. Using a middleware vendor for this integration wasn’t sustainable, and around the same time, our own roadmap had already flagged direct property management system integrations as a priority: those are the systems enterprise property managers run on, and owning the connection directly was how we’d reach them. I judged this particular integration could be one of our most profitable, but only if we owned it outright instead of routing it through a vendor we couldn’t get a straight answer from.
So I made the case to rebuild it in-house. I rewrote the PRDs, scoped the framework, and handed engineering a direct build instead of another vendor relationship. Once it shipped, I planned and ran the client migration off the old integration, moved everyone over without disrupting them, and closed out the vendor relationship once nobody was left on it.
What I’d take from this: outsourcing a connection doesn’t outsource the risk sitting behind it. The moment a client felt the vendor’s failure, it became my problem anyway, so waiting for an explanation I was never going to get wasn’t actually protecting anything. The pattern itself was the case I needed. I stopped waiting on them to explain and put that time into building something I could stand behind.