Header Image

bAppoint - appointment management

Simple and reliable appointment management!

JavaSpring BootSpring Data JPAHibernatePostgreSQLREST APINextJSTypeScriptReactShadcnUIClerkStripeWebhooksDockerGit
/project-bappoint-dashboard.png
bAppoint: dashboard

Introduction

bAppoint is a full-stack, multi-tenant SaaS platform designed for service-based businesses such as barbershops, beauty clinics, and other businesses that work with scheduled appointments. I designed and developed the platform from the ground up, focusing on appointment management, availability, service configuration, authentication, and payment processing.

/project-bappoint-booking.png
bAppoint: appointment booking

Requirements

The platform required a complete appointment management workflow, including business and service management, operating hours, days off, appointment availability, customer booking, authentication, and payment processing. The system also needed to handle concurrent appointment requests and avoid problems such as duplicate payments or inconsistent appointment states.

Objective

The main objective of bAppoint is to simplify appointment management for businesses while providing customers with a straightforward booking experience. Each business has its own environment, services, operating hours, availability, and appointments, allowing the platform to support multiple businesses within the same system.

Technologies

type Technologies = {
        Java: "backend language",
        SpringBoot: "backend framework",
        SpringDataJPA: "data access",
        Hibernate: "ORM",
        PostgreSQL: "relational database",
        RESTAPI: "backend communication",
        NextJs: "frontend framework",
        TypeScript: "type safety",
        React: "UI development",
        ShadcnUI: "user interface",
        Clerk: "authentication",
        Stripe: "payment processing",
        Webhooks: "payment events",
        Docker: "containerization",
        Git: "version control",
    };

Challenges

One of the biggest challenges was designing the backend architecture in a way that could remain maintainable as the platform grew. I organized the application using a layered architecture structured around business domains, keeping responsibilities separated between controllers, services, repositories, domain entities, DTOs, and supporting components. I also implemented dynamic appointment searching using Spring Data JPA Specifications, allowing appointments to be filtered by customer, status, date, and business. Another important challenge was handling payment consistency and concurrency. Stripe webhooks were used to confirm payments, while idempotency controls helped prevent duplicate payment processing and appointment state management ensured that appointments followed the correct lifecycle.

/project-bappoint-appointments.png
bAppoint: appointments management

Conclusion

bAppoint has been one of my most important projects because it allowed me to apply software engineering concepts to a real-world SaaS product rather than building only isolated features. Through the project, I gained practical experience with Java and Spring Boot, REST API design, relational database modeling, JPA and Hibernate, authentication, payment integrations, webhooks, idempotency, dynamic querying, multi-tenant architecture, and frontend development with Next.js and TypeScript. It also strengthened my understanding of how different parts of a production application need to work together while keeping the code organized, maintainable, and scalable.