logo

글또 10기의 복주머니, 639명의 참여율을 높인 개인화 메시지 개발기

2025-04-20

임정

Data Analyst

1. 들어가며

안녕하세요. 글또 10기 운영진 CRM 크루 임정입니다. 글또는 2주에 1번씩 글 제출을 기본 활동으로 하는 개발자 커뮤니티로써 Slack을 주 서비스로 사용하고 있습니다. 글 제출 외에도, 소규모 채널 활동을 독려하고 있으며 실제로도 온오프라인을 포함한 다양한 활동을 권장하고 있습니다. 이번 기수에는 무려 639명에 달하는 유저가 모였습니다. 이번 글에서는 Slack을 이미 도입했거나 도입하려는 조직에서 개인화 메시지를 이용한 효율적인 의사소통 방식과 봇을 이용한 자동화를 소개하는 한편, 커뮤니티에서 활동성 지표를 정의하고 공유하여 커뮤니티 활동을 넛지한 과정을 공유 드리겠습니다.

2. 개인화 메시지

2.1. 필요성

slack_logo

Slack은 단순한 대화 형식의 메신저를 넘어 조직 내 협업을 원활하게 할 수 있도록 다양한 기능을 제공하며 특히 Bot(봇)을 이용한 특정 이벤트 발생 시 자동 메시지를 보내거나 데이터를 분석하여 맞춤형 정보를 제공할 수 있다는 장점을 가지고 있습니다. Slack을 이용하여 커뮤니티를 운영하기 위해서는 전체 인원 혹은 일부 인원에게 의사소통하게 됩니다. 운영 주체가 메시지를 보내는 방법으로는 ① 전체 공지 사항 채널에 @channel 태그를 이용한 broadcasting, ② 특정 채널에서 소통, ③ Direct Message 등이 있습니다. 일반적으로 Slack 서비스에 처음 랜딩하는 공지 사항 채널에 초대 후, 주제에 따라 채널을 새로 생성하게 됩니다. 이에 따라 특정 메시지를 전달하고자 하는 대상과 수, 지속성 여부에 따라 다음과 같은 전달 방식을 의사결정 할 수 있습니다.

DT

[그림1. Slack 의사소통 결정 Tree]

CRM 크루는 Slack에서 수집된 데이터로 활용할 수 있는 방안을 고민해 왔고, 글또에서 참여자들의 여러 활동 데이터를 집계해 제공하자는 의견을 모았습니다. 개인화된 데이터를 각자 유저에게 제공하여 자신의 활동을 인지하고 그에 따라 커뮤니티 활성화를 일으키는 한편 유저의 참여율 증가를 유도하는 부가적인 이득을 얻을 수도 있었습니다. 공지사항에서 자주 언급하는 참여자들의 활동이 커뮤니티를 더욱 풍성하게 만들고, 그 풍성함이 다시 참여자에게 돌아가게 되는 선순환 구조를 만들 수 있게 됩니다. 이런 가치를 전달하고 싶었습니다.

특히, 6개월 시즌제로 운영되는 글또 커뮤니티는 시즌 운영 간 신규 유입이 없기 때문에 기존 유저들의 리텐션을 올리기 위한 활동 중 하나로 활용할 수 있다고 생각했습니다. 이런 개인화 메시지는 공공연하게 공유되기 어려운 이벤트성 쿠폰처럼 Customizing이 필요한 메시지로 취급되어 DM이 필수적입니다. 하지만 운영 규모가 100명이 넘어가면 운영 주체가 일일이 DM을 보내고 대응하기 어려운 문제에 봉착하게 됩니다. 글또 10기에서는 이 문제를 보완하고자 Slack bot을 활용하고 있으며, 글 제출을 관리하는 또봇이 대표적인 예시입니다.

카테고리 수집하려다 슬랙 봇까지 개발해 버린 건에 대하여…

저희 CRM 크루는 참여자들에게 활동한 데이터를 전달하기 위하여 복주머니 프로젝트를 진행하기로 했습니다. 메시지를 전달하는 시기를 설날 직전으로 설정했기 때문에, 복주머니에 데이터를 담아 전달하자는 의미를 담았습니다. 복주머니 프로젝트를 추진하는 과정에서 집중해야 할 파트는 2가지로 정리할 수 있습니다.

  1. 글또 슬랙의 유저 로그 데이터를 저장하고, 집계된 데이터를 전송하는 엔지니어링 파트
  2. 참여자에게 전달할 지표를 정의하는 분석 파트
process_flow

[그림2. 개인화 메시지 업무 Flow]

2.2. 형식 구성

글또에서는 이미 개인화 메시지를 발송한 적이 있었습니다. 아래는 9기에 보냈던 개인화 메시지의 예시입니다. 크게는 Slack의 활동 요약, 글 제출 활동, 활동한 주요 채널, 환상의 짝꿍, 커피챗 내용으로 이루어져 있습니다. 우리는 이를 빌려 다음과 같은 형식으로 구조화하였고 여기서 메시지를 좀 더 고도화하고자 하였습니다.

example

[그림3. (좌) 9기 발송되었던 개인화 메시지 예시 / (우) 10기 개인화 메시지 형식 가이드]

위 항목 중 2.슬랙의 활동 요약 / 3. 글 제출 내역 / 4. 커피챗 내용은 집계성 정보이므로 기존에 BigQuery에 적재되었던 데이터를 집계하면 되었습니다. 2. 슬랙의 활동 요약은 채널의 게시글(포스트, Post), 게시글의 댓글(스레드, Thread), 게시글이나 댓글의 이모지(Emoji) 로 표현할 수 있고 대표적인 게시글의 스키마는 다음과 같습니다.

post

[표1. 게시글 테이블 Schema]

그 외에도 글또 활동인 글 제출, 커피챗 기록 등 다양한 데이터를 메시지 구성에 활용했습니다. 이들 중 일부 데이터는 10분마다 BigQuery로 적재하고, 일부 데이터는 Airflow를 이용하여 하루마다 빅쿼리로 적재하고 있습니다. 이렇게 초기에 데이터 수집 시스템을 견고하게 설계해 둔 덕분에 높은 로그 해상도를 가지고 데이터를 활용하여 개인화 메시지를 설계할 수 있었습니다.

3. 지표 정의

3.1. 활동 레벨 정의

글또 유저의 활동 여부는 주차 별로 O(활동) 혹은 X(휴면)으로 정의 하였습니다. 이때 활동의 기준은 일주일간 한 번이라도 게시글, 댓글, 이모지 작성 행위가 있었다면 O, 아무런 활동이 없었다면 X로 정의합니다. 이러한 활동 여부를 3주 단위로 묶는다면, 총 8가지의 패턴이 드러나게 되며, 이를 4개의 그룹으로 구분 지었고 다음과 같이 3주간 활동 패턴을 파악할 수 있게 되었습니다.

user_segmentation

[그림4. 활동 패턴에 따른 유저 분류]

글또의 활동의 규칙은 2주에 1번 글 제출을 하는 것이기 때문에 2주에 1번은 반드시 들어오는 경우를 Current(활성 유저)로 정의하였습니다. 하지만 지난 2주간 활동을 했더라도 현재 주에 활동이 없다면 Potential Churned(잠재적 이탈) 고객으로 정의할 수 있습니다. 반대로 2주간 활동을 하지 않았고 돌아온 경우는 복귀(Resurrected)로 볼 수 있으며 3주간 어떠한 활동도 하지 않은 유저는 휴면(Dormant) 유저로 정의하였습니다. 글또 시작일부터 설 연휴 전까지 15주가 흐른 복주머니 발송 시점에는, 위처럼 정의한 분류는 사용자별로 5번 기록됩니다. 이 5번의 분류를 다시 아래와 같이 점수를 매겨 최종적으로 활동 점수를 도출하였습니다.

  • 5번 모두 Current: 4점
  • 5번 모두 Current or Potential Churned: 3점
  • Current가 1번 이하로 등장하는 경우: 1점
  • 그 외의 경우: 2점
scoring

[그림5. 활동 패턴에 따른 활동 점수]

커피챗 점수 역시 횟수에 따라 점수를 부여했습니다. 커피챗 4번 이상 진행한 경우는 상위 26%이었고, 재밌는 사실은 커피챗을 단 1번만 진행했어도 상위 50%에 드는 Skewed 된 분포를 보였습니다.

  • 4회 이상 참여: 3점
  • 2~3회 참여: 2점
  • 1회 참여: 1점
  • 0회 참여: 0점

이렇게 계산된 활동 점수, 제출 점수, 커피챗 점수를 모두 합산하여 최종적인 활동 레벨을 도출했습니다.

  • 11점: 레벨 4
  • 10점: 레벨 3
  • 5~9점: 레벨 2
  • 5점 미만: 레벨 1

3.2. 팔로워 정의

저희는 슬랙과 글또의 활동을 집계하는 정보 외에 유저들의 관계에 대한 지표를 정의하면 유저들이 흥미롭게 생각하고 활동을 넛지할 수 있을 것으로 생각했습니다. 어떤 유저가 내 활동에 관심을 보이는지 안다면, 그리고 그 유저가 예상외의 사람이라면 글또 활동에 새로운 자극이 될 수 있지 않을까요? 이렇게 내 활동에 관심을 보이는 유저들을 ‘팔로워’라고 정의하고, TOP 5 팔로워들을 메시지에 포함했습니다.

팔로워는 각종 활동 지표에 가중치를 부여하여 점수를 계산하여 선정했습니다. 기본적으로 슬랙 내의 유저 활동은 게시글와 댓글로 측정할 수 있습니다. 하지만 글또에는 누군가와 커피챗을 했는지 기록하는 채널이 따로 마련되어 있고, ‘또봇’을 통해 글을 제출하거나, 다른 사람의 글을 북마크 하거나 구독하는 등 다양한 활동 정보가 발생합니다. 이러한 활동 정보들에 적절한 가중치를 부여하면, 유저 A에 대한 유저 B의 관심도를 정량적으로 평가할 수 있습니다.

통계적 근거에 따라 가중치를 산출한다면, 회귀 계수를 가중치로 삼는 방법이 가장 먼저 머릿속에 떠오릅니다. 그러나 우리는 ‘관심도’라는 객관적 지표가 없는 상태(Y의 부재)이고, 관심도를 계산할 수 있는 대안적인 방법이 많지 않았습니다. 최종적으로 빈도 기반 가중치의 경향성은 따르되, 실제 사용자 인식과 너무 어긋나지 않게 가중치를 조정하게 되었습니다. 가중치 조정 후 일부 운영진분들께 팔로워 리스트를 보내드린 후, 몇 번의 피드백을 거쳐 Heuristic 하게 다음과 같이 설정했습니다.

weights

[표2. 활동 정보에 따른 가중치 비율]

4. 메시지 발송 과정

4.1. 데이터 마트 생성

위 지표와 데이터를 가지고 메시지 발송에 필요한 2가지 마트를 생성하였습니다. 첫 번째 마트는 크게 4가지 정보로 이루어져 있습니다. 다음은 한 유저의 집계 정보 예시입니다.

aggregate

[표3. 특정 유저의 활동 집계]

  • Slack 활동 지표(게시글, 댓글, 이모지) 등에 대한 집계 데이터
  • 팔로우 유저: 3.2 팔로워 지표에서 선정된 나에게 관심을 준 사람들 Top5
  • 글또 활동 지표: 커피챗 ~ 활동 레벨

두 번째 마트는 글 제출 이력을 표기하기 위한 테이블입니다. 개인화 메시지에서 자신의 글 제출 이력을 한눈에 보고 시계열로 보면 직관인 이해를 도울 수 있습니다.

submit

[표4. 특정 유저의 글 제출 내역]

4.2. 메시지 템플릿 개선 과정

Slack에서 639명의 커뮤니티 사용자에게 개인화 메시지를 보내기 위해, Slack API와 BigQuery를 활용한 Slack 봇을 개발했으며 메시지 발송을 위한 기본적인 기능은 Slack의 chat_post Message API를 사용하여 구현했습니다. 최종적으로 우리가 보낼 메시지는 총 639명을 대상으로 한 Direct Message입니다. 사실 이 정도의 많은 사람에게 메시지를 보내는 게 부담이기 때문에 먼저 운영진 34명을 대상으로 설 일주일 전 테스트를 진행하였습니다. 좌측은 초안의 메시지, 우측은 개선 후 메시지입니다.

message

[그림6. (좌) 개선 전 메시지, (우) 개선 후 메시지]

처음 기획한 메시지의 문제를 살펴보면 다음과 같습니다.

  1. 개행이 불규칙: Slack은 데스크톱과 모바일에서 개행이 달라 가독성이 좋지 않음
  2. 내용이 장황: 서술형 문장이 많아 요약이 필요
  3. 포맷 일관성 부족: 불릿 포인트와 서술형 문장의 배치가 일정하지 않음

따라서, 불릿 포인트를 적극 활용하여 정보 전달력을 높이고, 줄 글은 요약하여 문장 길이를 줄이는 한편, > 인용 문법을 활용하여 메시지를 대화형임을 강조하였습니다. 이를 통해 최종 메시지를 확정하였습니다.

4.3. 대량 메시지 전송을 위한 기술적 고려

Slack API는 초당 요청 수 제한(rate limit)이 있어, 639명에게 메시지를 보내는 과정에서 문제가 발생할 가능성이 있었습니다. Slack API 공식 문서를 참고하여, 현재 사용 중인 플랜이 Tier 3(초당 50개 요청 가능)임을 확인하였습니다. 또한, 전송 시 에러가 날 수 있는 상황을 가정한다면, 누구까지 어떤 내용을 보냈는가가 중요했는데, 개인화 메시지답게 모든 사람이 다양한 경우의 수의 메시지를 받을 수 있기 때문에 확인 수단이 필요했습니다. 이는 메시지를 보낼 때, 이름, 메시지 내용, timestamp(ts)를 CSV 파일에 저장하여 보완하였습니다.

log

[그림7. 발송된 메시지 로그]

발송에 사용된 Python 스크립트 전문은 링크에서 확인할 수 있습니다.

https://github.com/ddongmiin/geultto_genie_bot

5. 결과

5.1. 성과

글또 유저들에게 좋은 경험으로 남기자는 목적으로 시작된 프로젝트지만 그래도 결과로 회고해보면 좋을 것 같아서 각 가설과 지표를 세우고 1개월이 지난 시점 검증을 시작하였습니다. 부수적인 커뮤니티 활동 지표가 개선된 점을 회고하고자 유저 풀과 지표별로 성과를 측정해 보았습니다. 이를 위해 메시지 발송 주차인 17 주차 1월 24일(금)을 포함한 총 8주간 관찰 분석을 진행하였습니다. 향후 이 17 주차를 노란색으로 표기하겠습니다.

timetable

[표5. 관찰 분석한 8주간의 정보]

Q.

가설 1. 메시지 발송 후 유저들은 감동했을 것이며 다른 공지 사항보다 빠르게 반응하였을 것이다.

유저들의 반응을 가장 쉽게 볼 수 있는 수단으로 문턱이 낮고 반응이 빠른 이모지로 선정하여 다음과 같은 가설을 설정하였습니다. 감동이라는 감정은 정량적으로 측정하기 어려운 부분이나 이모지 반응을 대리 지표(Proxy Metric)로 선택하여 더 빨리 응답한 정도로 확인하였습니다. 결과적으로 같은 1월에 올린 타 공지 사항보다 1시간 이내 응답하신 유저가 27%, 3시간 이내는 66%로 다른 공지 사항보다 각각 + 18%, 17% 높은 것을 확인할 수 있었습니다.

Q.

가설 2: 메시지 발송 후 WAU 활동 지표가 올라갔을 것이다.

글또는 시즌제 커뮤니티로 신규 유입이 없기 때문에 장기적으로는 우하향하는 모습을 보입니다. 또한, 2주 주기로 활동 지표의 주기성을 가지기 때문에 WAU를 보는 것이 측정 기준이 될 수 있습니다. 다음 그림에서 보듯 메시지를 보낸 17주 차에는 기존의 트렌드라면 2주 전의 WAU지표인 449명에 근접한 수를 나타야합니다. 하지만 497명의 활성 유저가 있음을 확인할 수 있었고, 개인화 메시지가 영향을 주었다는 증거로 확인할 수 있었습니다. 더불어 18주 차부터는 기존에 있는 주기성이 완화되고 Smoothing 되는 현상을 보이고 있는데, 이는 메시지의 단일 효과보다는 글또 후기의 이벤트인 커피챗 조 편성이 진행되었고 참여율 증가의 영향으로 보는 것이 더 명확합니다. 이러한 이벤트 효과가 사라지는 2월 16월부터는 다시 기존의 Active User의 변동성이 살아나는 모습이 관찰되는 것이 보입니다.

WAU_1718

[그림8. 글또 10기의 Weekly Active User]

Q.

가설 3: 가설 2에 영향을 받은 유저들은 더 많은 활동을 하였을 것이다.

이후 가설 2를 쪼개어 활동과 유저를 기준으로 활동 지표를 관측하였습니다. 시계열로 게시글/댓글/이모지의 현황을 보면 17주 차까지는 지속적으로 감소하는 경향을 나타내다가 18주 차부터는 모든 지표가 반등하는 모습을 보입니다.

activation_metric

[표6. 8주간 활동 지표]

Q.

가설 4: 가설2에 영향을 받은 활성/복귀 유저의 풀이 증가하고 휴면/잠재이탈이 감소했을 것이다.

sege_change

[표7. 8주간의 유저 군집의 변화]

이 경우 2가지로 나눠서 볼 수 있습니다. 17주 차 메시지 발송 후 직후인 18주 차에는 활성/복귀 유저가 증가하는 한편 휴면/잠재 이탈 유저들이 감소하는 현상을 관찰할 수 있습니다. 이는 설 연휴 & 글 제출 주간에 대한 증가 폭으로 이해할 수도 있습니다. 반면 17주 차 -> 19주 차를 비교하면 동일한 패턴을 보여서 개인화 메시지에 대한 결과가 의미 있었다는 근거가 됩니다.

5.2. 유저들의 후기

발송 이후 전체 공지를 통해 개인화 메시지가 전달되었다는 사실을 알리면서 후기를 수집했습니다. 시기가 새해여서 그런지 선물을 받았다는 후기, 중간 결산을 받아서 좋다는 후기 등을 보니 기획하길 잘했다는 느낌이 들었습니다. 디테일한 후기는 하기 그림으로 대체합니다.

survey1
survey2

[그림9. 유저 후기]

5.3. 개선할 점

흥미로 시작한 아이디어였는데 데이터에 진심인 CRM 크루들의 열정으로 하나의 프로젝트가 되어버린 점이 재밌습니다. 오히려 회고해보니 이렇게 본격적으로 해볼것이였으면 "어떤 지표를 올려볼까"라는 사전 설계를 하지 못한 것이 아쉽다는 생각이 듭니다. 하지만 늦은 때는 없는 법! 후향적으로 분석해 보고 우리의 작은 이벤트가 결과로 나타나니 뿌듯한 느낌이 듭니다.

지표관점에 보자면 활동 점수와 레벨에 대한 통일성이 부족하였다고 느꼈습니다. 예를 들어 글 제출은 만점이 4점인데, 커피챗은 만점이 3점이었습니다. 0 ~ 5 점 사이의 값을 통일하여 제공하였으면 좀 더 명확했을 것이라는 생각이 들었습니다. 반면 백분위는 제공하지 않았는데, 이는 백분위를 이용해 서로 비교하고 경쟁하는 문화를 제공하고 싶지 않았기 때문입니다. 기술적 관점으로는 메시지를 발송하는 과정에서 동기식 전송을 선택하였습니다. 의도한 것은 아니며 익숙한 Pandas 모듈 - iterrows 메소드를 이용한 반복문으로 구현했기 때문입니다. 실제로 639명에게 모두 보내기까지 약 5분이 걸렸습니다. 후에 한 유저분께 ‘비동기식’ 설계에 대해서 듣게 되었고 추후 적용을 고려해 보면, 5분 동안 기도하고 있는 저의 모습은 조금 줄어들 것 같습니다 🤣

6. 마무리

이번 복주머니 프로젝트를 통해 Slack을 활용한 개인화 메시지 발송이 어떻게 커뮤니티 활성화에 기여할 수 있는지를 살펴보았습니다. Slack은 단순한 커뮤니케이션 도구를 넘어 데이터 기반의 맞춤형 메시지를 제공할 수 있는 강력한 플랫폼이며, 이를 효과적으로 활용하여 커뮤니티의 지속적인 성장을 도모할 수 있는 도구라는 것을 깨닫게 되는 경험이었습니다. Slack을 활용한 CRM에 관심 있는 분들에게 이번 프로젝트가 좋은 참고가 되길 바라며, 향후 관련 프로젝트에 대한 피드백이나 의견을 언제든지 공유해 주시면 감사하겠습니다. 마지막으로 이렇게 개인화 메시지 경험을 할 수 할 수 있도록 기반을 만들어주신 성윤님, 데이터를 수집해주신 또봇 제작자 은찬님 그리고 Slack 이용에 지원을 주신 Slack Customer Success 팀에도 감사의 말을 전합니다. 끝으로 함께해준 CRM 크루의 후기를 남기며 마무리하겠습니다.

  • 성연찬(하이, 데이터 사이언티스트, Linkedin)

지도가 실제 지형을 요약해 보여주는 것처럼, 데이터와 통계 역시 핵심과 경향성을 요약할 뿐이라는 것을 다시 한번 상기하게 된 계기였습니다. 데이터로부터 커뮤니티의 모든 정보를 파악할 수 없고, 그 안에서 형성되는 가치는 사용자마다 다르게 느끼는 것이죠. TOP 5 팔로워를 숫자에만 근거해 선정했다면 아주 재미없고 평면적인 해석에서 머물렀을 것 같아요. 휴리스틱한 방법을 통해 가중치를 조정하고, ‘오, 이렇게 선정되니 좀 재미있네!’ 하는 느낌을 받은 순간이 가장 기억에 남습니다.

  • 임정(데브애널리틱스랩, 데이터 분석가, Linkedin)

유저 데이터가 실제 적재되고 활용하는 모습들이 궁금해서 운영진 크루를 변경해 CRM 크루로 오게 되었습니다. 실제로 지표를 같이 고민하고 메시지를 보내는 과정에서 훌륭한 다른 동료들과 협업할 수 있어서 글또 데이터의 활용성을 극대화 시킨 프로젝트였습니다. 더불어 데이터의 복잡성을 풀기 위해 문서, Figjam등의 기록을 남기면서 기록에 대한 중요성도 체감하는 일이기도 했습니다. 돌아보니 더더 열심히 해볼걸! 이라는 아쉬움이 남지만 결과로 글까지 남긴 것에 보람을 느낍니다. 같이 함께해준 CRM 크루와 아낌없이 조언해 주신 성윤님 감사합니다.

  • 조동민(넥슨, 데이터 분석가, Linkedin)

커뮤니티 안에는 어떤 데이터가 있을까?라는 호기심을 가지고 데이터 마트와 파이프라인을 구축하는 작업을 담당했습니다. 잘 활용해 주시는 동료분들, 그리고 결과물을 보고 즐거워해 주시는 글또 참여자분들이 계셔서 보람찬 경험이었네요..! 감사하고 사랑합니다 CRM 크루분들~~!

  • 채정현(쿠팡, 데이터 분석가, Linkedin)

저희가 가진 데이터로 참여자분들에게 따듯함을 전달하고 싶다는 마음에 시작한 프로젝트인데 매번 할 때마다 많은 것을 배워가는 것 같습니다. 저는 지표 설계와 메시지 고도화에 많은 시간을 들였습니다. 유저들에게 보내는 메시지를 어떻게 작성해야 더 동기부여가 될 수 있을지 고민해 보는 좋은 계기가 되었어요:) 다들 각각의 파트를 너무 책임감 있게 잘해주셔서 너무 감사드리고 너무 멋져요!! 이렇게 블로그 글도 작성해 주신 정님, 연찬님 너무 감사드립니다!!

  • 정이태(XCENA, Field Application Engineer, Linkedin)

CRM 크루지만 이번 프로젝트는 참여하지 못하여 소감을 줄입니다.