How migrating to Frappe HR streamlined our recruitment process
For years, Recruitee served us well. As a modern SaaS ATS, it gave our HR team the tools to manage applications, schedule interviews, and track candidate progress through customizable pipelines.
But as our organization matured, so did our needs.
We began consolidating our internal tools under a single, open-source ERP, powered by the Frappe Framework. This shift was about more than cost-cutting. It was about owning our data, eliminating platform silos, and simplifying operations across teams.
Recruitment was one of the final frontiers. And while Recruitee’s features were polished, they lived outside the ecosystem we were actively investing in. We started looking into Recruitee alternatives that aligned better with our open-source vision, and Frappe HR stood out as a viable, self-hosted option.
It was time to bring hiring home.
How we preserved and mapped our legacy hiring data
Before we could even think about migrating to Frappe HR, we had one clear priority: preserve our historical recruitment data, completely and accurately. Maintaining continuity and context was critical for both reporting and ongoing hiring decisions.
We started by exporting all legacy data from Recruitee. But rather than jumping straight into mapping, we took a more strategic approach: we created a full, accessible snapshot of the data first.
To do this, we used MongoDB as an intermediate storage layer. Its schema-less structure was ideal for handling the nested, loosely structured data exported from Recruitee. This gave us the flexibility to ingest everything without worrying about predefined schemas.
Here’s what we pulled in:
- 40+ job postings
- 25,000+ applicant records, including resumes, comments, and activity logs
- 1,000+ interview records with outcomes and timestamps
With the data secured, our team could freely analyze the raw structure and design an informed mapping strategy, one based not on assumptions, but on the actual shape and quality of the dataset. This gave us a strong foundation for a reliable, context-aware migration.
Building the “Careers” app: Customizing Frappe HR for real-world hiring
Once the data was mapped to Frappe HR, we didn’t stop at just plugging it into existing fields, we tailored the system to mirror the flexibility and granularity our team was used to in Recruitee.
That meant:
- Adding a few missing fields relevant to our internal workflows
- Making minor tweaks to the default recruitment process
- Most importantly, introducing support for customizable hiring pipelines
One major gap we had to address: Frappe HR didn’t natively support job-specific hiring workflows. In Recruitee, each role could have a distinct sequence of stages—something our recruiters relied on heavily. To replicate that flexibility, we built a child table within the Job Opening DocType, enabling custom definitions for:
- Hiring stages
- Assignment logic
- Automated notifications
- Email triggers
With this in place, we engineered a streamlined, automated workflow: applicant statuses update dynamically, team members are notified at the right moments, and communication is triggered without delay.
To ensure long-term maintainability and keep our core modules untouched, we packaged all enhancements into a separate Frappe Framework app, appropriately named Careers. It now powers our end-to-end recruitment flow, fully aligned with our real-world hiring needs and built to evolve as we grow. This kind of modularity is a standout feature of the Frappe Framework, as seen in many Frappe Framework examples used across industries.
Executing a smooth migration with zero downtime
With our Careers app ready and data mapped, the next step was executing a clean, controlled migration into our Frappe ERP instance.
To streamline this, we wrote a set of custom bench commands that imported records directly from MongoDB. These commands were thoughtfully designed to include a --dry-run
flag, allowing us to preview the results before committing any data—catching potential issues early and minimizing risk.
Before running the live import, we followed two critical precautionary steps:
- Took a full database backup for rollback safety
- Disabled the email queue to prevent accidental notifications mid-migration
What made this process remarkably smooth was Frappe’s ability to run these operations without disrupting day-to-day ERP usage. We intentionally skipped maintenance mode, allowing internal teams to continue their work while the migration ran quietly in the background.
Once complete, we validated the success of the migration in two ways:
- Random sampling of imported records to verify data accuracy
- Simulated job applications to test the end-to-end flow from application to notifications, ensuring all workflows and automations were functioning as intended
The result? A zero-downtime, error-free transition that empowered our HR team to hit the ground running in Frappe HR, without missing a beat.
Key takeaways from moving to an open-source hiring platform
This wasn’t merely a cost-cutting exercise, it was a strategic leap toward platform unification, full data ownership, and operational clarity. By moving recruitment into our Frappe-based ERP, we’ve brought everything, from job creation to interview tracking, into a single, tightly integrated system.
Our HR team no longer juggles platforms or depends on external tools. Instead, they operate within a centralized, open-source ecosystem that offers greater flexibility, improved reporting, and long-term sustainability.
This migration didn’t just simplify hiring. It set the foundation for deeper automation, better cross-team collaboration, and a future where more internal workflows live under one roof, on our terms.
On this page
Leave a Reply