자동 발송 (예약 안내 등)¶
진입: 예약노트 좌측 "발송 설정" / CRM 고객관리 룰 관리 발송 엔진: 알리고 SMS
한 줄 요약
환자 수동 입력 없이 트리거(예약 / 결제 / 시술) 기반으로 자동 SMS 발송. 두 가지 시스템: 예약노트 발송설정 (즉시/예약) + 고객관리 자동 룰 (D+N 안내).
자동 발송 두 갈래 비교¶
| 구분 | 예약노트 발송설정 | 고객관리 자동 룰 |
|---|---|---|
| 트리거 | 예약 등록/수정 시 4종 버튼 | 매일 09:00 배치가 결제/시술 후 D+N 매칭 |
| 대상 | 한 환자 (현재 예약) | 다수 환자 일괄 |
| 발송 시점 | 즉시 또는 운영자 지정 시각 | 매일 09:00 자동 |
| 수정 | 운영자가 본문 직접 입력 | 룰의 템플릿 사용 (변수 치환) |
| 상세 | 예약노트 | 시술별 안내 자동 발송 |
예약노트 발송 설정 (WI#18 v2/v2.1)¶
4종 발송 항목¶
| 항목 | 트리거 | 본문 |
|---|---|---|
| 오시는길 | 즉시 | 병원 주소 + 카카오맵 링크 |
| 즉시 | 즉시 | 환자 맞춤 안내 (운영자 직접 작성) |
| 전일 | 예약 D-1 (전일) | 예약 안내 + 시간 |
| 당일 | 예약 D (당일 아침) | 오늘 예약 안내 |
두 버튼 (즉시 / 예약)¶
각 항목마다 [즉시] [예약] 2개 버튼 (Phase v2.1):
| 버튼 | 동작 |
|---|---|
| 즉시 | 클릭 → 미리보기 모달 → [확정] → aligo 즉시 발송 + sms_reserve (status=sent) |
| 예약 | 클릭 → datetime 입력 → 모달 → [확정] → sms_reserve (status=pending) → 1분 cron이 시각 도래 시 자동 발송 |
1분 cron 자동 발송¶
[1분마다 실행 cron (alpha-api/cron/smsReserveProcessor.js)]
↓
SELECT * FROM sms_reserve WHERE status='pending' AND send_at <= NOW()
↓
각 행 → 알리고 API 호출 → 성공 시 status='sent' / 실패 시 status='failed'
발송 시각 검증¶
- 예약 시각은 현재로부터 1분 이상 미래여야 함
- 과거 시각 입력 시 클라이언트 검증으로 차단
고객관리 자동 룰 (D+N 안내)¶
매일 09:00 배치가 룰에 매칭되는 환자에게 자동 SMS:
- R1 한약 해독 D+1 — 해독 결제 다음날
- R3 재내원 안내 — 결제 후 25/55/85/115/145/175일
- R4 피코/브이레이저 D+7
- R5 슈링크 D+30
- 기타 운영자 추가 룰
상세: 시술별 안내 자동 발송
공통 안전장치¶
| 항목 | 동작 |
|---|---|
| 수신거부 자동 차단 | sms_consent=0, ad_consent=0 환자 발송 제외 |
| 중복 발송 방지 | 예약노트 — 동일 항목 1회만 / 자동 룰 — UNIQUE(rule_id,patient_id,date) + 7일 lookback |
| 빈 전화번호 차단 | mobile_phone 빈 환자 자동 제외 |
| 알리고 API 실패 시 재시도 | 자동 재시도 없음 — 운영자가 발송이력에서 [재발송] 수동 처리 |
:material-flow-chart: 발송 흐름 상세¶
예약노트 [예약] 발송¶
1. 운영자가 예약노트에서 환자 예약 등록
2. 좌측 [발송 설정] 영역 → "전일" [예약] 클릭
3. datetime-local 입력 (예: 2026-05-25 10:00) → 미리보기 모달
4. [확정] → POST /api/sms/reserve
↓
5. sms_reserve INSERT (status='pending', send_at='2026-05-25 10:00:00')
↓
6. 1분 cron이 매분 SELECT — 시각 도래 시 알리고 발송 → status='sent'
↓
7. 환자 수신
고객관리 자동 발송¶
1. (어제) 환자가 결제 (해독 한약)
2. (오늘 09:00) customerMgmtAutoBatch.js 실행
3. R1 룰 매칭 SELECT — 어제 결제 + 해독 키워드 환자 추출
4. UNIQUE(rule_id,patient_id,today) INSERT 시도 — 중복 차단 통과
5. auto_send=1 → 즉시 알리고 발송 + crm_task_logs INSERT (action='sent')
6. 환자 수신 — "해독 시작 1일차 안내"
발송 이력 조회¶
| 위치 | 표시 |
|---|---|
| 예약노트 좌측 "발송 이력" | 해당 환자의 SMS 이력 (자동/수동 모두) |
/crm/tasks 고객관리 리스트 |
자동 룰 발송 + 일괄 발송 통합 |
| 고객관리 상세 팝업 「문자」 탭 | 환자별 문자/통화 이력 |
sms_send_logs 테이블 |
모든 발송 (Direct DB 확인) |
자주 묻는 질문 / FAQ¶
Q. 예약노트에서 '전일' 발송이 안 갔어요
체크 순서:
1. sms_reserve 에 INSERT 됐는지 (status='pending' or 'sent')
2. 예약일자가 미래인지 (이미 지난 예약은 발송 안 함)
3. 환자 전화번호/수신동의 정상인지
4. 1분 cron이 정상 동작 중인지 (pm2 list 에 cron 프로세스 확인)
5. 알리고 잔액 부족 시 발송 실패 — 알리고 계정 확인
Q. 자동 룰이 매일 09:00에 안 돌아요
PM2 cron job customerMgmtAutoBatch 또는 crontab 항목 확인. 시간이 맞지 않으면 서버 timezone 점검.
Q. 예약 시각이 1분 미만이라고 거부됐어요
클라이언트 검증으로 차단 (서버 시계와 다를 수 있어 안전 마진). 1분 이상 미래로 설정.
Q. 자동 발송된 SMS를 취소하고 싶어요
sms_reserve.status='pending' 상태에서만 취소 가능. 이미 발송된 (status='sent')는 알리고 발송 취소 불가.
예약노트 발송 이력에서 [취소] 버튼 (status='pending' 행만).
Q. 같은 환자에게 예약노트와 자동 룰이 동시 발송될 수 있나요?
예. 두 시스템은 독립적이라 동시 발송 가능 — 다만 트리거 조건이 다르므로 일반적으로 시점이 겹치지 않음. 의도된 중복(예약 안내 + 시술 후 안내)은 정상.
Q. 1분 cron이 지연되면 어떻게 되나요?
다음 cron 실행 시 누락된 항목 함께 처리. 1~2분 지연은 정상 범위. 10분 이상 지연 시 cron 프로세스 점검 필요.
관련 페이지¶
- 예약노트 SMS 4종 — 예약노트의 발송설정 상세
- 시술별 안내 자동 발송 — 고객관리 자동 룰
- 단건 / 대량 SMS 발송 — 수동 발송 흐름
- 고객관리 리스트 — 발송 이력 통합 검색
- 정합성 점검 — SMS 미수신 등 이슈 처리