🔔 봉이모바일 알림 통합 관리 시스템

flow-notifications.html · 2026-06-08 · 카카오 알림톡 + 앱 푸시 + SMS 통합 운영
📢 봉이모바일 모든 알림을 단일 시스템으로 통합 관리 — 채널 3종(카카오 알림톡·앱 푸시·SMS), 카테고리 3종(개통/법정·마케팅·운영), 봉이 DB 연결 자동 트리거 + cron 리마인드 + SMS fallback.
1알림 채널 3종
💬
카카오 알림톡
유료 (건당 8~12원)
법정 안내 · 개통 알림 · 페이백 입금
(카카오톡 채널 미추가 고객도 발송 가능)
📲
앱 푸시
무료
회원 전용 · 마케팅·일반 알림
(앱 미설치자 발송 불가)
📩
SMS / LMS
유료 (건당 20~80원)
카카오 알림톡 실패 fallback
비회원 긴급 안내
💰 비용 정책: 카카오 알림톡은 건당 유료이므로 법정 안내 + 페이백 등 가입자 영업 알림에만 사용. 마케팅·일반 알림은 앱 푸시(무료)로 처리. 앱 미설치 비회원에게는 카카오 알림톡 또는 SMS fallback.
2알림 분류 (개통·마케팅·운영)
#알림명카테고리채널트리거설명
1무선개통신규개통/법정카카오 알림톡incentive_sales휴대폰 단말+회선 개통 즉시. 요금제 변경가능일 + 부가서비스 해지가능일 안내
2유선개통신규개통/법정카카오 알림톡incentive_internet_tickets인터넷+TV 설치 완료 즉시. 요금제 변경 가능일 + 해지 가능일 안내
3유심개통신규 (MNO)개통/법정카카오 알림톡incentive_sales · product_type='유심'통신 3사 직접 유심 개통. 약정만료일 + 최소유지기한
4유심개통신규 (MVNO)개통/법정카카오 알림톡bongi_mvno_subscriptions봉이 알뜰폰 개통. 환수금/위약금 안내
5부가서비스 해지가능일 리마인드개통/법정카카오cron D-3해지 가능일 도래 3일 전 자동
6요금제 변경 가능일 리마인드개통/법정카카오cron D-3변경 가능일 도래 3일 전 자동
7비회원 → 회원 전환 유도마케팅카카오bongi_customers (비회원)가입 안 한 고객에게 3단계 유도
8현금 페이백 입금 알림마케팅카카오bongi_withdrawals승인 → 계좌 입금 시 즉시
9~회원 일반 알림운영앱 푸시bongi_notifications~156종 (포인트·이벤트·상품·계약 등)
SMS fallback전체SMS알림톡 실패 자동카카오 알림톡 발송 실패 시 SMS 대체
3개통 알림톡 메시지 템플릿 (6종)
① 무선개통신규 (휴대폰)
{{고객명}} 고객님!
{{개통일}} 정상적으로 개통 완료되었습니다🎉
봉이모바일 {{매장명}}에서 구매해 주셔서 감사합니다🙏

☑️가입정보 안내
· 통신사 : {{통신사}}
· 가입요금제 : {{요금제명}}
· 요금제 변경가능일 : {{변경가능일}}
· 부가서비스명 : {{부가서비스목록}}
· 부가서비스 해지가능일 : {{해지가능일}}
· 기기변경 가능일 : 개통일 기준 {{기변M}}개월 이후

📢 [필독] 부가서비스 해지·요금제 변경 가능일 도래 시 알림톡 안내드립니다!
② 유선개통신규 (인터넷+TV)
{{고객명}} 고객님!
{{설치일}} 정상적으로 설치 완료되었습니다🎉

☑️가입정보 안내
· 가입 상품명 : {{상품명}}
· 요금제 변경 가능일 : {{변경가능일}}
· 해지 가능일 : {{해지가능일}}

📢 [필독] 요금제 변경·해지 가능일 도래 시 알림톡 안내드립니다!
③ 유심개통신규 (MNO) / ④ 유심개통신규 (MVNO)
WELCOME
개통 완료 안내🔔

안녕하세요 {{고객명}} 고객님!
{{개통일}} 유심이 정상적으로 개통 완료되었습니다🎉
봉이모바일 {{매장명_or_봉이알뜰폰}}을 이용해 주셔서 감사합니다🙏

☑️가입정보 안내
· 통신사 : {{통신사}}
· 가입요금제 : {{요금제명}}
· 약정만료일 : {{약정만료일_or_무약정}}
· 최소 유지기간 종료일 : {{최소유지기한}}

📢 [필독] 환수금/위약금 발생 조건 안내
1. 최소유지기간 이전 해지/번호이동 시 지원금 환수금 발생 가능
2. 최소유지기간 이후라도 약정만료일 이전 해지 시 위약금 발생 가능
3. 환수금/위약금 회피 → 최소유지기간 + 약정만료일까지 유지

채널 추가하고 이 채널의 마케팅 메시지 받기
[채널 추가]
⑤ 부가서비스 해지가능일 리마인드 (cron D-3)
REMINDER
🔔부가서비스 해지 가능일 안내

안녕하세요 {{고객명}} 고객님!
봉이모바일에서 {{개통일}} 개통 시 가입하신 일부 부가서비스의 해지 가능일 안내드립니다.

· 해지 가능일 : {{해지가능일}}

📌 유의사항
· 114 고객센터 또는 통신사 앱/홈페이지에서 해지 가능
· 요금제·프로모션에 따라 해지 가능일이 달라질 수 있음
· 부가서비스마다 해지 가능일이 다를 수 있으니 가입 시 받은 원본 서류 확인

[채널 추가] [봉이모바일 홈페이지]
⑥ 요금제 변경 가능일 리마인드 (cron D-3)
REMINDER
🔔요금제 변경 가능일 안내

안녕하세요 {{고객명}} 고객님!
봉이모바일에서 개통 후 요청하셨던 필수사용 요금제의 변경 가능일이 도래하여 안내드립니다.

· 가입 통신사 : {{통신사}}
· 현재 요금제 : {{현재요금제}}
· 요금제 변경 가능일 : {{변경가능일}}

📌 유의사항
· 114 고객센터 또는 통신사 앱/홈페이지에서 변경 가능
· 통신사·프로모션·지원 조건에 따라 변경 가능한 최저 요금제 기준 상이
· 요금제 변경 시 지원금 환수(위약금) 발생 가능 → 가입 시 받은 원본 서류 확인

[채널 추가] [봉이모바일 홈페이지]
4통신사별 D-day 계산 룰
구분SKTKTLG U+비고
요금제 변경가능일 (무선)개통일 +185일 공통휴대폰
부가서비스 해지가능일EOMONTH(M, 2) + 2일EOMONTH(M, 3) + 2일M + 100일SKT: 개통월말+2개월+2일
최소유지기한 (유심 MNO·MVNO)EOMONTH(M, 6) + 2일M + 185일M + 185일유심
약정만료일EDATE(개통일, 약정개월)12/24M 약정 / MVNO는 무약정
기기변경 가능일개통일 +18개월 공통휴대폰
요금제 변경가능일 (유선)개통일 +12개월 공통인터넷+TV
해지가능일 (유선)개통일 +36개월 공통인터넷+TV
📌 Postgres 수식 예시 (서버에서 계산):
-- 부가서비스 해지가능일 (통신사별)
CASE
  WHEN carrier LIKE '%SK%' THEN (date_trunc('month', activation_date) + interval '3 month' - interval '1 day')::date + 2
  WHEN carrier LIKE '%KT%' THEN (date_trunc('month', activation_date) + interval '4 month' - interval '1 day')::date + 2
  WHEN carrier LIKE '%LG%' THEN activation_date + 100
END AS addon_cancellable_date
5트리거 시스템 (3가지 모드)
🟢 즉시 발송 (개통 완료 시)
STEP 1
📋
개통 DB
status='activated'
STEP 2
Postgres Trigger
(NOTIFY)
STEP 3
🔧
Edge Function
(템플릿 + 변수 매핑)
STEP 4
📤
카카오 알림톡 API
발송 + 로그
🟡 cron 리마인드 (D-day 도래)
STEP 1
pg_cron 일배치
매일 09:00
STEP 2
🔍
개통 DB 조회
(D-3 + 미발송)
STEP 3
🔧
템플릿 + 변수 매핑
STEP 4
📤
카카오 알림톡 발송
🔴 SMS fallback (알림톡 실패)
STEP 1
📤
알림톡 발송 시도
STEP 2
⚠️
실패 응답
(채널 미추가 등)
STEP 3
🔄
로그 + SMS 대기열
STEP 4
📩
SMS/LMS 발송
(Naver Cloud)
6DB 스키마 (3 신규 테이블)
CREATE TABLE bongi_notification_templates ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), code TEXT UNIQUE NOT NULL, -- 'WIRELESS_NEW' · 'USIM_MNO_NEW' · 'USIM_MVNO_NEW' · 'WIRED_NEW' · 'ADDON_REMIND' · 'PLAN_REMIND' category TEXT NOT NULL, -- '개통/법정' · '마케팅' · '운영' channel TEXT NOT NULL, -- 'kakao' · 'push' · 'sms' title TEXT NOT NULL, body TEXT NOT NULL, -- 변수 {{고객명}} 등 포함 variables JSONB, -- [{key:'고객명', from:'name', type:'string'}, ...] buttons JSONB, -- [{label:'채널 추가', url:'...'}] is_active BOOLEAN DEFAULT true, carrier_rules JSONB, -- {SKT:'EOMONTH(M,2)+2', KT:'...', LG:'M+100'} created_at TIMESTAMPTZ DEFAULT now(), updated_at TIMESTAMPTZ DEFAULT now() ); CREATE TABLE bongi_notification_logs ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), template_code TEXT REFERENCES bongi_notification_templates(code), customer_id UUID REFERENCES bongi_customers(id), source_table TEXT, -- 'incentive_sales' · 'bongi_mvno_subscriptions' 등 source_id UUID, -- 트리거 row id channel TEXT NOT NULL, -- 실제 발송 채널 recipient_phone TEXT NOT NULL, rendered_body TEXT, -- 변수 치환 후 최종 본문 status TEXT NOT NULL, -- 'queued' · 'sent' · 'delivered' · 'failed' · 'fallback_sms' provider_response JSONB, -- 채널톡/카카오 API 응답 failed_reason TEXT, scheduled_at TIMESTAMPTZ, -- D-3 cron의 경우 예약 시각 sent_at TIMESTAMPTZ, delivered_at TIMESTAMPTZ, cost_krw INTEGER, -- 발송 비용 (정산용) created_at TIMESTAMPTZ DEFAULT now() ); CREATE TABLE bongi_notification_settings ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), template_code TEXT REFERENCES bongi_notification_templates(code), trigger_type TEXT NOT NULL, -- 'instant' · 'cron' cron_expression TEXT, -- '0 9 * * *' (매일 9시) days_before INTEGER, -- D-3 · D-7 · D-1 fallback_enabled BOOLEAN DEFAULT true, -- SMS fallback on/off enabled BOOLEAN DEFAULT true, updated_at TIMESTAMPTZ DEFAULT now() ); -- 트리거 함수 (개통 즉시 발송) CREATE FUNCTION notify_on_activation() RETURNS trigger AS $$ BEGIN IF NEW.status = 'activated' AND (OLD.status IS NULL OR OLD.status != 'activated') THEN INSERT INTO bongi_notification_logs (template_code, source_table, source_id, customer_id, recipient_phone, status, scheduled_at) VALUES ('WIRELESS_NEW', TG_TABLE_NAME, NEW.id, NEW.customer_id, NEW.phone, 'queued', now()); PERFORM pg_notify('notification_queue', NEW.id::text); END IF; RETURN NEW; END; $$ LANGUAGE plpgsql;
7카카오 알림톡 API 연동 spec
항목
제공사카카오 비즈메시지 (Bizmessage) 또는 발송 대행사 (Aligo·Solapi·NHN Toast 등)
API 문서대행사별 상이 (Solapi 추천: developers.solapi.com)
인증API Key + Secret (env)
발송 endpointPOST https://api.solapi.com/messages/v4/send
템플릿 등록카카오 비즈센터에 사전 승인된 템플릿 코드 사용 (검수 1~3일)
발송 단위고객 1명당 1 message · 변수 치환 후 발송
실패 사유비활성 사용자·전화번호 오류·발송 제한 (광고성)
응답 처리provider_response JSONB 저장 · 실패 시 SMS fallback queue 자동
비용알림톡 건당 8~12원 · SMS fallback 건당 20~80원
8어드민 API endpoints
Endpoint설명권한
GET /api/notifications/logs발송 이력 조회 (필터: 채널·status·기간·고객·템플릿)admin·manager
POST /api/notifications/send수동 발송 (template_code + customer_id + 변수)admin·manager
POST /api/notifications/retry실패 건 재발송admin·manager
GET /api/notifications/templates템플릿 목록 (6 개통 + 2 마케팅 + ...)admin
POST /api/notifications/templates템플릿 신규/편집 (메시지·변수·버튼)admin
GET /api/notifications/settings트리거 정책 (cron·D-day·on/off)admin
PATCH /api/notifications/settings/{code}트리거 정책 편집admin
GET /api/notifications/stats월별 발송 통계 (건수·비용·실패율)admin·manager
POST /api/notifications/test테스트 발송 (특정 번호로 즉시)admin
9어드민 메뉴 — 🔔 알림 관리
#메뉴기능
1발송 이력채널·기간·status·고객 필터, 상세 보기, 재발송 버튼
2템플릿 관리알림톡 6 + 마케팅 2 + 운영 N 종 편집 (메시지·변수·버튼·통신사 룰)
3트리거 정책즉시/cron 분리, D-3·D-7 변경, on/off 토글, SMS fallback on/off
4통계월별 발송 건수·비용·실패율·채널별 분포·통신사별 KPI
5테스트 발송특정 번호로 즉시 테스트 (운영 검증)
6실패 큐 + SMS fallback실패 건 자동 SMS 전환 + 수동 재발송
10작업 Phase (총 13일)
Phase 1
1d
DB 마이그레이션
3 테이블 + RLS
Phase 2
3d
트리거 시스템
Postgres + Edge Function
Phase 3
2d
채널톡 API 연동
SDK + 인증 + 발송
Phase 4
3d
어드민 UI
발송 이력·템플릿·정책
Phase 5
2d
cron 리마인드
pg_cron + D-3
Phase 6
2d
SMS fallback + 테스트
Naver Cloud + E2E
11핸드오프 패키지 (개발 산출물)
파일설명
docs/handoff/notification-2026-06-08/README.md개요·환경·작업 순서
.../db-schema.sql3 테이블 + 트리거 함수 + RLS
.../templates.md알림톡 6종 메시지 + 변수 자세히
.../data-rules.md통신사별 D-day Postgres 수식
.../kakao-alimtalk-integration.md카카오 알림톡 API (Solapi 등) 인증·템플릿·발송 구현
.../api-endpoints.md9개 어드민 API 사양
.../wf-admin-logs.html발송 이력 화면 mockup
.../wf-admin-templates.html템플릿 편집 화면 mockup
.../wf-admin-settings.html트리거 정책 화면 mockup
💡 현재 단계: 본 flow-notifications.html이 메인 설계 문서. 다음 단계로 위 핸드오프 패키지 9개 파일 작성 + 어드민 wireframe 3개 mockup 진행.