🔔 봉이모바일 알림 통합 관리 시스템
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}}개월 이후
📢 [필독] 부가서비스 해지·요금제 변경 가능일 도래 시 알림톡 안내드립니다!
{{고객명}} 고객님!
{{설치일}} 정상적으로 설치 완료되었습니다🎉
☑️가입정보 안내
· 가입 상품명 : {{상품명}}
· 요금제 변경 가능일 : {{변경가능일}}
· 해지 가능일 : {{해지가능일}}
📢 [필독] 요금제 변경·해지 가능일 도래 시 알림톡 안내드립니다!
WELCOME
개통 완료 안내🔔
안녕하세요 {{고객명}} 고객님!
{{개통일}} 유심이 정상적으로 개통 완료되었습니다🎉
봉이모바일 {{매장명_or_봉이알뜰폰}}을 이용해 주셔서 감사합니다🙏
☑️가입정보 안내
· 통신사 : {{통신사}}
· 가입요금제 : {{요금제명}}
· 약정만료일 : {{약정만료일_or_무약정}}
· 최소 유지기간 종료일 : {{최소유지기한}}
📢 [필독] 환수금/위약금 발생 조건 안내
1. 최소유지기간 이전 해지/번호이동 시 지원금 환수금 발생 가능
2. 최소유지기간 이후라도 약정만료일 이전 해지 시 위약금 발생 가능
3. 환수금/위약금 회피 → 최소유지기간 + 약정만료일까지 유지
채널 추가하고 이 채널의 마케팅 메시지 받기
[채널 추가]
REMINDER
🔔부가서비스 해지 가능일 안내
안녕하세요 {{고객명}} 고객님!
봉이모바일에서 {{개통일}} 개통 시 가입하신 일부 부가서비스의 해지 가능일 안내드립니다.
· 해지 가능일 : {{해지가능일}}
📌 유의사항
· 114 고객센터 또는 통신사 앱/홈페이지에서 해지 가능
· 요금제·프로모션에 따라 해지 가능일이 달라질 수 있음
· 부가서비스마다 해지 가능일이 다를 수 있으니 가입 시 받은 원본 서류 확인
[채널 추가] [봉이모바일 홈페이지]
REMINDER
🔔요금제 변경 가능일 안내
안녕하세요 {{고객명}} 고객님!
봉이모바일에서 개통 후 요청하셨던 필수사용 요금제의 변경 가능일이 도래하여 안내드립니다.
· 가입 통신사 : {{통신사}}
· 현재 요금제 : {{현재요금제}}
· 요금제 변경 가능일 : {{변경가능일}}
📌 유의사항
· 114 고객센터 또는 통신사 앱/홈페이지에서 변경 가능
· 통신사·프로모션·지원 조건에 따라 변경 가능한 최저 요금제 기준 상이
· 요금제 변경 시 지원금 환수(위약금) 발생 가능 → 가입 시 받은 원본 서류 확인
[채널 추가] [봉이모바일 홈페이지]
4통신사별 D-day 계산 룰
| 구분 | SKT | KT | LG 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 + 미발송)
▶
▶
🔴 SMS fallback (알림톡 실패)
▶
▶
▶
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) |
| 발송 endpoint | POST 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.sql | 3 테이블 + 트리거 함수 + RLS |
| .../templates.md | 알림톡 6종 메시지 + 변수 자세히 |
| .../data-rules.md | 통신사별 D-day Postgres 수식 |
| .../kakao-alimtalk-integration.md | 카카오 알림톡 API (Solapi 등) 인증·템플릿·발송 구현 |
| .../api-endpoints.md | 9개 어드민 API 사양 |
| .../wf-admin-logs.html | 발송 이력 화면 mockup |
| .../wf-admin-templates.html | 템플릿 편집 화면 mockup |
| .../wf-admin-settings.html | 트리거 정책 화면 mockup |
💡 현재 단계: 본 flow-notifications.html이 메인 설계 문서. 다음 단계로 위 핸드오프 패키지 9개 파일 작성 + 어드민 wireframe 3개 mockup 진행.