결과물
https://github.com/selfishclub-all/selfish-ops2/pull/2
공유회 CRM 자동화 — n8n 알림톡 ①~⑤ 전체 플로우 성공 + 예약발송 구현 + 카카오모먼트 전환 결정
2주차에 “URL 하나 넣으면 전채널 카피/배너가 자동 생성”까지 만들었는데, 3주차는 그걸 실제로 발송까지 연결하는 과정이었다. 알림톡 9종 중 5종까지 테스트 성공하고, 카플친 발송 구조도 바꿔야 한다는 걸 알게 됨.
만든과정 및 삽질 + 인사이트
-
가장 많이 리소스 투입된 자동화 구축
- 자동화 실행 구조 구축
- 현재는 채널별로 개별 검증 되어있던 상태, 전체 자동화 파이프라인 필요한 상황
- 전체 자동화시 현재 문제점 As-is → To-be
- 현재 상황
- 맥북 off시 클로드코드 비활성화 이슈
- API 연동해서 완료까지 해야하는 것 → 알림톡, 카플친, 인스타(현재X)
- 수동으로 해야하는 것(API안됨) → 온드미디어 세팅, 오픈챗 발송
- 시작시 타임라인별로 슬랙에 받고 싶은데 해당 날에 맥북 꺼져있으면?
- 클로드한테
url + crm 시작해줘가 트리거가 되어 → 각 타임라인별로 들어가야할 것 한번에 전달(그때 수정할건 클로드코드 열면됨)
- 클로드한테
- 맥북이 꺼져있어도 해야할 것 두가지(알림톡, 카플친)
- 하이브리드로 재설계:
- n8n (서버에서 24시간 돌아감): 알림톡 9종 자동 발송
- 클로드 코드 (맥북 켜져 있을 때): 카피 생성 + 배너 생성 + Slack 전달
- 이렇게 나누니까 맥북 꺼져 있어도 알림톡은 알아서 나감
- 하이브리드로 재설계:
- 현재 상황
- 자동화 실행 구조 구축
-
알림톡 n8n 전체 재설계
- 알림톡 PRD(템플릿 정의 및 타임라인)
- As-is: 기존 알림톡 PRD만 만들어놨던 상태, 클로드가 그전 템플릿들이랑 현재 바뀐 템플릿들이랑 매칭 자체가 힘들었음
- To-be: 기존 템플릿 다 버리고 타임라인대로 다시 전달 → 솔라피 템플릿 ID와 매칭시키기
- n8n 크론 재설계
- 기존 n8n 워크플로우가 32노드 → 38노드로 확장
- 핵심: 줌링크 하나만 넣으면 나머지 4개 알림톡에서 자동으로 재사용 (staticData)
- 알림톡 n8n 모달 구축
- situation: 알림톡 템플릿에 등록된
변수말고도 추가적인 카피가 필요함 - problem: 클로드코드로 카피를 보내려면 항상 켜져있어야 함
- solution: n8n 모달을 사용하여
변수명에 같이 카피를 추가하여 보냄
- situation: 알림톡 템플릿에 등록된
- 알림톡 PRD(템플릿 정의 및 타임라인)
-
채널별 PRD/서브 에이전트 분리
- CLAUDE.md 372줄 → PRD 8개로 분리
- 에이전트가 자기 채널과 무관한 정보까지 읽는 문제 해결
-
end-to-end 테스트 (iid_999) — ①~⑤ 성공
- 가짜 공유회 데이터(iid_999) + 안전장치(나한테만 1명 발송)
- n8n ① 오픈알림 삽질기
- 발송이 안옴 / url링크 안 들어감 / 수정했는데 원본으로 다시옴
- 버그 1: Slack 3초 타임아웃 → Respond: 즉시 200 노드 추가
- 버그 2: 수정 미리보기 case 1 빠져있음 → 추가 + header 150자 제한
- 버그 3: Switch 타입 불일치 (문자열 “1” vs 숫자 1) → loose 비교로 변경
- ② 오픈리마인드
- ①② 같은 SOLAPI 노드 쓰던 문제 → ① 전용 노드 분리
- templateId + 변수(#{공유회명}→#{프로그램명}) 수정
- 슬랙 미리보기 카피가 실제 템플릿과 달랐음 → 수정
- ③ D-1 리마인드
- SOLAPI에서
잘못된 파라미터 요청에러 → 문자로 대체 발송됨 - 원인: SOLAPI 템플릿 버튼 URL이
http://#{url}→https://zoom.us/...넣으면http://https://이중 프로토콜 - 해결: v_url에서
https://자동 제거 + 모달에 “https:// 없이 입력” 안내
- SOLAPI에서
- ④ 당일리마인드 — 자동발송 성공 (staticData 줌링크 재사용)
- ⑤ 할인쿠폰 — 모달 확인 완료
-
예약 발송 구현 (Wait 노드)
- 기존: 승인 → 즉시 발송 (SOLAPI 노드에 scheduledDate 옵션 없음)
- 변경: 승인 → Wait 노드 대기 → 해당 시간에 SOLAPI 즉시 발송
- 모달에 발송시간 필드 추가 (기본값 = 해당 알림톡 scheduledTime, 에밀리가 변경 가능)
- 비우면 즉시발송, 시간 입력하면 예약발송
-
4/5 미팅 — 카카오모먼트 전환 결정 + v2 로드맵
- 카플친 발송: SOLAPI = 전화번호 기반, 카카오모먼트 = 채널친구 전체
- Supabase 조회: 멤버십 6,829명 중 카플친 2,865명 (42%)
- 카카오모먼트 API: 건당 15원 동일 + 전화번호 불필요 → 전환 결정
- v2 로드맵: 유저여정 추적, KPI 적응형 CRM, 과거 인사이트 축적
-
Slack 채널 분리
- 기존
#공유회-crm-승인단계→#crm-알림톡-승인단계(n8n 알림톡 모달) - 신규
#crm-카피(클로드코드 카피 레퍼런스) - 카피 찾으려면 알림톡 모달 사이를 뒤져야 했던 문제 해결
- 기존
현재 상황 (다음 세션에서 이어서)
완료:
- ✅ ① 오픈알림
- ✅ ② 오픈리마인드
- ✅ ③ D-1 리마인드
- ✅ ④ 당일리마인드
- ✅ ⑤ 할인쿠폰
- ✅ 예약 발송 (Wait 노드)
- ✅ 모달 발송시간 필드
남은 것:
- 🔲 ⑥ 입장링크 테스트
- 🔲 ⑦ 시작알림 테스트
- 🔲 ⑧ 혜택안내 테스트 + 크론 시간 변경
- 🔲 ⑨ VOD 테스트
- 🔲 ⑤~⑨ 슬랙 미리보기 실제 템플릿 매칭
- 🔲 카카오모먼트 API 전환
- 🔲 CRM 카피를 #crm-카피 채널로 전달
- 🔲 testMode=false + 안전장치 해제
추가 인사이트
-
SOLAPI n8n 노드의 한계
- scheduledDate 옵션이 없어서 Wait 노드로 우회함
- 템플릿 버튼 URL이
http://#{url}형식이라 https:// 포함하면 이중프로토콜 에러 - 각 템플릿마다 변수가 달라서 SOLAPI 노드를 분리해야 함 (공유 불가)
-
n8n 디버깅 팁
- API로 업데이트해도 에디터에서 새로고침 안 하면 이전 버전으로 테스트됨
- Slack 모달 3초 제한 → 무조건 즉시 200 응답 후 백그라운드 처리
- SOLAPI 에러 3109 = 잘못된 파라미터 → 대부분 URL 이중프로토콜 문제
-
데이터 기반 의사결정
- 카플친 2,865명 vs 멤버십 6,829명 → SOLAPI의 한계를 숫자로 확인
- 감으로 결정하지 말고 DB 조회부터
도구 사용
| 도구 | 용도 |
|---|---|
| Claude Code (Opus) | 전체 프로젝트 진행, n8n JSON 수정, 버그 디버깅 |
| oh-my-claudecode | 에이전트 팀 오케스트레이션 |
| n8n | 알림톡 크론 발송, Slack 모달 승인 플로우, Wait 예약발송 |
| SOLAPI | 알림톡 발송 API (에러 로그 조회) |
| Supabase | 멤버십/신청자 데이터 조회, 카플친 도달률 분석 |
| Chrome MCP | n8n 콘솔 직접 테스트 |
| Slack MCP | CRM 스레드 전달 + 채널 분리 |
다음 주 할 것
- n8n ⑥~⑨ 나머지 알림톡 테스트
- 슬랙 미리보기 실제 템플릿 매칭
- 카플친 카카오모먼트 API 전환
- CRM 카피 → #crm-카피 채널 전달