nowCRM - your open source CRM with multichannel outreach capabilities and efficient data management at scale.
nowCRM is the central customer relationship management platform developed by nowtec solutions AG.
It connects several microservices (Strapi, Composer, Journeys, and DAL) into one modular ecosystem.
Licensed under the GNU Affero General Public License v3.0.
Attribution required β see NOTICE.
nowCRM relies on the following core services:
| Service | Description | 
|---|---|
| Strapi | Headless CMS used as the universal data backend, authentication layer, and admin panel. | 
| Composer | Handles content generation, channel dispatch, and AWS SES event ingestion. | 
| Journeys | Manages automated multi-step marketing journeys. | 
| DAL (Data Action Layer) | Orchestrates heavy asynchronous or bulk operations using BullMQ. | 
| nowCRM (Frontend) | The Next.js 15 web interface connecting users to all backend services. | 
Before starting local development, ensure you have:
- Node.js v20+
 - Yarn v1.22+
 - Docker + Docker Compose
 - Redis
 - PostgreSQL
 - Access to the internal Strapi and Composer APIs
 
git clone https://github.com/nowtec/nowCRM.git
cd nowCRMUse the provided .env.sample files for each component to create .env:
| Service | Example file | 
|---|---|
| nowCRM | .env.sample | 
| Composer | composer/.env.example | 
| DAL | dal/.env.example | 
| Strapi | strapi-app/.env.example | 
Example for nowCRM:
NEXT_PUBLIC_API_URL=http://localhost:1337
NEXTAUTH_SECRET=your-secret
NEXT_PUBLIC_STRAPI_URL=http://localhost:1337/api
NEXT_PUBLIC_COMPOSER_URL=http://localhost:3020sudo docker-compose -f docker-compose-dev.yaml up redis strapiEnsure PostgreSQL is available and credentials match your Strapi
.env.
yarn install
yarn devcd composer
yarn build
yarn startUse
yarn buildeven in dev mode due to ESM loader requirements.
cd dal
yarn build
yarn startcd journeys
yarn devDAL uses BullMQ queues backed by Redis.
| Queue | Purpose | 
|---|---|
masssendQueue | 
Defines bulk mailings with throttle intervals and target lists. | 
sendQueue | 
Dispatches individual messages respecting rate limits and retries. | 
masssendQueuecreates jobs for each recipient with delay =index Γ throttleMs.sendQueueprocesses each contact job, sending messages and applying exponential backoff on failure.
Observability:
- Dashboard: [Bull Board / Arena]
 - Metrics: Prometheus + Grafana
 - Alerts: Redis connection checks and queue depth monitors
 
| Route | Description | 
|---|---|
/createReference | 
Generates the base message composition. | 
/createAdditionalResult | 
Adds additional channel-specific content. | 
/createComposition | 
Builds complete multi-channel compositions. | 
All variables are prefixed with COMPOSER_.
Example .env (shortened):
COMPOSER_PORT=3020
COMPOSER_REDIS_HOST=localhost
COMPOSER_STRAPI_API_URL=http://localhost:1337/api/
COMPOSER_OPENAI_API_KEY="sk-..."
COMPOSER_SMTP_HOST="email-smtp.eu-central-1.amazonaws.com"SES β SNS β Webhook β Composer endpoint
https://COMPOSER.customerdomain.com/webhook/ses-event-to-strapi
Manual step: set the configuration set in AWS SES Console.
A private NPM package consolidating Strapi service logic, types, and utilities.
Used by all services to unify data access patterns.
cd shared
yarn build
npm packAlways bump version tags manually in package.json before merging shared updates.
Purpose: Central content hub and backend API for all apps.
- Content types for CRM data
 - API endpoints for entities
 - Admin panel for managing users, lists, and compositions
 - Custom plugins for reporting and forms
 
cd strapi-app
yarn developProduction mode:
yarn build
yarn startPostgreSQL service configured in docker-compose.yaml with:
command: -c 'max_connections=500'
shm_size: 256mbDatabase pool (config/database.js):
pool: { min: 10, max: 500, acquireTimeoutMillis: 60000 }Before pushing:
yarn lint:fix
yarn build- Always use environment variable prefixes (
COMPOSER_,DAL_,STRAPI_, etc.) - Avoid hardcoding API URLs; read from 
.env - Monitor Redis queues actively during development
 - Keep your 
.npmrcconfigured for private package registry access 
Β© 2025 nowtec solutions AG
Licensed under the GNU Affero General Public License v3.0
IMPORTANT: This software is licensed under AGPL-3.0, which means:
- β You can use, modify, and distribute this software freely
 - β You can use it commercially
 β οΈ You MUST provide the source code of any modificationsβ οΈ You MUST disclose your modifications under AGPL-3.0β οΈ You MUST provide source code access to all users if you run it as a network service (SaaS, web application, etc.)β οΈ You MUST retain all copyright and attribution notices
Attribution notice (see NOTICE) must be preserved in all forks, derivative works, and any network-accessible deployments.
If you modify nowCRM and make it available to users over a network (including as a web service, SaaS, or API), you are required to make the complete source code of your modified version available to those users under AGPL-3.0. This is the key difference from standard GPL licenses.
For commercial licensing options that may provide different terms, please contact:
- Website: https://www.nowtec.solutions
 - Email: [email protected]
 
We welcome contributions! By contributing to nowCRM, you agree that your contributions will be licensed under AGPL-3.0.
Please ensure:
- All new files include the appropriate AGPL-3.0 header
 - You have the right to contribute the code
 - Your code follows the project's coding standards
 - You've tested your changes thoroughly
 
For questions, issues, or support:
- GitHub Issues: https://github.com/nowtec/nowCRM/issues
 - Documentation: https://github.com/nowtec/nowCRM