온헤어 CRM 전체 개발 안내서
1. 서비스 정의
한 줄 설명
온헤어의 원장님과 디자이너가 휴대전화 번호로 고객의 이전 시술 이력과 염색약 번호를 확인하고, 예약 확인과 다음 예약 관리까지 한곳에서 끝내는 웹 CRM이다.
개발 대상
- 플랫폼: Next.js 기반 웹
- 시장: 대한민국
- 시간대:
Asia/Seoul - 매장 규모: 디자이너 2~4명
- 고객 규모: 100~999명
- 주요 사용 기기: 매장 PC, 태블릿, 모바일 웹 브라우저
- 앱스토어용 모바일 앱은 전제하지 않는다.
직접 사용하는 사람
| 사용자 | 핵심 과업 |
|---|---|
| 원장님 | 전체 고객과 예약 확인 건을 관리하고, 직원을 설정하며 기존 자료를 가져온다. |
| 디자이너 | 자기 담당 고객의 시술 이력을 확인하고 시술 기록과 다음 예약을 작성한다. |
| 대체 시술 디자이너 | 담당 디자이너가 쉬는 날 필요한 이전 시술 메모와 염색약 번호를 확인한다. 권한 방식은 확인이 필요하다. |
| 고객 | CRM에 로그인하지 않는다. 예약 확인 및 당일 안내 알림톡을 받는다. |
2. 해결할 문제
현재 고객 정보가 디자이너별 수첩, 엑셀, 구글시트에 나뉘어 있다. 담당 디자이너가 쉬는 날에는 다른 디자이너가 이전 염색약 번호와 배합을 확인하기 어렵다.
네이버 예약 고객에게 전날과 당일에 확인 연락을 직접 돌리고 있어 반복 업무가 많다. 노쇼가 주에 두세 번 발생하지만 자동 확인 수단이 없다.
마지막 시술 후 두 달이 지난 고객을 바로 찾을 수 없고, 연락 결과도 고객별로 남기기 어렵다.
3. 사용자가 달성해야 하는 목표
- 휴대전화 번호로 고객을 한 사람으로 찾는다.
- 담당 디자이너가 달라도 이전 시술 이력, 염색약 번호, 배합을 확인한다.
- 내일 예약 확인 알림톡과 당일 안내 알림톡을 자동 발송한다.
- 방문 결과를 시술 완료, 노쇼, 고객 취소, 매장 취소로 기록한다.
- 시술 완료 후 시술 기록 누락을 바로 확인한다.
- 시술 직후 다음 예약을 등록한다.
- 마지막 시술 후 두 달이 지난 고객을 자동으로 찾는다.
- 뜸해진 고객에게 연락한 일시, 채널, 결과를 기록한다.
- 원장님은 전체 고객을 보고 디자이너는 허용된 고객만 자세히 본다.
- 기존 고객 정보, 방문 이력, 염색약 번호, 시술 메모를 안전하게 가져온다.
4. 첫 개발 범위
반드시 포함할 기능
고객·시술 관리
- 고객 등록, 수정, 검색, 상세 조회
- 가게와 정규화 번호를 기준으로 한 중복 판정
- 휴대전화 번호, 이름, 담당 디자이너 검색
- 고객별 전체 시술 이력 조회
- 시술 종류, 시술 메모, 염색약 번호, 배합 기록
- 선택적인 시술 사진 첨부
- 선택적인 다음 예약 등록
- 개인정보 동의와 마케팅 수신동의 상태 및 변경 이력 관리
- 고객 단계 자동 분류
예약 확인 관리
- 예약 확인 건 직접 등록 및 수정
- 오늘·내일 예약 확인 목록
- 현장 방문 등록
- 고객 확인 상태 관리
- 방문 결과 관리
- 예약 연락처 스냅샷 저장
- 전날 오후 6시 예약 확인 알림톡 자동 발송
- 방문 3시간 전 당일 예약 안내 알림톡 자동 발송
- 알림톡 처리 중, 성공, 실패 결과 기록
- 알림톡 실패 시 수동 연락 결과 기록
- 시술 완료 후 시술 기록이 없을 때 내부 할 일 생성
뜸해진 고객 관리
- 마지막 시술 후 달력 기준 2개월이 지났고 미래 예약이 없는 고객 자동 분류
- 담당 디자이너별 뜸해진 고객 목록
- 마케팅 수신동의 상태 표시
- 고객별 연락 일시, 연락 채널, 연락 결과 기록
직원·권한 관리
- 가게 생성 및 직원 소속 관리
- 원장님과 디자이너 역할
- 계정 활성화 및 차단
- 가게 단위 데이터 격리
- 고객 조회, 수정, 내보내기 이력
- 권한 변경 이력
자료 가져오기와 중복 합치기
- 엑셀·구글시트에서 만든 CSV 파일 가져오기
- 고객, 방문 이력, 시술 기록, 예약 확인 정보 열 연결
- 전화번호 정규화
- 오류 행 보관 및 재처리
- 같은 파일 재처리 시 중복 생성 방지
- 대표 고객과 통합 대상 고객을 구분한 병합
- 이름, 담당 디자이너, 동의 상태, 미래 예약 충돌 검토
- 병합 이력과 병합 취소
- 원본 고객 및 원본 파일 값 보존
운영 설정
- 카카오 알림톡 발신 프로필 연결 상태 확인
- 예약 확인 및 당일 안내 템플릿 연결
- 자동 발송 가능 여부 표시
- 발송 연결이 유효하지 않을 때 자동 발송 중지 및 원인 표시
- 실패 대상에 대한 수동 연락 대체 처리
첫 개발에서 사용하지 않는 기능
다음 기능은 사용자가 첫 버전에서 필요하지 않다고 확인했다.
- 네이버 예약 신규 내역 자동 취합
- 담당자별 전체 예약 달력
- 재방문 광고 자동 발송
- 고객별 재방문 주기에 따른 뜸해짐 기준
- 시술 전후 사진 비교
- 퇴사 디자이너 고객 인계
- 결제
- 회원권·정액권 잔액 및 만료 관리
- 네이버 톡톡 대화 가져오기
- 카카오톡 채널 과거 대화 가져오기
- 개인 카카오톡, 인스타그램·SNS, 전화 대화 내용 가져오기
네이버 예약, 네이버 톡톡, 카카오톡 채널 대화는 기존 도구에서 계속 운영한다.
범위 표기 충돌 처리
기능 목록에서 고객별 방문 이력, 시술 메모와 사진, 염색약 번호, 담당 고객 권한, 예약 확인 연락, 시술 뒤 다음 예약이 일부 “이어서 만들 기능”으로도 표기돼 있다.
이 기능들은 사용자 확인 내용과 첫 개발 필수 범위에 반복해서 포함돼 있으므로 첫 개발에 포함한다.
5. 핵심 이용 흐름
5.1 원장님 최초 설정
로그인
→ 가게 생성 또는 소속 가게 확인
→ 직원 계정 등록
→ 원장님·디자이너 역할 지정
→ 기존 고객·시술 자료 가져오기
→ 중복 고객 검토 및 병합
→ 알림톡 발신 프로필과 템플릿 연결
→ 오늘·내일 예약 확인 화면으로 이동
완료 조건:
- 원장님 계정이 가게에 연결돼 있다.
- 직원 계정과 권한이 설정돼 있다.
- 가져오기 결과와 오류 행을 확인할 수 있다.
- 알림톡 자동 발송 가능 여부가 표시된다.
5.2 예약 확인 건 등록
오늘·내일 예약 확인
→ 예약 확인 건 추가
→ 휴대전화 번호 입력
→ 같은 번호의 기존 고객 검색
→ 기존 고객 선택 또는 신규 고객 등록
→ 방문 예정 일시·담당 디자이너·예정 시술·접점 입력
→ 예약 연락처 스냅샷 저장
→ 알림톡 발송 일정 생성
완료 조건:
- 예약 확인 건이 고객과 연결된다.
- 예약 당시 이름과 휴대전화 번호가 별도로 저장된다.
- 전날 오후 6시와 방문 3시간 전 발송 예정 상태를 확인할 수 있다.
5.3 방문과 시술 기록
오늘 예약 확인
→ 고객 방문
→ 방문 결과를 시술 완료로 변경
→ 시술 기록 작성
→ 시술 종류·시술 메모 입력
→ 염색약 번호·배합 입력
→ 필요한 경우 사진 첨부
→ 필요한 경우 다음 예약 등록
→ 저장
완료 조건:
- 시술 기록이 예약 확인 건과 고객에게 연결된다.
- 이전 시술 이력에서 즉시 조회된다.
- 다음 예약을 입력했다면 새 예약 확인 건이 만들어진다.
- 시술 기록 미작성 내부 할 일이 자동 완료된다.
5.4 시술 기록 누락 처리
방문 결과를 시술 완료로 저장
→ 연결된 시술 기록 확인
→ 기록이 없으면 담당 디자이너 내부 할 일 생성
→ 시술 기록 작성
→ 할 일 자동 완료
같은 예약 확인 건에는 동일한 미작성 할 일을 한 번만 생성한다.
5.5 뜸해진 고객 관리
뜸해진 고객 화면
→ 담당 디자이너 또는 마케팅 수신동의 상태로 확인
→ 고객 상세와 마지막 시술 확인
→ 마케팅 수신동의 확인
→ 전화·카카오톡 채널 등으로 연락
→ 연락 일시·연락 채널·연락 결과 기록
→ 새 예약 등록 시 뜸해짐 상태 해제
5.6 담당 디자이너가 쉬는 날의 대체 시술
다음 두 요구가 함께 존재한다.
- 각 디자이너는 자기 담당 고객만 자세히 본다.
- 담당 디자이너가 쉬는 날 다른 디자이너가 이전 시술 메모와 염색약 번호를 확인해야 한다.
두 요구를 모두 충족할 권한 방식은 아직 확정되지 않았다. 다음 중 하나를 선택해 구현해야 한다.
- 원장님 승인 후 일정 시간 동안 임시 열람
- 원장님이 예약 건별 대체 디자이너를 지정하면 해당 고객 열람 허용
- 원장님이 고객 담당 디자이너를 변경
- 열람 사유 입력 후 다른 담당 고객의 시술 이력만 제한적으로 열람
이 기능은 핵심 문제 해결에 필요하므로 제거하지 않고 확인 필요 기능으로 유지한다.
6. 주요 화면
화면 구성 요약
| 화면 | 주요 사용자 | 목적 | 완료 조건 |
|---|---|---|---|
| 로그인 | 전체 직원 | 직원 계정과 가게 소속 확인 | 허용된 가게의 첫 화면으로 이동 |
| 오늘·내일 예약 확인 | 원장님, 디자이너 | 예약, 알림톡, 고객 확인, 방문 결과 관리 | 예약 상태와 발송 상태를 한 화면에서 확인 |
| 고객 목록 | 원장님, 디자이너 | 고객 검색 및 중복 후보 확인 | 휴대전화 번호로 정확한 고객을 찾음 |
| 고객 상세 | 원장님, 권한 있는 디자이너 | 고객 정보, 동의, 시술 이력, 다음 예약 확인 | 최근 염색약 번호와 배합을 확인 가능 |
| 시술 기록 작성 | 원장님, 권한 있는 디자이너 | 방문 후 시술 내용 저장 | 필수 시술 정보가 고객에게 연결됨 |
| 뜸해진 고객 | 원장님, 디자이너 | 두 달 이상 미방문 고객과 연락 관리 | 연락 일시·채널·결과 저장 |
| 자료 가져오기·중복 합치기 | 원장님 | 기존 자료 이전 및 오류 검토 | 정상 행 반영, 오류 행 보관 |
| 중복 고객 병합 검토 | 원장님 | 대표 고객과 충돌 항목 확정 | 모든 충돌 항목 선택 후 병합 |
| 고객 병합 이력 | 원장님 | 병합 내용 확인 및 취소 | 작업 단위로 병합 취소 가능 |
| 직원·권한 설정 | 원장님 | 직원 역할과 계정 상태 관리 | 서버 권한까지 변경 사항 적용 |
| 원장 설정 | 원장님 | 가게, 직원, 가져오기, 알림톡 설정 진입 | 각 운영 설정으로 이동 |
| 알림톡 설정 | 원장님 | 발신 프로필, 템플릿, 연결 상태 관리 | 자동 발송 가능 여부 확인 |
6.1 로그인
권장 경로: /login
표시 항목:
- 로그인 정보 입력
- 소속 가게
- 계정 활성 상태
- 로그인 오류
- 세션 만료 안내
처리 규칙:
- 차단된 직원은 로그인할 수 없다.
- 로그인 후 원장님과 디자이너 모두 오늘·내일 예약 확인 화면으로 이동한다.
- 서버에서도 가게 소속과 역할을 검사한다.
- 최초 원장님은 가게 생성 절차를 완료해야 한다.
6.2 오늘·내일 예약 확인
권장 경로: /stores/[storeId]/reservations
상단:
- 오늘 예약 수
- 내일 예약 수
- 알림톡 발송 성공·실패 상태
- 시술 기록 미작성 할 일
- 노쇼율 등 운영 지표 요약
목록 항목:
- 고객명
- 예약 연락처
- 방문 예정 일시
- 담당 디자이너
- 예정 시술
- 예약·방문 접점
- 고객 확인 상태
- 전날 예약 확인 발송 상태
- 당일 안내 발송 상태
- 방문 결과
- 시술 기록 연결 상태
주요 행동:
- 예약 확인 건 추가 및 수정
- 고객 상세 열기
- 고객 확인 상태 변경
- 방문 결과 입력
- 시술 기록 작성
- 실패한 알림톡의 수동 연락 기록
- 취소 또는 시간 변경
6.3 고객 목록
권장 경로: /stores/[storeId]/customers
검색 조건:
- 휴대전화 번호
- 고객 이름
- 담당 디자이너
- 현재 관리 단계
- 중복 검토 필요 여부
규칙:
- 휴대전화 번호의 하이픈이나 공백 입력 여부와 관계없이 검색한다.
- 원장님은 전체 고객을 검색한다.
- 디자이너는 자기 담당 고객만 상세 조회한다.
- 다른 담당 고객이 같은 번호로 검색되면 권한 범위에 맞는 제한 정보와 원장님 확인 요청을 표시한다.
- 병합된 통합 대상 고객은 일반 결과에서 숨기고, 병합 이력에서는 조회 가능하게 한다.
6.4 고객 상세
권장 경로: /stores/[storeId]/customers/[customerId]
구성:
- 고객 기본 정보
- 원본 번호와 정규화 번호
- 담당 디자이너
- 고객 단계
- 개인정보 동의 상태와 이력
- 마케팅 수신동의 상태와 이력
- 최근 시술 요약
- 전체 시술 이력
- 염색약 번호와 배합
- 시술 사진
- 미래 예약
- 뜸해진 고객 연락 이력
- 병합 이력
- 조회·수정 이력
주요 행동:
- 고객 정보 수정
- 시술 기록 작성
- 다음 예약 등록
- 중복 고객 검토
- 원장님 전용 내보내기
- 보유기간 확인 및 삭제·비식별 처리 요청 관리
6.5 시술 기록 작성
권장 경로: /stores/[storeId]/customers/[customerId]/treatments/new
필수 입력:
- 시술 일시
- 실제 담당 디자이너
- 시술 종류
- 시술 메모
입력 필드:
- 염색약 번호
- 배합
- 시술 사진
- 다음 예약 일시
- 다음 예약 담당 디자이너
- 다음 예약 예정 시술
염색약 번호와 배합 필드는 제공하되, 비염색 시술에서는 빈값을 허용한다.
저장 시 처리:
- 고객의 마지막 방문일을 다시 계산한다.
- 고객 단계를 다시 계산한다.
- 연결된 시술 기록 미작성 할 일을 완료한다.
- 다음 예약이 있으면 예약 확인 건을 생성한다.
- 작성자, 작성일, 수정일, 실제 담당 디자이너를 남긴다.
6.6 뜸해진 고객
권장 경로: /stores/[storeId]/inactive-customers
목록 항목:
- 고객명
- 담당 디자이너
- 마지막 시술일
- 마지막 시술 종류
- 마지막 연락일
- 마케팅 수신동의 상태
- 미래 예약 유무
연락 기록:
- 연락 일시
- 연락 채널
- 연락 결과
- 기록한 직원
- 추가 메모
재방문 광고 자동 발송은 하지 않는다. 마케팅 수신동의가 없는 고객은 재방문 권유 대상으로 선택하지 못하게 하고 상태를 명확하게 표시한다.
6.7 자료 가져오기·중복 합치기
권장 경로: /stores/[storeId]/settings/imports
단계:
- CSV 파일 업로드
- 원본 열과 CRM 항목 연결
- 전화번호·날짜·담당자 검증
- 오류 행 검토
- 중복 고객 검토
- 생성될 고객 및 시술 기록 미리 보기
- 최종 반영
- 결과 요약
지원 대상:
- 고객 정보
- 방문 일시
- 시술 종류
- 시술 메모
- 염색약 번호
- 배합
- 담당자
- 다음 예약
- 동의 상태와 확인 가능한 동의 정보
수첩 자료는 같은 화면의 직접 입력 방식이나 고객 상세의 시술 기록 작성 기능으로 옮긴다.
6.8 중복 고객 병합 검토
권장 경로: /stores/[storeId]/customers/merge/[mergeCandidateId]
비교 항목:
- 고객 이름
- 원본 휴대전화 번호
- 정규화 번호
- 최근 방문일
- 시술 기록 수
- 대표 담당 디자이너
- 최근 실제 담당 디자이너
- 개인정보 동의
- 마케팅 수신동의
- 미래 예약
- 발송 예정 알림톡
병합 전에 반드시 확정할 내용:
- 대표 고객
- 사용할 이름
- 대표 담당 디자이너
- 동의 상태 충돌 처리
- 미래 예약 연결
- 발송 예정 알림톡 처리
- 병합 사유
6.9 고객 병합 이력
권장 경로: /stores/[storeId]/settings/merge-history
표시 항목:
- 대표 고객
- 통합 대상 고객
- 병합 실행자와 실행 시각
- 병합 사유
- 충돌 선택값
- 이동한 시술 기록과 예약 확인 건
- 병합 취소 여부
- 취소 실행자와 사유
병합 이후 새로 작성된 기록이 있으면 자동으로 나누지 않는다. 해당 기록을 검토 필요로 표시한 후 원장님이 처리한다.
6.10 직원·권한 설정
권장 경로: /stores/[storeId]/settings/staff
기능:
- 직원 등록
- 역할 지정
- 계정 활성화·차단
- 담당 고객 범위 확인
- 마지막 권한 변경일 확인
- 조회·수정·내보내기 기록 조회
6.11 알림톡 설정
권장 경로: /stores/[storeId]/settings/notifications
표시 항목:
- 발신 프로필
- API 연결 상태
- 예약 확인 템플릿
- 당일 안내 템플릿
- 템플릿 사용 가능 여부
- 발송 결과 수신 상태
- 최근 연결 오류
- 자동 발송 가능 여부
연결 또는 템플릿이 유효하지 않으면 자동 발송을 중지하고 원인을 보여준다.
7. 권한 기준
| 기능 | 원장님 | 디자이너 |
|---|---|---|
| 가게 전체 고객 목록 | 가능 | 자기 담당 고객 중심 |
| 전체 고객 상세 | 가능 | 자기 담당 고객 |
| 전체 예약 확인 건 | 가능 | 자기 담당 예약 중심 |
| 시술 기록 작성 | 가능 | 허용된 담당 고객 |
| 시술 기록 수정 | 가능 | 허용된 담당 고객 |
| 뜸해진 고객 전체 | 가능 | 자기 담당 고객 |
| 직원·권한 설정 | 가능 | 불가 |
| 자료 가져오기 | 가능 | 불가 |
| 고객 병합·취소 | 가능 | 불가 |
| 알림톡 설정 | 가능 | 불가 |
| 고객 자료 내보내기 | 가능 | 불가 |
| 감사 기록 조회 | 가능 | 불가 |
권한은 메뉴를 숨기는 것만으로 구현하지 않는다. 모든 서버 조회·등록·수정·파일 접근에서 다음을 검사한다.
- 현재 직원이 해당 가게 소속인가
- 계정이 활성 상태인가
- 역할에 허용된 행동인가
- 디자이너라면 해당 고객 또는 예약 담당 범위에 포함되는가
시술 사진, CSV 원본, 병합 이력에도 같은 검사를 적용한다.
8. 핵심 데이터 구조
| 데이터 | 주요 내용 |
|---|---|
| 가게 | 가게명, 시간대, 개인정보 보유기간 설정, 생성일 |
| 직원 소속 | 직원, 가게, 역할, 활성 상태, 권한 변경일 |
| 고객 | 이름, 원본 번호, 정규화 번호, 담당 디자이너, 고객 단계, 마지막 방문일, 활성·병합 상태 |
| 동의 이력 | 동의 종류, 상태, 일시, 경로, 변경자 |
| 시술 기록 | 고객, 시술 일시, 담당 디자이너, 시술 종류, 메모, 염색약 번호, 배합, 작성자 |
| 시술 사진 | 시술 기록, 파일 위치, 촬영·보관 동의, 보관기간 |
| 예약 확인 건 | 고객, 방문 예정 일시, 담당 디자이너, 예정 시술, 접점, 고객 확인 상태, 방문 결과 |
| 예약 연락처 스냅샷 | 예약 당시 고객명, 휴대전화 번호, 검증 상태, 저장 시각 |
| 알림톡 발송 | 예약 확인 건, 안내 종류, 예정 시각, 요청 식별값, 결과 식별값, 발송 상태 |
| 내부 할 일 | 예약 확인 건, 담당 디자이너, 할 일 종류, 완료 상태 |
| 뜸해진 고객 연락 | 고객, 연락 일시, 채널, 결과, 기록자 |
| 가져오기 작업 | 파일, 작업 식별값, 진행 상태, 실행자 |
| 가져오기 오류 행 | 원본 행 번호, 원본 값, 오류 이유, 재처리 상태 |
| 병합 이력 | 대표 고객, 통합 대상 고객, 충돌 선택값, 실행자, 실행 시각 |
| 기록 이동 이력 | 시술 기록·예약 확인 건의 변경 전후 고객 |
| 감사 기록 | 조회·수정·내보내기 행동, 직원, 대상, 시각 |
주요 상태값
방문 결과
| enum | 화면 표시 |
|---|---|
treatment_completed | 시술 완료 |
no_show | 노쇼 |
customer_cancelled | 고객 취소 |
store_cancelled | 매장 취소 |
결과 입력 전에는 빈 상태를 허용한다.
고객 단계
| enum | 화면 표시 |
|---|---|
inquiry | 문의 중 |
booked | 방문 예약됨 |
treatment_completed | 시술 완료 |
next_booking | 다음 예약 잡힘 |
returning | 재방문 고객 |
inactive | 뜸해짐 |
고객 병합 상태
| enum | 화면 표시 |
|---|---|
active | 활성 |
merged | 병합됨 |
review_required | 검토 필요 |
알림톡 발송 상태
| enum | 화면 표시 |
|---|---|
scheduled | 발송 예정 |
processing | 처리 중 |
success | 성공 |
failed | 실패 |
stopped | 중지 |
9. 핵심 업무 규칙
9.1 휴대전화 번호 정규화
고객 중복 기준은 다음 조합이다.
가게 식별값 + 정규화 번호
서로 다른 가게의 고객은 같은 번호여도 합치지 않는다.
처리 규칙:
- 공백, 하이픈, 점, 괄호를 제거한다.
+82,0082,82형식을 처리한다.- 정상적인 한국 휴대전화 번호는 국제 형식으로 저장한다.
- 기존
011,016,017,018,019번호를 임의로010으로 바꾸지 않는다. - 원본 입력값과 정규화 번호를 함께 보관한다.
- 번호가 없거나 검증에 실패하면 자동 병합하지 않는다.
- 검증 실패한 가져오기 행은 삭제하지 않고
검토 필요로 보관한다.
활성 대표 고객에는 (store_id, normalized_phone) 중복 방지 제약을 적용한다. 병합된 통합 대상 고객은 원본 보존을 위해 같은 번호를 유지할 수 있다.
9.2 고객 병합
병합 작업은 다음 처리를 하나의 작업으로 완료해야 한다.
- 대표 고객 확정
- 통합 대상 고객을
병합됨으로 변경 - 시술 기록 재연결
- 예약 확인 건 재연결
- 미래 예약 및 발송 예정 알림톡 재검증
- 병합 이력 생성
- 고객 단계와 마지막 방문일 재계산
중간 오류가 발생하면 전체 작업을 되돌린다.
시술 기록과 예약 확인 건에는 다음 값을 남긴다.
- 현재 고객 식별값
- 원래 고객 식별값
- 병합 이력 식별값
병합하더라도 시술 기록의 작성자, 작성일, 실제 담당 디자이너는 바꾸지 않는다.
9.3 동의 상태 병합
- 개인정보 동의와 마케팅 수신동의를 따로 관리한다.
- 한쪽에 마케팅 수신 거부가 있으면 수신 거부를 기본 제안한다.
- 병합으로 새로운 마케팅 수신동의를 만들지 않는다.
- 동의일, 거부일, 경로, 변경자를 모두 이력으로 보관한다.
- 동의 충돌은 원장님이 검토해야 병합을 완료할 수 있다.
9.4 고객 단계 계산
단계는 저장된 표시값만 믿지 않고 예약 확인 건, 완료 시술 기록, 미래 예약을 바탕으로 다시 계산할 수 있어야 한다.
재계산 시점:
- 예약 생성·수정·취소
- 방문 결과 변경
- 시술 기록 저장
- 다음 예약 저장
- 병합 및 병합 취소
- 뜸해짐 정기 계산
여러 조건이 동시에 발생할 수 있으므로 단계 우선순위는 확인이 필요하다. 구현 가능한 초기 제안은 다음과 같다.
- 달력 기준 2개월 경과 및 미래 예약 없음 → 뜸해짐
- 미래 예약 있음 → 다음 예약 잡힘
- 완료 시술 2회 이상 → 재방문 고객
- 완료 시술 1회 이상 → 시술 완료
- 방문 예정 예약 있음 → 방문 예약됨
- 그 외 등록 고객 → 문의 중
이 우선순위는 첫 개발 확정 전에 원장님 확인이 필요하다.
10. 알림톡 자동화
전날 예약 확인
- 발송 시각: 방문 전날 오후 6시
- 시간대:
Asia/Seoul - 대상: 내일 방문 예정이며 고객 취소·매장 취소되지 않은 예약 확인 건
- 내용:
- 방문 일시
- 담당 디자이너
- 예정 시술
- 변경·취소 안내
당일 예약 안내
- 발송 시각: 방문 예정 시각 3시간 전
- 대상:
- 방문 예정 시각이 지나지 않음
- 고객 취소·매장 취소되지 않음
- 유효한 예약 연락처 스냅샷이 있음
발송 중지 조건
- 발신 프로필이 유효하지 않음
- 템플릿을 사용할 수 없음
- 예약 연락처가 검토 필요 상태
- 고객 병합 검토가 끝나지 않음
- 병합 후 대표 번호와 예약 연락처가 충돌함
- 예약이 고객 취소 또는 매장 취소됨
중복 발송 방지
다음 조합으로 중복 방지 키를 만든다.
가게 + 예약 확인 건 + 안내 종류 + 발송 기준 버전
- 같은 예약과 안내 종류는 한 번만 성공 처리한다.
- API 결과가 중복 수신돼도 최종 상태를 잘못 변경하지 않는다.
- 이미 성공한 메시지는 예약 상태 변경만으로 자동 재발송하지 않는다.
- 예약 시간이 변경되면 아직 성공하지 않은 예정 작업만 다시 계산한다.
실패 대체 처리
알림톡 연결 불가 또는 발송 실패 시 다음 정보를 예약 확인 건에 남긴다.
- 수동 연락 일시
- 연락 채널
- 연락 결과
- 처리 직원
- 추가 메모
11. 자료 가져오기 기준
가져오기 구조
원본 CSV를 운영 데이터에 바로 반영하지 않는다.
업로드
→ 임시 저장
→ 열 연결
→ 형식 검증
→ 중복 검토
→ 반영 미리 보기
→ 최종 반영
중복 생성 방지
- 가져오기 작업 식별값을 저장한다.
- 원본 파일의 행 번호를 저장한다.
- 같은 작업을 다시 실행해도 이미 반영된 고객과 시술 기록을 다시 만들지 않는다.
- 오류 행만 수정해 재처리할 수 있어야 한다.
담당자 연결
| CSV 값 | 처리 |
|---|---|
| 현재 직원 한 명과 일치 | 해당 직원 연결 제안 |
| 같은 이름 직원이 여러 명 | 원장님 선택 |
| 현재 직원과 일치하지 않음 | 이전 담당자 텍스트로 보존 |
| 빈값 | 담당자 미지정 |
가져오기 완료 결과
- 새 고객 생성 결과
- 기존 고객 연결 결과
- 병합 완료 결과
- 전화번호 오류 행
- 날짜 오류 행
- 담당자 연결 검토 행
- 반영하지 못한 행과 오류 이유
- 재처리 가능한 검토 필요 목록
대화와 통화 내용은 가져오기 데이터 구조에 포함하지 않는다.
12. 권장 기술 구성
웹과 서버
- Next.js App Router
- TypeScript
- 서버에서 인증과 권한 검사
- 화면과 서버 요청 모두 동일한 가게·담당 고객 범위 적용
데이터 저장
- 관계형 데이터베이스 사용
- 고객, 예약 확인 건, 시술 기록, 병합 이력을 관계로 연결
- 시술 사진은 권한이 적용되는 별도 파일 저장소 사용
- 데이터베이스에는 사진의 접근 경로와 연결 정보만 저장
자동 작업
- 예약 발송 일정을 처리할 작업 실행기 사용
- 뜸해진 고객을 정기적으로 다시 계산
- 실패한 작업을 재시도하더라도 중복 발송되지 않도록 설계
- 모든 날짜는 저장 시 기준 시각을 명확히 하고 화면 및 발송 계산은
Asia/Seoul로 처리
카카오 알림톡 연결
예약 확인 건
→ 발송 대상 검증
→ 알림톡 요청
→ 요청 식별값 저장
→ 결과 수신
→ 성공·실패 상태 반영
→ 실패 시 수동 연락 대상으로 표시
특정 알림톡 공급사가 바뀌어도 예약 확인 기능 전체를 수정하지 않도록 발송 연결 부분을 분리한다.
13. 운영 지표
별도 통계 화면을 추가하지 않고 첫 개발에서는 오늘·내일 예약 확인 화면의 원장님 요약 영역에 표시한다.
| 지표 | 계산 |
|---|---|
| 노쇼율 | 시술 완료 또는 노쇼인 예약 확인 건 중 노쇼 비율 |
| 예약 확인 안내 발송률 | 내일·당일 발송 대상 중 예정된 안내가 성공한 비율 |
| 두 달 내 재방문율 | 관찰 기간이 지난 시술 고객 중 이전 시술일에서 달력 기준 2개월 안에 다음 시술을 완료한 비율 |
| 시술 기록 완료율 | 시술 완료 건 중 시술 종류와 시술 메모가 있는 시술 기록이 연결된 비율 |
| 시술 직후 재예약률 | 시술 완료 건 중 시술 기록 작성 시 다음 예약도 저장한 비율 |
분모가 없는 기간에는 잘못된 0% 대신 계산할 대상이 없음을 표시한다.
14. 첫 개발 완료 기준
다음 항목이 모두 동작해야 첫 개발이 완료된 것으로 본다.
계정과 권한
- 원장님이 가게와 직원 계정을 관리할 수 있다.
- 원장님은 가게 전체 고객을 볼 수 있다.
- 디자이너는 허용된 담당 고객만 자세히 볼 수 있다.
- 다른 가게의 고객, 예약, 사진, CSV 원본에 접근할 수 없다.
- 계정을 차단하면 즉시 접근이 중지된다.
- 조회·수정·내보내기 기록이 남는다.
- 대체 시술 시 열람 방식이 확정되고 구현돼 있다.
고객과 시술 기록
- 휴대전화 번호 형식이 달라도 같은 정규화 번호로 검색된다.
- 같은 가게와 같은 정규화 번호의 활성 고객이 중복 생성되지 않는다.
- 고객 상세에서 전체 시술 이력, 염색약 번호, 배합을 볼 수 있다.
- 시술 종류와 시술 메모를 필수로 저장한다.
- 시술 사진과 다음 예약은 선택적으로 저장한다.
- 시술 기록의 작성자와 실제 담당 디자이너가 남는다.
예약과 알림톡
- 예약 확인 건을 직접 등록하고 수정할 수 있다.
- 예약 당시 고객명과 연락처가 별도로 보존된다.
- 방문 결과를 네 가지 상태로 기록할 수 있다.
- 전날 오후 6시 예약 확인 알림톡이 자동 발송된다.
- 방문 3시간 전 당일 안내 알림톡이 자동 발송된다.
- 성공, 실패, 처리 중 결과가 예약 확인 건에 남는다.
- 취소 또는 시간 변경 시 미래 발송 일정이 다시 계산된다.
- 이미 성공한 메시지가 자동으로 중복 발송되지 않는다.
- 연결 불가 또는 실패 시 수동 연락 결과를 남길 수 있다.
내부 할 일과 뜸해진 고객
- 시술 완료 처리 후 시술 기록이 없으면 담당 디자이너 할 일이 한 번 생성된다.
- 시술 기록을 연결하면 할 일이 자동 완료된다.
- 마지막 시술 후 달력 기준 2개월이 지나고 미래 예약이 없으면 뜸해진 고객으로 분류된다.
- 뜸해진 고객 목록에 마케팅 수신동의 상태가 표시된다.
- 고객별 연락 일시, 연락 채널, 연락 결과를 저장할 수 있다.
- 새 예약을 만들면 뜸해짐 상태가 다시 계산된다.
자료 가져오기와 병합
- 고객 정보, 방문 이력, 염색약 번호, 시술 메모를 CSV로 가져올 수 있다.
- 오류 행이 삭제되지 않고 검토 필요로 보관된다.
- 오류 행만 수정해 다시 처리할 수 있다.
- 같은 파일을 다시 처리해도 데이터가 중복 생성되지 않는다.
- 대표 고객과 통합 대상 고객을 구분할 수 있다.
- 이름, 담당자, 동의, 미래 예약 충돌을 검토할 수 있다.
- 병합이 중간 실패하면 일부 기록만 이동하지 않는다.
- 병합 이력과 원래 고객 식별값이 남는다.
- 원장님이 병합을 작업 단위로 취소할 수 있다.
목표 규모 검증
- 직원 2~4명과 고객 999명 상당의 시험 자료로 고객 검색, 목록, 가져오기, 단계 재계산을 검증한다.
- 여러 직원이 같은 고객을 수정하거나 병합할 때 버전 충돌 또는 잠금 처리가 동작한다.
- 사진과 CSV 원본은 권한 검사를 통과한 직원만 열 수 있다.
15. 구현 순서
1단계: 가게·로그인·권한
- 가게
- 직원 소속
- 원장님·디자이너 역할
- 서버 권한 검사
- 감사 기록
2단계: 고객·시술 기록
- 고객 등록과 휴대전화 번호 검색
- 전화번호 정규화
- 고객 상세
- 시술 기록과 사진
- 동의 이력
3단계: 예약 확인
- 예약 확인 건
- 예약 연락처 스냅샷
- 오늘·내일 목록
- 방문 결과
- 다음 예약 등록
4단계: 자료 가져오기와 병합
- CSV 임시 저장
- 열 연결과 오류 검토
- 중복 고객 병합 검토
- 병합 이력과 취소
5단계: 알림톡과 내부 자동화
- 발신 프로필 및 템플릿 설정
- 전날 오후 6시 발송
- 방문 3시간 전 발송
- 결과 수신
- 수동 연락 대체
- 시술 기록 미작성 할 일
6단계: 뜸해진 고객과 지표
- 고객 단계 재계산
- 뜸해진 고객 목록
- 연락 이력
- 핵심 운영 지표
7단계: 권한·오류·복구 검증
- 가게 간 데이터 격리
- 디자이너 담당 고객 제한
- 중복 발송 방지
- 가져오기 재처리
- 병합 취소
- 동시 수정 충돌
- 사진 접근 권한
16. 개인정보와 메시지 운영 참고
- 고객 등록 시 이용 목적, 수집 항목, 보유기간을 안내하고 동의 상태·일시·경로를 저장한다.
- 기존 자료에서 동의 사실을 확인할 수 없으면
동의 미확인으로 표시한다. - 개인정보 동의와 마케팅 수신동의는 분리한다.
- 예약 확인과 당일 안내에 할인 또는 재방문 권유를 섞지 않는다.
- 광고성 메시지는 마케팅 수신동의 고객만 대상으로 한다.
- 광고성 메시지에는 광고 표시와 수신거부 방법이 필요하다.
- 밤 9시부터 아침 8시 사이 광고 발송은 별도 동의가 없으면 차단한다.
- 시술 사진은 선택 항목으로 두고 촬영·보관 동의와 보관기간을 관리한다.
- 피부 상태나 알레르기는 기본 필드로 만들지 않는다.
- 보유기간 경과 또는 삭제 요청이 있으면 삭제하거나 알아볼 수 없게 처리할 수 있어야 한다.
- 실제 동의 문구, 보유기간, 알림톡 템플릿 분류는 출시 전에 운영 조건을 확인해야 한다.
17. 확인 필요 항목
| 항목 | 확인해야 하는 내용 |
|---|---|
| 대체 시술 열람 권한 | 임시 승인, 예약별 대체 담당 지정, 담당자 변경, 제한 열람 중 사용할 방식 |
| 고객 단계 우선순위 | 미래 예약과 재방문 고객 조건이 동시에 맞을 때 표시할 단계 |
| 뜸해짐 기준 | 달력 기준 2개월을 그대로 사용할지 여부 |
| 고객 확인 상태 | 미확인, 확인, 변경 요청, 연락 안 됨 등 실제 사용할 상태값 |
| 늦게 등록된 예약 | 전날 오후 6시 이후 내일 예약을 등록했을 때 즉시 보낼지 수동 연락으로 돌릴지 |
| 임박 예약 | 방문 3시간 이내에 새 예약을 등록했을 때 당일 안내를 즉시 보낼지 여부 |
| 카카오 알림톡 | 발신 프로필, 템플릿, API 공급사와 결과 수신 조건 |
| 직원 로그인 | 이메일·비밀번호, 휴대전화 인증 등 사용할 로그인 수단 |
| 개인정보 보유기간 | 고객과 시술 사진에 적용할 실제 기간 |
| 다른 번호 수동 병합 | 번호가 다른 고객을 원장님이 병합할 수 있게 할지 여부 |