It started with a seemingly simple task: implementing universal links for our sports fantasy app, PlaySquares.
"Just add universal links," they said. "It'll be straightforward," they said.
After weeks of wrestling with documentation, inconsistent behaviors across iOS versions, edge cases on Android devices, and an ever-growing pile of Stack Overflow tabs, I hit my breaking point. What should have been days of work had stretched into weeks, pulling me away from building the actual features that would make our app valuable to users.
The frustration wasn't just about time—it was about witnessing firsthand how a technical implementation challenge was directly harming our user experience. Our marketing links were sending users to the wrong places. Authentication states weren't being preserved. Users who clicked an email link to view a specific fantasy matchup were landing on the home screen, forced to navigate again to find what they'd been promised.
This wasn't just an engineering problem; it was breaking the implicit promise we'd made to our users about how our app should work.
As I dug deeper into fixing our implementation, I uncovered the true costs of complex deep linking solutions:
1. The Developer Time Sink
The publicly documented APIs for universal links and app links are just the beginning. The reality includes:
For our small team, this meant multiple developers spending up to 30% of their time troubleshooting linking issues rather than building core features.
2. The Opaque Vendor Problem
We initially tried using a popular third-party linking service, which introduced its own challenges:
When things broke (and they did), we had limited visibility into why or how to fix them.
3. The Maintenance Burden
Even after getting links working, the maintenance overhead was substantial:
4. The Ultimate Cost: User Experience
Most concerning were the metrics showing the real impact on users:
These weren't just engineering inconveniences—they were directly affecting our bottom line.
After months of frustration, I stepped back to clarify what we actually needed:
Most importantly, we wanted to spend our time building features users love, not debugging linking infrastructure.
When we couldn't find a solution that met these needs, we built EZLinks.
Instead of treating it as a technical implementation challenge, we approached it as a user experience problem. We started by defining what a truly seamless experience should feel like, then worked backward to create the technical infrastructure to enable it.
This first-principles approach led to several key design decisions:
We implemented EZLinks in PlaySquares first, and the impact was immediate:
But beyond the metrics, we recovered something more valuable: the ability to focus on building our core product rather than maintaining infrastructure.
While building this solution for ourselves, we realized we weren't alone in our frustration. Every developer we talked to had their own horror stories about implementing universal links or app links.
We're launching EZLinks because we believe creating seamless experiences shouldn't require weeks of specialized work or ongoing maintenance headaches. The technical complexity of linking should be invisible to both developers and users.
By sharing EZLinks, we hope to help other developers avoid the painful journey we experienced, so they can focus on building products their users love rather than debugging infrastructure.