At ZOLA Electric, our mission is to bring reliable, affordable, and clean power anywhere in the world .In 2025, we embarked on developing a specialized CRM platform to empower our integrator customers who market and deliver ZOLA solutions across the Global South. While numerous enterprise CRM solutions exist, they typically carry high per-user licensing costs and complex feature sets that make them impractical for our partners operating in emerging markets. These partners require streamlined tools that align with their business models and local market dynamics. Understanding these unique needs, we decided to build a purpose-built CRM that would be both cost-effective and specifically tailored to the workflows of selling and deploying ZOLA solutions in these diverse regions.
The Central Technology Stack Decisions
Historically, Ruby on Rails (RoR) was our technology stack of choice for over a decade. With its 20-year history, extensive package ecosystem (gems), and established patterns for building full-stack web applications, RoR remains a solid choice. However, before starting this new project, we decided to evaluate it against its more recent but increasingly popular competitor: Node.js.
Our comparison revealed distinct strengths in both frameworks. RoR demonstrated superior conventions over configuration, better code cleanliness and maintainability, and mature unit testing frameworks. These attributes, combined with its overall stack maturity, initially suggested faster development speed. Node.js, however, proved stronger in several crucial areas: application performance, community size and popularity, type safety, scalability, AI code assistance tool integration, and functional programming packages. After careful consideration of these factors, we chose Node.js, and this decision has proven successful.
To address Node.js’s relative weaknesses compared to RoR, we made several strategic decisions. First, we had to accept that Node.js would require more explicit configuration compared to RoR’s convention-based approach. To maintain code quality without RoR’s built-in conventions, we implemented SonarCube to monitor for and suggest fixes to potential code issues. With these foundational decisions made, we then selected our specific frameworks.
For our backend stack, we built on Node.js with TypeScript to ensure type safety, incorporating Prisma as our ORM for its modern features. We implemented Apollo Server for GraphQL APIs, used BullMQ for background job processing, and established a testing framework combining Jest, JestPrisma, and PrismaFabricca. On the frontend, we chose Next.js with app router, paired with Apollo Client for API interactions and the Material UI component library.
The Impact of AI Development Tools
Having used RubyMine as my primary IDE for seven years, the emergence of generative AI prompted us to reevaluate our development environment. While ChatGPT and GitHub Copilot are well-known, our evaluation found Claude (specifically the claude-3.5-sonnet model) and Cursor IDE to be superior choices. Cursor, which uses Claude by default, proved particularly effective for several reasons:
- Superior code quality compared to alternatives
- AI-first development environment with ready-to-use prompt panel
- Smart code generation and modification capabilities (for example, generating complete form components with specific fields and controllers using a single prompt)
- Efficient pattern recognition within existing codebases
- Agentic development mode, increasing range of tasks addressable by AI
At the same price as GitHub Copilot, Cursor offers significantly more value. We later upgraded to their corporate plan to ensure project privacy and prevent our codebase from being used for model training.
Of course, while AI tools dramatically increase development speed, they should be viewed as copilots rather than captains. Engineers must maintain responsibility for application design, architecture decisions, and code organization. The AI’s current limitations mean it might generate excessively long components or create repetitive code patterns if left unchecked. Our role as engineers remains crucial in ensuring code readability, maintainability, and optimal component structure.
The integration of AI tools has transformed our development process in remarkable ways. Tasks that once took hours, such as creating screens with tables or forms, now require only minutes. Backend function implementation has been streamlined through pattern recognition, with AI able to autocomplete entire functions based on existing codebase examples. This acceleration has reduced overall development time by roughly 80%, allowing us to deliver products to market faster with a smaller engineering team.
Challenges and Solutions
The transition to Node.js presented its greatest challenge in unit testing. While RoR provides robust frameworks like RSpec and FactoryBot out of the box, achieving equivalent functionality in Node.js required significant effort. We implemented Jest-Prisma to handle database management and added Jest-Fabricca for ORM factories and relationships. Though we encountered some documentation gaps in JavaScript/TypeScript configuration, the resulting setup, combined with AI integration, has made our testing process both efficient and comprehensive.
Our technology choices have proven successful, and we look forward to providing our integrator customers worldwide with a custom CRM experience that enhances their ability to sell ZOLA products to diverse end consumers.