Back to Blog
ERPArchitectureEngineering

Building an ERP for 1M+ Customers: Lessons from the Ground Up

How I architected and shipped a company-wide ERP platform from zero — covering 9 departments, replacing all manual operations, and scaling to serve over a million customers.

BA
Bilal Adhi
Technical Manager
December 10, 2024
5 min read

When I joined eZhire as Technical Manager in 2020, the company ran on spreadsheets.

Not legacy ERP spreadsheets — I mean actual Google Sheets for finance, manual WhatsApp messages for operations, disconnected CRM tools for sales, and zero visibility for leadership. A company serving hundreds of thousands of customers in the UAE, running on copy-paste and hope.

This is the story of how we built a company-wide ERP from scratch. What I learned, what I'd do differently, and what actually worked.

The Problem Was Bigger Than Anyone Admitted

The first thing you learn as a new Technical Manager is that the real problem is never the one described in the JD.

In our case, the stated problem was "we need better tooling." The real problem was organizational chaos at scale. Each department had invented its own system:

  • Finance was reconciling bookings manually every night
  • FinOps had no real-time view of outstanding balances
  • Collections was using phone calls and spreadsheets to chase payments
  • HR had no leave tracking system
  • Customer Support had no ticketing or SLA management

The company was scaling fast. 400+ bookings per day. 2,000 concurrent rentals. And the operational overhead was growing faster than the business.

Why We Built, Not Bought

The obvious answer is "buy an ERP." SAP, Oracle, NetSuite.

We actually went with Oracle NetSuite for finance and accounting — and that was the right call. But NetSuite doesn't solve your CRM, your collections workflow, your customer support ticketing, your QA evaluation, or your HR leave management.

The real question was: what do you build vs integrate?

Our framework:

  1. Buy commodity infrastructure (accounting, payments, communication)
  2. Integrate best-of-breed tools where they exist (HubSpot for CRM, Ziwo for calls)
  3. Build everything specific to our business logic and operational flows

The ERP we built wasn't trying to replace NetSuite. It was the connective tissue that made all these tools work together — with our business rules, our workflows, and our people's actual needs at the center.

Architecture Decisions That Mattered

Modular from Day One

We built the ERP as a set of independent modules with a shared data layer. This sounds obvious in retrospect, but the temptation early on was to build one monolith and ship fast.

Modular architecture meant:

  • Teams could work on Finance while Support was in design
  • We could deploy Recovery Management without touching HR
  • Module failures were contained, not cascading

API-First Design

Every module exposes APIs. This wasn't for external consumption — it was a discipline to ensure modules communicated cleanly rather than sharing databases directly.

When we later needed to build mobile interfaces for field operations, this decision paid off immediately.

Event-Driven Sync

NetSuite sync is the most critical integration in the system. A booking creates a revenue event. A return creates a settlement event. A delinquent payment triggers the recovery workflow.

We built an event bus that coordinates these flows asynchronously. This decouples the ERP from NetSuite's availability and allows us to retry failed syncs without manual intervention.

BigQuery for Analytics

All operational data flows into BigQuery nightly. This was a deliberate choice to avoid building reporting directly into the ERP's operational database.

The executive dashboards, finance reports, and collection analytics all run against BigQuery — which means the operational system stays fast, and reporting can be as complex as needed.

The Rollout Strategy

You don't migrate a company to a new system overnight.

We rolled out module by module, starting with the lowest-risk, highest-visibility wins:

Phase 1 — HR Leave Management Low complexity. High visibility. Every employee would use it. This built confidence in the platform.

Phase 2 — Customer Support Ticketing The support team was drowning in unstructured requests. A proper ticketing system with SLA tracking transformed their operations in weeks.

Phase 3 — Collections & Recovery This was the highest-stakes module. We ran the old spreadsheet process and the new system in parallel for 30 days before cutting over.

Phase 4 — Finance & NetSuite Integration We partnered deeply with the Finance team. Every mapping, every reconciliation rule, every edge case was documented before a single line of code was written.

Phase 5 — CRM & Lead Management Integrated HubSpot with our internal lead sources to create a unified pipeline view.

By the time we finished Phase 5, 9 departments were running on the ERP. Zero spreadsheets.

What I'd Do Differently

Start with data modeling. We refactored our customer entity three times because we didn't think deeply enough about what "customer" meant across all modules. A week of data modeling upfront would have saved months.

Invest in internal API documentation earlier. When we started building mobile interfaces for field operations, we had to reverse-engineer our own APIs. That's a sign you didn't treat your internal APIs seriously enough.

User testing isn't optional, even for internal tools. The Finance team used our reporting module completely differently than we'd designed it. We only discovered this during the rollout.

The Results

After 4 years of continuous development:

  • 9 departments fully onboarded
  • 85%+ collections recovery within 3 months (up from untracked)
  • Finance reconciliation time reduced from hours to minutes
  • Customer support SLA compliance went from unknown to measured and enforced
  • Executive leadership has real-time dashboards for the first time

The ERP is now mission-critical infrastructure. It processes every booking, every payment, every support ticket, every leave request, and every collections workflow at eZhire.

Building it was the hardest engineering challenge I've led. It was also the most impactful.


Questions? I'm always happy to talk architecture, ERP decisions, or engineering leadership. Find me on LinkedIn or drop me an email.