Introduction

erxes is a self-hosted, source-available Experience Operating System (XOS) that combines customer data, marketing, sales, operations, and support in one platform. It is developed as a single Nx-powered pnpm monorepo that you extend through plugins.

Choose your starting point

What can you do with erxes?

The core platform provides shared capabilities such as contacts, products, properties, segments, documents, automations, and permissions. Plugins add business-specific functionality. The Community Edition includes backend plugins for sales, operations, frontline customer service, content management, and POS (posclient); further plugins are part of the Enterprise Edition, licensed separately.

As a developer, you can:

  • Extend the platform with backend services and frontend plugins.
  • Integrate applications through GraphQL and published service interfaces.
  • Build customer-facing experiences with the client portal, help center, and widgets.
  • Self-host an installation and manage its infrastructure and data, subject to the repository's license terms.

How the parts work together

The Core UI is the browser entry point. It loads plugin UI modules through Module Federation and sends GraphQL requests to the gateway. Plugin UIs extend navigation and feature screens while reusing the platform's public UI libraries.

On the backend, Core API and plugin APIs register their addresses and configuration in Redis. The gateway composes their GraphQL schemas for Apollo Router and exposes a federated /graphql endpoint. Service-to-service calls use tRPC procedures defined by the module that provides them. Backend model creation uses the request subdomain to select the tenant's data.

Redis also supports queues and subscriptions. Background services such as automations and logs need their own running processes when those features are used. An enabled plugin name selects projects or services for discovery; it does not provision production containers or external integrations.

Standalone apps such as widgets and the client portal have separate builds and deployment configuration. In production, Core API returns plugin asset URLs hosted at plugins.erxes.io, so not all browser assets come from your own host; see Deployment.

Technology stack

The toolchain versions below are declared in the root manifest and lockfile.

AreaVersion
Package managerpnpm 9.12.3 (required, packageManager field)
Build systemNx 20.0.8 with caching and task orchestration
RuntimeNode.js 22 in CI
LanguageTypeScript 5.7.3

Backend

The gateway (port 4000) runs Apollo Router in front of Core API (port 3300) and one Express service per enabled plugin API.

        API Gateway (port 4000)
     Apollo Router + service discovery
                  |
    ┌─────────────┼─────────────┐
    ▼             ▼             ▼
 Core API     Plugin APIs   Background
 (3300)       (3303+)       services (3301-3302)
    └─────────────┼─────────────┘
                  ▼
        MongoDB + Redis/BullMQ
  • Framework: Express 4 with Apollo Server v4 and Apollo Federation (@apollo/subgraph)
  • Service calls: tRPC v11 for type-safe service-to-service procedures
  • Database: MongoDB via Mongoose 8.13.2
  • Cache and queues: Redis (ioredis 5) and BullMQ 5
  • Real-time: GraphQL subscriptions over graphql-redis-subscriptions
  • Authentication: JWT (jsonwebtoken) and WorkOS SSO

Frontend

The Core UI host (port 3001) loads each enabled *_ui remote through Module Federation. Plugin remotes use development ports 3002-3011.

  • Framework: React 18.3.1 with React Router v7
  • Bundler: Rspack 1.0.5 with @module-federation/enhanced 0.6.6
  • Styling: Tailwind CSS v4 + PostCSS
  • UI: erxes-ui, the Radix-based design system, and ui-modules for reusable business UI
  • State: Jotai + Apollo Client; React Hook Form + Zod; react-i18next

Standalone apps

Apps under apps/ carry their own dependencies; the React 18 version above applies to the main frontend only.

AppStackDev port
client-portal-templateNext.js 16.0.3, React 193800
help-centerNext.js 16.3.2, React 193900
posclient-frontNext.js 14, React 18, PWA7002
frontline-widgetsRspack bundle (chat, forms)n/a

Repository structure

The main development areas; Repository Structure has the full map with per-plugin ports.

erxes/
├── backend/                  # Backend microservices
│   ├── gateway/             # API gateway + Apollo Router (4000)
│   ├── core-api/            # Core business logic (3300)
│   ├── erxes-api-shared/    # Shared library for all services
│   ├── plugins/             # Plugin APIs (*_api, ports 3303+)
│   ├── services/            # Background services (automations, logs)
│   └── saas-migrations/     # Standalone migration scripts
├── frontend/
│   ├── core-ui/             # Module Federation host (3001)
│   ├── libs/                # erxes-ui + ui-modules
│   └── plugins/             # Plugin remotes (*_ui, ports 3002-3011)
├── apps/                    # Standalone apps (portal, help center, POS, widgets)
├── scripts/                 # create-plugin, start-api-dev, start-ui-dev
└── cloudflare/mail-worker/  # Inbound email routing worker

Source code and community

The product source is on GitHub. Read the repository's contribution guide before changing core or plugin code.

Join the erxes Discord to ask development questions, discuss integrations, and share your work with the community.

Licensing and deployment

erxes is source-available. The repository's LICENSE.md contains AGPLv3 provisions, references separate Enterprise Edition terms, and states that erxes may not be hosted as a SaaS product that competes with erxes Inc. Third-party components retain their respective licenses.

Self-hosting, modifying, and distributing erxes remain subject to those terms; source availability does not mean every plugin or commercial deployment is unrestricted.

For hosted offerings, Enterprise options, and pricing, see erxes. When self-hosting, your team is responsible for deployment, upgrades, backups, and ongoing infrastructure maintenance.

Was this helpful?