A full-stack web application for synchronizing customer and organization data between Zendesk (Helpdesk) and ConnectWise (CRM) systems.
- SyncModule: Orchestrates sync logic, triggers, and status
- MappingModule: Stores ID relationships between systems
- AdaptersModule: Contains ZendeskAdapter and ConnectWiseAdapter
- FuzzyMatchService: Compares records using name, email, phone, org with scoring
- ConflictResolverService: Handles user overrides vs. default source-of-truth logic
- FieldMappingService: Manages field-level logic and applies conversion rules
- AuthModule: JWT-based login/authentication
- Dashboard: Last sync time, active jobs, manual sync trigger
- Conflicts View: Shows record mismatches and lets user select the winning system
- Fuzzy Match Review: Suggests possible matches for unmapped records
- Field Mapping Editor: Shows CRM + Helpdesk fields side-by-side with conversion rules
- Mapping Overview: Displays existing Customer & Org mappings
- CustomerMapping, OrganizationMapping
- FieldDefinition, FieldMapping
- LookupTable, LookupValue
- User, SyncLog
- Node.js 18+
- Docker & Docker Compose
- PostgreSQL (if running locally)
- Clone and install dependencies
git clone <repository-url>
cd syncbridge
npm install- Set up environment variables
cp .env.example .env
# Edit .env with your configuration- Start with Docker Compose
npm run docker:up- Or run locally
# Start database
docker run -d --name postgres -e POSTGRES_PASSWORD=password -p 5432:5432 postgres:15
# Install backend dependencies
cd backend && npm install
# Install frontend dependencies
cd ../frontend && npm install
# Start both services
cd .. && npm run dev- Frontend: http://localhost:5173
- Backend API: http://localhost:3000
- Database: localhost:5432
DB_HOST: PostgreSQL host (default: localhost)DB_PORT: PostgreSQL port (default: 5432)DB_USERNAME: Database usernameDB_PASSWORD: Database passwordDB_NAME: Database name
JWT_SECRET: Secret key for JWT tokens
CONNECTWISE_API_URL: ConnectWise API endpointCONNECTWISE_COMPANY_ID: Your company identifierCONNECTWISE_PUBLIC_KEY: API public keyCONNECTWISE_PRIVATE_KEY: API private key
ZENDESK_SUBDOMAIN: Your Zendesk subdomainZENDESK_EMAIL: Admin email for API accessZENDESK_API_TOKEN: API token for authentication
- Fuzzy Matching: Automatically matches records using name, email, phone, organization
- Conflict Resolution: User can override which system wins for specific fields
- Persistent Mappings: Stores relationships between CRM and Helpdesk IDs
- Field Transformation: Supports conversion rules (toUpperCase, trim, dateFormat, etc.)
- Lookup Tables: Value mapping for different field formats between systems
- JWT-based authentication with bcrypt password hashing
- Protected API endpoints with middleware
- Environment-based configuration
- Docker secrets support
- Comprehensive sync logging
- Real-time status dashboard
- Conflict detection and resolution tracking
- Manual sync triggers
syncbridge/
├── backend/ # NestJS API
│ ├── src/
│ │ ├── auth/ # Authentication module
│ │ ├── sync/ # Sync orchestration
│ │ ├── mapping/ # ID relationship management
│ │ ├── adapters/ # External system adapters
│ │ ├── field-mapping/ # Field transformation logic
│ │ └── database/ # Entities and database config
│ └── Dockerfile
├── frontend/ # React application
│ ├── src/
│ │ ├── components/ # Reusable UI components
│ │ ├── pages/ # Application pages
│ │ ├── stores/ # State management
│ │ └── lib/ # Utilities and API client
│ └── Dockerfile
├── docker-compose.yml # Multi-container setup
└── README.md
npm run dev: Start both backend and frontend in developmentnpm run build: Build both applicationsnpm run test: Run all testsnpm run docker:up: Start with Docker Composenpm run docker:down: Stop Docker containers
npm run start:dev: Start in development mode with hot reloadnpm run build: Build for productionnpm run test: Run unit testsnpm run migration:generate: Generate database migrationnpm run migration:run: Run pending migrations
npm run dev: Start development servernpm run build: Build for productionnpm run preview: Preview production build
POST /auth/login: User login
POST /sync/manual: Trigger manual syncGET /sync/status: Get sync status and recent logs
GET /mappings/customers: Get customer mappingsGET /mappings/organizations: Get organization mappingsPOST /mappings/customers: Create customer mappingPUT /mappings/customers/:id: Update customer mapping
GET /field-mappings: Get field mappingsPOST /field-mappings: Create field mappingGET /field-mappings/definitions: Get field definitionsGET /field-mappings/lookup-tables: Get lookup tables
This is a scaffold implementation with:
- ✅ Complete architecture and folder structure
- ✅ Database models and relationships
- ✅ REST API endpoints
- ✅ Admin UI with all required views
- ✅ Authentication and security
- ✅ Docker deployment setup
TODO for production:
- Implement actual API calls in adapters (currently stubbed)
- Add comprehensive error handling
- Implement real-time sync status updates
- Add data validation and sanitization
- Set up monitoring and logging
- Add comprehensive test coverage
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests if applicable
- Submit a pull request
This project is licensed under the MIT License.