Case Study: Dover
- Industry: B2B SaaS, Recruiting
- Team Size: 30
- Airplane Usage: 200+ runs / week
Dover is a platform to help companies simplify and scale up their recruiting processes. Today, Dover has 100+ customers. They are backed by Y Combinator and Founders Fund. They use Airplane as their primary internal tooling platform.
Hypergrowth led to a need for internal tools
Over the past year, Dover has grown over 10x in headcount, revenue, and customer base, and their internal tooling needs have grown in lockstep. Early on, Dover's founders and early engineers did everything themselves, but over the past year they've hired over 20 people in customer operations and engagement roles. These teams do a significant amount of work to onboard customers, spin up new roles, and answer reactive support questions. A lot of this work requires reading and writing customer data, integrating Dover's platform with the customer's other SaaS tools, and many other sensitive operations.
When the first customer-facing people were hired, Dover had no internal tooling in place, and every intervention required them to escalate to the engineering team. Customer onboarding in particular was an intensive process. They needed to import data from the customer's applicant tracking systems, integrate Dover with the customer's email accounts, collect data about the role they were recruiting for, and much more. The engineering team had written several Python scripts for most of these operations as a way to avoid having to invest significant time and effort into self-serve internal tooling.
This initially wasn't too hard–the eng team was getting interrupted a few times per week to run these scripts. But Dover went through a period of hypergrowth, and a few interrupts a week became dozens of pings per day. They realized they needed to invest into internal tools quickly.
Django Admin and Retool fell short
As a company built on Django, Dover first tried using Django Admin for their tooling needs. They made some progress, but ran into several limitations:
- Poor UI/UX: The customer ops team had difficulty navigating the admin dashboards that Dover's eng team had built. It was difficult to work with Django Admin to provide a high-quality end-user experience.
- Middling developer experience: Django Admin's main advantage is that it integrated directly with their models. However, it still took significant effort to create admin dashboards for anything more complicated than simple CRUD operations.
- Difficult-to-use permissions: It was difficult for them to configure Django Admin to have granular role-based access controls. While it's technically possible, they had trouble getting things exactly right.
- Lack of support for service-oriented architecture: As Dover split their monolith into distinct services, it was very difficult to have a single instance of Django Admin that sat on top of everything.
They decided next to try Retool. While Retool addressed some of these problems, they still ran into several issues:
- Heavyweight: They felt forced to port over everything into Retool at once–it didn't make sense to have a customer dashboard that was split between Django Admin and Retool.
- Lack of support for long-running operations: Some of Dover's operational tasks, like importing data, can take several minutes or longer. Retool had aggressive API timeouts that made it impossible to execute these.
- Lack of flexibility: Retool required the Dover team to implement GraphQL endpoints for every operation they wanted to execute. It would have taken significant effort to port over the Python scripts that they were currently using for many of these operations.
Finally, they settled on the least-bad course of option: they decided to build the bespoke internal tooling they needed in-house. Just when they were about to begin that project, however, they discovered Airplane.
The solution: Airplane
Airplane solved the problems Dover had with Django Admin and Retool.
- Support for scripts: For many of Dover's operational tasks, it would have taken significant work to port their Python scripts into REST endpoints that other tooling platforms were compatible with. By contrast, they could get new Airplane tasks up and running in minutes.
- Support for long-running and resource-intensive tasks: Airplane was the only platform that allowed the team to kick off a minutes-long or hours-long operation and get notified when it was complete. Airplane also allowed Dover to set resource and concurrency limits so that these operations would be run safely.
- Fast time-to-value: In just a few minutes after signing up, they created their first 2 Airplane tasks by adapting a couple Python scripts they already had that represented 2 of the more frequent operations that the eng team had to get involved with. In the next week, they immediately started seeing value as the customer ops team ran these operations through Airplane rather than pinging the eng team. After that initial success, Dover invested more heavily in Airplane and added several more operations.
- Incremental adoption over time: Dover didn't have to port everything over all at once or build out heavyweight internal dashboards. They were able to add 1-2 new tasks every week in minutes of work each time. This minimized the risk of adopting a new platform.
Today, Dover's team runs over 200 tasks in Airplane every week and usage is continuing to grow. "Airplane has been a game-changer for us–we would have had to invest a significant amount of our product roadmap over the last few months into tooling if it hadn't been for Airplane. Our eng team has moved faster and our customer ops teams are happier and more empowered because of Airplane."