Salsa Candela is a dance school company operating across 5 branches in Mexico City. Over the past two years, I built a comprehensive administrative platform from scratch that centralizes their entire operation: enrollments, payments, attendance tracking, teacher scheduling, party event management, and business reporting.

Before this system, the business relied on manual processes, spreadsheets, and disconnected tools to manage hundreds of students across multiple locations and payment channels. This project replaced all of that with a single, unified platform.

You can visit the live admin system, explore the GitHub repository, or watch the video walkthrough.

Project Overview & Business Context

Salsa Candela has been teaching salsa and bachata for over 12 years across 5 locations in Mexico City: Xola, Valle, Satélite, Clavería, and Coapa. With 4 dance programs, multiple payment channels, recurring party events, and dozens of teachers, the administrative complexity was growing faster than the business could handle manually.

I designed and built this system from scratch using Express.js, MongoDB, and EJS over two years of active development, accumulating over 1,094 commits. The platform serves as the operational backbone of the entire business.

Administrative dashboard showing the main navigation with class, party, and private lesson management options

The main dashboard provides centralized access to all business operations across 5 branches

Core Value Delivered

  • For business owners: Centralized management of all 5 branches from one dashboard, real-time sales reporting, automated commission tracking, and teacher scheduling with conflict prevention
  • For customers: Online class enrollment and payment via Stripe, instant email confirmation with QR code for class access, multiple payment options, and self-check-in at class start
  • For operations: Automated database maintenance, weekly backups, curriculum progress tracking, and comprehensive reporting across all channels

The Business Challenge

Running a multi-branch dance school means juggling many moving parts simultaneously. Before this system, each of these processes was handled manually or through disconnected tools, leading to inefficiencies, errors, and missed revenue opportunities.

Key Pain Points

  • Enrollment chaos: Managing registrations across 5 branches, 4 dance programs, and multiple payment channels with no unified system
  • Attendance blind spots: No reliable way to track which students actually attended classes versus those who just enrolled
  • Scheduling conflicts: Coordinating teacher assignments across branches without accidentally double-booking instructors
  • Revenue tracking gaps: Sales coming in through cash, card, bank transfer, Stripe, and CoDi with no consolidated reporting
  • Commission disputes: Calculating referral commissions for sales partners with no automated tracking system
  • Data silos: Customer records scattered across spreadsheets and paper forms with no single source of truth
Illustration showing the complexity of managing 5 branches with multiple programs and payment channels

Managing 5 branches, 4 dance programs, and multiple payment channels required a unified administrative platform

The goal was clear: build a single platform that replaces 5+ separate tools and gives the business complete visibility into every aspect of their operation.

Key Features

The system encompasses seven major feature areas, each designed to address a specific operational need. Together, they form a complete business management platform tailored to Salsa Candela's specific workflows.

1. Multi-Channel Sales System

One of the most important requirements was supporting every way a customer might want to pay. The system handles 4 distinct sales channels for both classes and party events:

  • Online (Stripe): Customers purchase via credit or debit card on the web, with instant confirmation
  • In-person at branches: Staff register sales at any of the 5 locations using cash, card, or bank transfer
  • At-the-door (parties): Staff sell tickets at the event venue on the night of the party
  • CoDi mobile payments: Mexico's real-time payment system with QR code and push notification flows, offering zero transaction fees

No sale is missed regardless of how the customer wants to pay. Each channel has its own dedicated workflow but feeds into unified reporting.

Sales interface showing the different payment channel options for class enrollment

Four distinct sales channels ensure no customer is turned away due to payment limitations

2. Group Class Management

The class management module handles the complete lifecycle of dance courses across all branches, from enrollment to attendance tracking and curriculum progress.

  • 4 dance programs: Salsa (9 levels), Bachata (5 levels), Salsa+Bachata combo, and Movimiento Corporal (body movement)
  • 5 branch locations: Each with different schedules for weekday evenings and weekend mornings
  • Flexible pricing: Individual and couple packages with 6 discount tiers (20%-50%) via secure tokens
  • QR-based access control: Every purchase generates a QR code that is scanned at class entry for attendance verification
  • Self-check-in: Students can register attendance at the start of class, subject to admin approval
Class management interface showing enrollment records, QR codes, and attendance tracking

Complete class lifecycle management from enrollment through attendance tracking

3. Party Event Management

Salsa Candela hosts recurring dance party events that serve as both a revenue stream and a community-building tool. The system manages every aspect of these events.

  • Ticket types: Pre-sale tickets ($100 MXN) and at-the-door tickets ($150 MXN) with separate tracking
  • Referral tracking: Commission-based sales through referral codes, with automated commission calculation
  • Bar management: Stripe-powered drink ordering system for bar sales at party events
  • CoDi payments: QR and push payment support for ticket purchases at events
Party event management showing ticket sales, referral tracking, and bar order management

Party events are managed end-to-end: from pre-sale tickets to bar orders and commission tracking

4. Teacher Assignment System

Coordinating dozens of teachers across 5 branches is one of the most complex operational challenges. The system implements a proposal-and-approval workflow with automatic conflict detection.

  • Proposal workflow: Branch managers propose teacher-class assignments, the system validates for conflicts, and the CEO reviews, approves, or rejects
  • Conflict prevention: Automatic validation ensures no teacher is double-booked at the same time and teachers stay at the same branch for the entire day
  • Group management: Supports group fusion (merging small groups), group breaking (splitting by skill level), and group deletion with automatic student transfer
  • CSV export: Approved assignments can be exported for scheduling distribution
Teacher assignment interface showing the proposal and approval workflow with conflict detection

The proposal-and-approval workflow prevents scheduling conflicts across branches

5. Comprehensive Reporting

With sales flowing in through multiple channels, consolidated reporting is essential for business decision-making. The system provides detailed reports across every dimension of the business.

  • Sales reports: Separate reports for every channel (pre-sale, Stripe, CoDi, ticket office, bar, mobile app) with date range and employee filters
  • Payment method totals: Automatic calculation of totals by payment method (cash, card, transfer, check-in, OXXO)
  • Commission reports: Track referral commissions for both class and party sales partners
  • Consolidated views: Combined reports aggregating data across all channels for a complete business picture
  • CSV export: All report views support CSV export via DataTables for further analysis
Reporting dashboard showing sales data across multiple channels with filtering and export options

Consolidated reporting provides a complete view of sales across all channels and payment methods

6. Automated Email Confirmations

Every purchase triggers a branded HTML email that serves as both a confirmation and an access pass. The email system was designed to reinforce the brand and cross-promote other offerings.

  • Purchase confirmations: Branded emails for every class and party purchase, including course details, schedule, and location
  • QR access codes: Each email includes a unique QR code that students scan at class entry for attendance tracking
  • Cross-promotion: Salsa emails promote Bachata classes and vice versa; all emails include party event invitations
  • Feedback surveys: Automated post-course and post-party survey emails to collect student feedback
  • MJML templates: 5 email templates built with MJML for cross-client compatibility across all email providers
Branded email confirmation showing course details, QR code, and cross-promotion sections

Branded confirmation emails include QR access codes and cross-promote other dance programs

7. Automated Maintenance

Running a production system with thousands of records requires ongoing maintenance. I automated the most critical tasks using GitHub Actions on scheduled workflows.

  • Weekly database cleanup: Removes incomplete Stripe transactions (abandoned carts) every Monday to keep the database clean
  • Weekly backups: Compressed archives of all MongoDB collections, retaining the 4 most recent backups
  • Soft-delete cleanup: Permanently removes class groups that were deleted 14+ days ago, allowing time for recovery if needed

These automations run reliably without any manual intervention, ensuring the system stays healthy and performant as the data grows.

Design & User Experience

The design reflects the Salsa Candela brand: dark, energetic, and nightlife-inspired. The visual identity was built around warm orange gradients evoking "Candela" (fire) against dark navy backgrounds, with glassmorphism effects for a modern, polished feel.

Two Visual Modes

The system operates in two distinct visual contexts, each optimized for its audience:

  • Public-facing pages: Dark backgrounds, white text, orange accents, and glassmorphism effects that match the dance school's nightlife brand
  • Admin pages: White navigation, light forms and tables, and functional data-oriented layouts optimized for daily operational use
Public-facing enrollment page with dark background, orange gradients, and glassmorphism effects

Public-facing pages use the brand's dark, energetic aesthetic with glassmorphism effects

Color-Coded Categories

The dashboard uses color coding to help staff quickly navigate between different areas of the system:

  • Purple: Group classes (Clases)
  • Pink: Party events (Fiesta)
  • Teal: Private lessons (Particulares)
  • Orange: Account and default actions
Admin dashboard showing color-coded category cards for classes, parties, and private lessons

Color-coded dashboard cards help staff navigate quickly between operational areas

Customer Journey

From the customer's perspective, the system provides a smooth enrollment experience:

  1. Customer visits the enrollment page or scans a referral link
  2. Selects course type, branch, schedule, level, and package (individual or couple)
  3. Pays via Stripe online or in-person at a branch
  4. Receives a branded confirmation email with QR code
  5. Scans QR at each class for attendance tracking
  6. Receives a feedback survey email after the course ends

Technology Stack

The technology choices were driven by the need for reliability, speed of development, and long-term maintainability. Every component was selected to serve the specific needs of a multi-branch business management platform.

Core Technologies

  • Backend: Node.js with Express.js framework
  • Frontend: EJS templating with vanilla JavaScript
  • Database: MongoDB with Mongoose ODM (16 collections) + Supabase for mobile app
  • Payments: Stripe for credit/debit cards + CoDi for Mexico's real-time bank transfers
  • Authentication: Passport.js with bcryptjs password hashing and role-based access control
  • Email: Nodemailer with MJML email templates
  • Analytics: PostHog + Google Tag Manager
  • Hosting: Railway (cloud) at admin.salsa-candela.com
  • Automation: GitHub Actions for scheduled maintenance tasks
  • Testing: Jest with Supertest

Security Measures

Handling payment data and personal information for hundreds of students requires robust security. The system implements multiple layers of protection:

  • Authentication: Passport.js sessions with 30-day cookies stored in MongoDB
  • Role-based access: Three permission levels (Admin, Manager, Staff) controlling what each user can see and do
  • Rate limiting: express-rate-limit prevents brute force attacks
  • CORS whitelist: Only allowed domains can make requests
  • Hidden file blocking: Requests for .git, .env, node_modules, and wp-admin paths are blocked
  • Input validation: Phone number validation via libphonenumber-js and comprehensive input sanitization
  • Secure discounts: Discount tokens instead of plaintext codes prevent unauthorized discount usage
Technology stack diagram showing the backend, frontend, database, and integration layers

The technology stack was chosen for reliability and the specific needs of a multi-branch operation

Challenges & Solutions

Building a production system for a real business comes with challenges that go beyond writing code. Here are the most significant obstacles I encountered and how I solved them.

Multi-Channel Payment Reconciliation

Challenge: Sales come in through Stripe, cash, card, bank transfer, CoDi, and a mobile app. Reconciling all of these into a coherent picture of revenue was complex.

Solution: I created separate MongoDB collections for each sales channel, then built unified reporting views that aggregate across all sources. This keeps each channel's data clean while providing consolidated business intelligence.

Teacher Scheduling Conflicts

Challenge: With dozens of teachers across 5 branches, preventing double-bookings was critical. A teacher accidentally assigned to two classes at the same time would leave students without an instructor.

Solution: I implemented automated validation rules that check for time conflicts and branch conflicts before any assignment is finalized. Combined with a proposal/approval workflow, this ensures the CEO has final say while the system catches potential conflicts.

Course Period Management

Challenge: Dance courses run in rolling 5-week periods with overlapping enrollment windows. Managing which period is "current" and when the next one starts was error-prone when done manually.

Solution: A centralized course calendar configuration file spans 2024-2026 with automatic current, next, and future period detection. The system always knows which period is active without any manual updates.

Abandoned Cart Cleanup

Challenge: Customers who start a Stripe checkout but never complete it leave incomplete transaction records that bloat the database and skew reports.

Solution: A weekly GitHub Actions workflow automatically identifies and removes incomplete Stripe transactions every Monday, keeping the database clean without manual intervention.

CoDi Integration

Challenge: Integrating Mexico's real-time payment system (CoDi) required supporting both QR code and push notification flows, with proper payment validation and confirmation handling.

Solution: I built dedicated routes and controllers for CoDi QR generation, push notifications, and payment validation. This was possible thanks to the CoDi API that I had already developed as a separate open-source project.

Scale & Scope

Over two years of development, this project grew into a substantial codebase that reflects the complexity of managing a multi-branch business. Here are the key numbers:

  • 5 branch locations across Mexico City
  • 4 dance programs with up to 9 levels
  • 4 payment channels per product type
  • 16+ MongoDB collections tracking all transactions and operations
  • 62 EJS templates (page views) for the frontend
  • 37+ frontend JavaScript files handling client-side interactions
  • 34 CSS stylesheets defining the visual design
  • 14 route files organizing the backend API
  • 18 model files defining the data architecture
  • 5 MJML email templates for automated communications
  • 3 GitHub Actions workflows for automated maintenance
  • 1,094 commits over 2 years of active development

Future Plans

The system continues to evolve as the business grows. Here are the key areas of ongoing and planned development:

Mobile App

A companion mobile app is currently in beta, built on Supabase. It will expand student-facing features like enrollment, schedule viewing, and real-time notifications directly on their phones.

Feedback System Expansion

The Supabase schema already supports course feedback with 5-star ratings and written reviews. The next phase will surface this data in the admin dashboard for quality monitoring and instructor evaluation.

Account Deletion Compliance

GDPR-style account deletion tracking is already built into the Supabase schema, preparing the platform for privacy regulation compliance as it scales.

Get in touch!

I'm currently open to work and I'd be happy to chat.

Feel free to reach out if you are interested in what I can bring to your project or team.