
Beaup
A CRM platform for hair salons and spas
Rebuilt the Beaup CRM for salons and spas in Korea and Vietnam, from Naver booking sync to KakaoTalk messaging and card terminals.
Beaup은 미용실과 네일숍, 스파를 위한 CRM입니다. 예약과 고객, 결제와 정산, 직원과 급여, 고객에게 보내는 메시지까지 매장 운영을 한 화면에서 다룹니다. 한국과 베트남 매장을 함께 지원합니다. 2026년 7월부터 Staff Engineer로 일하며, 기존 Next.js CRM을 SvelteKit으로 처음부터 다시 만들었습니다.
매장의 하루를 한 곳에
미용실의 하루는 여러 곳에 흩어져 있습니다. 예약은 네이버로 들어오고, 결제는 카드 단말기에서 하고, 고객 기록은 수첩이나 엑셀에 남고, 안내 연락은 카카오톡으로 따로 보냅니다. 하루가 끝나면 원장님이 이 모두를 맞춰 보며 정산을 합니다.
Beaup은 이 흐름을 하나로 잇습니다. 네이버 예약은 CRM에 자동으로 들어오고, 단말기 결제는 그 예약에 바로 연결되고, 방문 전날 안내 메시지는 알아서 나갑니다. 원장님이 맞춰 보지 않아도 숫자가 맞는 것. Beaup이 지향하는 모습입니다.
네이버 예약을 매장 안으로
한국 매장의 예약은 많은 경우 네이버로 들어옵니다. Beaup은 원장님이 이미 네이버에 로그인해 둔 브라우저에서 확장 프로그램이 예약을 읽어 CRM으로 보내는 방식으로 이를 가져옵니다. 이전에는 매장 PC에 따로 설치하는 프로그램이 자동으로 로그인해야 했지만, 확장 프로그램으로 옮기면서 설치 파일도, 자동 로그인도 필요 없어졌습니다.
예약을 옮겨 오는 일은 단순한 복사가 아닙니다. 같은 예약이 여러 번 들어와도 한 번만 반영되도록 예약 번호에서 식별자를 정하고, 이미 있는 예약은 성공으로 처리합니다. 직원이 CRM에서 손으로 바꾼 예약 상태는 덮어쓰지 않고, 매출은 이번 동기화가 직접 방문 완료를 처리했을 때만 만들어 같은 방문이 두 번 집계되지 않게 했습니다. 매장을 연결하기 전의 방문은 매출로 가져오지 않습니다.
네이버의 디자이너나 시술 이름이 CRM과 맞지 않으면, 그 예약은 확인 대기열로 갑니다. 원장님이 한 번 짝을 지어 주면 다음부터는 자동으로 연결됩니다.
반대 방향도 있습니다. CRM에서 네이버 예약을 취소하면 확장 프로그램이 대신 네이버에 취소를 제출합니다. 이때 제출은 단 한 번만 허용됩니다. 응답이 중간에 사라져도 두 번째 제출로 이어지지 않고, 확장 프로그램은 네이버 화면을 다시 읽어 실제로 취소 표시가 붙은 것을 확인한 뒤에야 성공을 보고합니다.
예약과 돈은 서버를 거쳐서
Beaup의 화면은 데이터베이스를 직접 읽어 빠르게 그립니다. 하지만 예약을 바꾸거나 돈이 움직이는 일은 모두 서버를 거치게 했습니다. 결제 금액의 합이 맞는지, 선불권 잔액이 함께 줄었는지, 그날 정산이 이미 마감됐는지 같은 규칙은 여러 문서에 걸쳐 있어서, 문서 하나만 보는 데이터베이스 보안 규칙으로는 지킬 수 없기 때문입니다. 브라우저에서 직접 쓰는 길은 막아 두어, 누구도 규칙을 우회해 데이터를 고칠 수 없습니다.
같은 시간, 두 개의 예약
예약을 저장하기 전에 그날의 예약을 확인하는 것만으로는 이중 예약을 막을 수 없습니다. 같은 순간 들어온 두 예약이 서로를 보지 못한 채 둘 다 확인을 통과하기 때문입니다. 그래서 매장과 날짜마다 기준이 되는 문서를 하나 두고, 그날의 예약을 바꾸는 모든 작업이 같은 트랜잭션 안에서 이 문서를 함께 고치게 했습니다. 동시에 들어온 두 예약은 이 문서에서 부딪히고, 늦은 쪽은 최신 상태로 다시 확인을 거칩니다. 네이버에서 들어온 예약도 같은 문서를 거칩니다.
같은 결제, 한 번만
결제 버튼을 두 번 누르거나 네트워크가 끊겨 요청이 다시 가는 일은 매장에서 흔합니다. 돈이 움직이는 요청에는 작업마다 고유한 번호와 요청 내용의 지문을 함께 저장합니다. 같은 번호로 같은 요청이 다시 오면 처음의 결과를 그대로 돌려주고, 같은 번호로 다른 내용이 오면 거절합니다.
카카오톡은 한 번만
방문 전날 안내, 생일 쿠폰, 선불권 충전과 사용 알림은 카카오톡으로 나갑니다. 메시지에서 가장 피해야 할 일은 같은 안내를 두 번 보내는 것입니다. 그래서 메시지 하나를 보내는 일을 세 단계로 나눴습니다.
- 선점: 보낼 메시지를 먼저 잡아 두어, 겹쳐 실행된 작업이 같은 메시지를 동시에 보내지 못하게 합니다.
- 제출 기록: 발송 요청을 보내기 직전에 “보낸다”는 기록부터 남깁니다. 이 기록을 남기지 못하면 보내지 않습니다.
- 결과 기록: 발송 대행사의 응답을 받아 남깁니다.
제출 기록과 결과 기록 사이에서 작업이 멈추면, 그 메시지는 보냈는지 알 수 없는 상태로 따로 분류되고 자동으로 다시 보내지지 않습니다. 대신 대행사에 메시지 식별자를 함께 넘겨 두어, 나중에 도착하는 전달 결과로 상태를 확정합니다. 대행사가 접수한 것과 고객에게 실제로 전달된 것도 따로 구분합니다.
단말기와 CRM 사이
카드 결제는 매장의 토스 단말기에서 이뤄지고, Beaup은 그 결제를 예약과 정산에 연결합니다. CRM이 결제할 내용을 준비하면 단말기가 이를 가져가 결제하고 결과를 돌려보냅니다.
단말기가 결제를 가져가기 직전에는 결제할 금액을 한 번 더 계산합니다. 그사이 다른 방법으로 이미 결제됐거나, 선불권 잔액이 먼저 쓰였거나, 그날 정산이 마감됐을 수 있기 때문입니다. 단말기에서는 결제가 됐는데 CRM 기록이 끝나지 않은 경우에는 실패로 처리하지 않고, 원장님이 확인해 맞출 수 있도록 따로 보여 줍니다. 단말기 연동의 뼈대를 만든 뒤에는 팀원과 함께 매장 환경에 맞게 다듬어 왔습니다.
한국의 미용실, 베트남의 스파
같은 CRM이지만 한국의 미용실과 베트남의 스파는 일하는 방식이 다릅니다. 한국 매장은 디자이너마다 한 명의 손님을 받고, 예약은 네이버로, 안내는 카카오톡으로 합니다. 베트남 스파는 일행이 방 하나를 예약하고, 손님마다 다른 프로그램을 받으며, 여행사나 호텔을 통해 예약이 들어옵니다. 이 차이를 화면마다 흩어 놓지 않고 국가별 설정 한 곳에 모아, 같은 코드가 나라에 맞게 동작하도록 했습니다. 영업일 계산도 매장이 있는 나라의 시간대를 따릅니다.
사람과 방을 함께 맞추기
스파 예약에서 어려운 것은 직원 배정입니다. 손님마다 시술할 수 있는 직원이 있는지 세는 것만으로는 부족합니다. 세 손님에게 각각 가능한 직원이 있어도, 그중 두 손님이 같은 한 사람에게만 맡길 수 있다면 한 손님은 결국 받을 사람이 없습니다.
그래서 손님과 직원을 잇는 이분 매칭으로 실제로 모두에게 직원을 배정할 수 있는지 확인합니다. 하루 전체를 한 번에 세지 않고 시간 구간마다 확인하며, 시술 도중 근무 교대로 담당이 바뀌는 배정은 만들지 않습니다. 방은 일행 중 가장 긴 프로그램이 끝날 때까지 잡아 두고, 직원은 자기 손님의 시술이 끝나는 대로 풀어 다음 예약을 받을 수 있게 했습니다.
숫자를 조용히 바꿀 수 없게
베트남 스파를 위해 정한 원칙 중 하나는, 직원이 가격을 슬쩍 낮추거나 예약을 지우거나 매출을 고치는 일이 조용히 일어나지 않게 하는 것이었습니다. 그래서 이런 작업은 모두 서버에서만 할 수 있게 하고, 누가 언제 무엇을 바꿨는지 원장님이 볼 수 있는 기록으로 남깁니다.
Beaup: Live
Beaup은 지금 beaup.co.kr에서 운영되고 있습니다. 네이버 예약 동기화 확장 프로그램과 토스 단말기 플러그인도 함께 배포되어 있습니다.