Hopp til hovedinnhold
Spring Boot

Bookingapp for frisørsalonger

For deg som driver en liten frisørsalong

Komplett webapp for frisørsalonger med online booking, kalender, ansatte og administrasjon. Bygget med Spring Boot og React. Prøv demoen live.

  • Booking fra mobil og PC
  • Tjenester med pris og varighet
  • Valgfri frisør eller første ledige
  • Sperre mot dobbeltbooking
  • E-postbekreftelse
  • Administrasjon av tjenester, ansatte, fravær og bestillinger
  • Spring Boot, Hibernate og PostgreSQL

Hvis du driver en salong, kjenner du dette igjen

Kunder skriver på Instagram, ringer midt i en behandling eller sender melding sent på kvelden. Du svarer når du kan, men timene havner fort på flere steder: kalenderen på mobilen, en notisbok, en meldingstråd eller hodet ditt.

Når salongen vokser litt, blir dette fort slitsomt. Du skal holde kontroll på tjenester, priser, ansatte, fravær og ledige tider, samtidig som kundene forventer enkel booking.

Nordic Cuts viser hvordan dette kan løses med en egen webapp laget for en liten frisørsalong.

Hva er Nordic Cuts

Nordic Cuts er en komplett webapp for frisører og salonger. Kundene velger behandling, frisør, dato og klokkeslett direkte i nettleseren, på mobil eller PC, og ser pris og varighet før de sender bestillingen.

Bak den offentlige siden finnes en administrasjonsdel der salongen styrer tjenester, frisører, fravær og bestillinger. Løsningen er bygget med Java, Spring Boot, React og PostgreSQL. Det er en ekte applikasjon, ikke en kontaktside med et skjema.

Nordic Cuts i nytt design: forsiden og bookingflyten ruller forbi automatisk

For kundene dine

Kunden velger behandling og ser hvilke frisører som utfører den. Har kunden ingen favoritt, holder det å velge «Hvem som helst», så finner systemet første ledige frisør.

Deretter velger kunden dato og ledig tidspunkt, fyller inn navn, telefon og e-post og godtar personvernvilkårene. Bestillingen lagres i den samme databasen som administrasjonen bruker.

For deg som driver salongen

Du ser hva som er bestilt, hvem som skal gjøre jobben og hvilke tjenester salongen tilbyr. Frisører knyttes til tjenestene de utfører, fravær registreres, og hver bestilling har en status: venter, bekreftet, avlyst eller ferdig.

Løsningen kan sende bekreftelse på e-post til kunden, ny e-post når statusen endres, og varsel til salongen om nye bestillinger. Du betaler ingen provisjon per booking, og kundedataene ligger i salongens egen database.

Hva løsningen inneholder

  • Offentlig landingsside for salongen, i et mørkt og moderne design.
  • Online booking i fire steg: behandling, frisør, tidspunkt og kontaktinformasjon.
  • «Hvem som helst»: systemet velger første ledige frisør som utfører tjenesten.
  • Sperre mot dobbeltbooking, kontrollert i backend.
  • Tjenester med pris, varighet og beskrivelse.
  • Frisører med bilde, status og tjenestene de utfører.
  • Registrering av fravær for ansatte.
  • Bestillinger med status: venter, bekreftet, avlyst og ferdig.
  • E-postbekreftelse til kunden og varsel til salongen.
  • Samtykke til personvern (GDPR) i bestillingsskjemaet.
  • Innlogging med roller for administrator og bruker.

For hvem passer dette

Løsningen passer for frisører, barberere og små salonger som vil eie sin egen bookingflyt. Den passer også for andre timebaserte tjenester der kunden velger person, tjeneste og tidspunkt.

Styrer du mye manuelt i dag, kan en slik løsning spare deg for tid og gjøre det enklere for kundene å bestille.

Slik jobber vi

Dette er ikke en standardmal der alle får nøyaktig samme løsning. Vi bruker demoen som utgangspunkt og tilpasser den til din salong: tjenester, priser, ansatte, språk, design og arbeidsflyt.

Det er en oppstartskostnad for utvikling og oppsett, og deretter vedlikehold og hosting som avtales tydelig. Du vet hva som inngår før vi starter.

Teknologien bak Nordic Cuts

Denne delen er for deg som er nysgjerrig på hva som ligger under panseret, eller for utvikleren du spør til råds. Kort fortalt: én Spring Boot-applikasjon som leverer både API-et og React-appen, med PostgreSQL som database.

DelTeknologiHva den gjør
BackendJava 21, Spring Boot 4.1, JHipster 9.4REST-API, bookingregler, e-post og sikkerhet
DatabasePostgreSQLLagrer tjenester, frisører, fravær og bestillinger
ORMHibernate 7 med Spring Data JPA og EhcacheKobler Java-klassene til tabellene, med cache for hyppige oppslag
DatabaseendringerLiquibaseVersjonerte endringer som kjøres automatisk ved oppstart
ByggMaven Wrapper og frontend-maven-pluginBygger backend og frontend til én kjørbar JAR-fil
FrontendReact 19, TypeScript 5.9, Tailwind CSSOffentlig side og bookingflyt, laget for mobil først
AdministrasjonReact, Redux Toolkit, Bootstrap 5Tjenester, frisører, fravær, bestillinger og brukere
SikkerhetSpring Security med JWTInnlogging og roller for administrator og bruker
DriftDocker på Railway (EU)Helsesjekk, automatisk deploy fra main og omstart ved feil
KvalitetGitHub Actions, JUnit, Jest, Cypress, TestcontainersHver endring testes før den når produksjon

Backend: Java 21 og Spring Boot 4.1

Grunnmuren er generert med JHipster 9.4 og deretter tilpasset og utvidet for en salong. Koden er delt i lag: REST-ressurser tar imot forespørslene, tjenesteklasser har forretningsreglene, og repositorier snakker med databasen. DTO-er mappes med MapStruct, og alt som kommer inn, valideres med Bean Validation før det lagres.

Bookingreglene ligger i backend, ikke bare i nettleseren. Før en bestilling lagres, sjekker systemet at frisøren ikke har en annen bestilling som overlapper i tid. Avlyste timer teller ikke. Velger kunden «Hvem som helst», finner backend en aktiv frisør som utfører tjenesten og er ledig i det tidsrommet. Kalenderen henter opptatte tider fra et eget endepunkt og viser dem som utilgjengelige.

E-post sendes med Spring Mail og Thymeleaf-maler: bekreftelse til kunden, beskjed når statusen endres, og varsel til salongen.

Database: PostgreSQL, Hibernate og Liquibase

Fire JPA-entiteter beskriver salongen: Tjeneste, Frisor, Fravaer og Bestilling. En frisør kan utføre mange tjenester (many-to-many), en bestilling peker til én tjeneste og én frisør, og et fravær hører til én frisør. Hibernate 7 oversetter mellom Java-objektene og tabellene i PostgreSQL, og Ehcache er andrenivå-cache for data som leses ofte.

Databasestrukturen endres aldri for hånd. Hver endring er en versjonert Liquibase-changelog i Git, og Liquibase kjører den automatisk når appen starter. Lokalt bruker vi H2, testene kjører mot en ekte PostgreSQL i Docker via Testcontainers, og produksjonen bruker PostgreSQL på Railway.

Sikkerhet og API

Administrasjonen er beskyttet med Spring Security og JWT-tokens, med egne roller for administrator og bruker. Uten innlogging kan man bare gjøre det en kunde trenger: lese tjenester og aktive frisører, se opptatte tider og sende en bestilling. Alt annet krever innlogging, og administrasjons-API-et krever administratorrollen.

API-et er dokumentert med OpenAPI (springdoc). Spring Boot Actuator gir helsesjekk og metrikker i Prometheus-format, slik at man alltid ser om appen lever.

Frontend: React 19 og TypeScript

Frontend er skrevet i TypeScript med React 19, React Router 7 og Redux Toolkit og bygges med Webpack 5. Skjemaene bruker react-hook-form med validering i hvert felt, API-kallene går via Axios, og datoer håndteres med Day.js.

Den offentlige delen er stylet med Tailwind CSS i et eget mørkt «amber glass»-design: glasspaneler, varme lysflekker, filmkorn og myke animasjoner. Animasjonene skrus av når brukeren har valgt redusert bevegelse i operativsystemet. Administrasjonen bruker Bootstrap 5.

Maven bygger alt til én fil

Ett Maven-kall bygger hele løsningen. Maven Wrapper låser Maven-versjonen, og frontend-maven-plugin installerer Node 24 og bygger React-appen som en del av Maven-bygget. Resultatet er én kjørbar JAR-fil med både backend og frontend.

Dockerfilen bygger i to steg. Et JDK-bilde kompilerer og pakker appen, og det ferdige bildet inneholder bare Java 21-runtime og JAR-filen. Det gir et mindre bilde med færre ting som kan gå galt.

Tester og CI

Hver pull request går gjennom GitHub Actions før den slås sammen: ESLint, TypeScript-sjekk, Jest-tester, produksjonsbygg av frontend, formateringskontroll av Java med Prettier og Spotless, og til slutt Maven verify med enhetstester og integrasjonstester mot PostgreSQL. Hele løpet tar rundt fem minutter.

Til sammen er det over 500 automatiske tester: 318 i Java og 219 i frontend. I tillegg finnes ende-til-ende-tester i Cypress og arkitekturtester i ArchUnit som passer på at lagdelingen holder.

Drift på Railway

Appen kjører som en Docker-container på Railway i EU, med PostgreSQL som egen tjeneste. Når main endres, bygger Railway et nytt bilde og sender trafikk dit først når /management/health svarer. Krasjer appen, starter den på nytt av seg selv, og en tidligere versjon kan rulles tilbake.

Arbeidsflyten er den samme for hver endring: egen gren, pull request, grønn CI, sammenslåing til develop og deretter en release til main, som deployes automatisk.

«Kan ikke dette lages på fem minutter med vibe coding?»

Jo da. Du skriver «lag en bookingapp for frisør», trykker Enter, og fem minutter senere har du noe som ligner på en bookingapp. Så kommer lørdag morgen: to kunder står i døra med samme time, ingen vet hvor bestillingene ble lagret, og appen virker bare på utviklerens egen PC.

Nordic Cuts tok litt mer enn fem minutter: 88 commits, 39 pull requests og over 500 automatiske tester siden januar 2026. Det eneste som faktisk tar fem minutter, er testløpet i CI. Vi bruker også AI hver dag, og den sparer oss for mange timer, men det er reglene i backend, testene og driften som gjør at bookingen virker når salongen er fullbooket en lørdag.

Prøv demoen og ta kontakt

Demoen er åpen. Gå inn, test bookingflyten og se hvordan den oppleves for en kunde. Har du spørsmål, tar vi en prat og ser på hva som passer for din salong.

Lurer du på om egen app lønner seg for salongen? Les guiden Bookingsystem for frisør: egen app eller ferdig løsning?.