SalesPulse — IMAGINE AX 2026에 실전 투입한 VIP 세일즈 대시보드
무엇을 만들었나
IMAGINE AX 2026은 CongKong이 주관한 기술 컨퍼런스다. VIP 참가자 수십 명이 현장 체크인을 할 때마다 담당 영업사원이 실시간으로 알림을 받고, 모바일 웹에서 VIP 목록과 체크인 상태를 즉시 확인할 수 있는 시스템을 만들었다.
이름은 SalesPulse. CongKong 플랫폼(Go Echo v4 + Vue 3)에 신규 모듈로 붙였다.
왜 만들었나
행사 운영팀이 수동으로 VIP 체크인을 영업사원에게 전달하고 있었다. 현장에서 VIP를 놓치면 비즈니스 미팅 기회가 사라지는데, 연락 지연이 5~10분씩 나는 경우가 많았다. 알림이 자동화되면 그 격차가 0이 된다.
아키텍처 결정
비동기 알림톡
체크인 처리 흐름은 이미 있었다. 거기에 VIP 체크인 훅을 붙이는 방식을 선택했다.
[체크인 API] → IsVIP() 판별
↓ (non-blocking)
owlbear 비동기 발행
↓
processVipCheckin()
├─ field1 파싱 → 담당자 ID 목록
├─ 담당자 Attendee 조회 → 핸드폰 번호
└─ 카카오 알림톡 발송 + 로그 기록
체크인 응답이 알림톡 발송을 기다리면 안 되기 때문에 owlbear(내부 이벤트 버스)를 통해 비동기로 처리했다. 현장 체크인 속도는 그대로 유지되면서 알림은 병렬로 간다.
인증 최소화
영업사원을 위해 별도 계정을 만드는 건 오버엔지니어링이었다. 이름 + 핸드폰 번호로 기존 Attendee 레코드를 매칭하고 Redis 임시 토큰(TTL 24h)을 발급하는 방식으로 해결했다. 행사 당일 하루짜리 세션이라 영구 계정이 필요 없다.
VIP-담당자 매핑
신규 테이블을 만드는 대신 기존 attendee.field1 컬럼을 재활용했다. VIP 레코드의 field1에 담당자 Attendee ID를 | 구분 문자열로 저장하는 방식. 1:N, N:M 모두 지원하면서 스키마 변경을 최소화했다.
백엔드 구현 (server/featurev3/vipsales/)
Go 모듈 4개 파일로 구성했다.
- domain.go: 모델 정의 (
VipConsultationLog,VipCheckinNotifyLog)와 유틸 함수 (IsVIP,IsSales,ParseManagerIDs) - notifier.go: owlbear 구독/발행, 알림톡 발송, Redis 토큰 관리, AutoMigrate
- handler.go: API 핸들러 5개 (영업사원 API 3개 + 어드민 API 2개)
- router.go:
init()에서 라우트 등록
SQL 최적화도 했다. VIP 목록 조회 시 이벤트 전체 check_log를 GROUP BY하면 규모가 커질수록 느려진다. VIP ID 목록을 먼저 뽑고 그 범위 안에서만 체크인 로그를 JOIN하는 2-step 쿼리로 바꿨다.
프론트엔드 구현 (front/src/features/vip-sales-dashboard/)
Vue 3 Composition API + Pinia + Tailwind. 모바일 퍼스트로 설계했다.
대시보드 핵심 UI:
- 2×2 탭 그리드: 전체 / 도착 / 사전등록 / 미도착 — 탭 클릭으로 VIP 목록 즉시 필터
- VIP 카드: 이름, 소속, 직책, 체크인 상태 배지, 전화(
tel:) / 문자(sms:) 버튼 - 알림 Bottom Sheet: 🔔 클릭 시 slide-up 애니메이션, VIP 알림 목록, 카드로 스크롤 이동
- 상담일지 모달: VIP별 메모 작성/조회 (fade-in 애니메이션)
알림 폴링은 30초 주기 setInterval로 구현했다. SSE나 WebSocket은 이 사용 패턴에 과했다. 행사 당일 몇 시간 동안만 쓰는 기능이고, 영업사원 수십 명이 동시 접속하는 규모이기 때문에 폴링이 더 예측 가능하고 운영하기 쉬웠다.
어드민 탭도 추가했다. VIP-담당자 매핑 현황 테이블, 담당자 검색 드롭다운, 알림톡 성공/실패 표시까지.
IMAGINE AX 2026 실전
행사 당일 VIP 수십 명이 체크인하면서 SalesPulse가 실제로 돌아갔다. 알림톡이 VIP 체크인 직후 자동으로 발송되었고, 영업사원들이 모바일 웹에서 VIP 상태를 실시간으로 확인했다.
수동으로 연락을 전달하던 방식에서 알림이 자동화되면서 영업팀의 응대 속도가 올라갔다.
돌아보면
기존 플랫폼(CongKong)에 새 기능을 붙이는 작업이라 기존 코드 구조를 먼저 파악하는 게 중요했다. 어드민 권한 체계(Casbin), 기존 체크인 플로우, owlbear 이벤트 버스 등 내부 인프라를 제대로 이해하고 나서야 최소한의 변경으로 원하는 기능을 구현할 수 있었다.
신규 테이블을 최소화하고, 기존 구조를 최대한 재활용하는 방향으로 설계한 것이 결과적으로 빠른 구현과 안정적인 운영으로 이어졌다.