스튜디오얌얌
경력근거: 웨이온㈜은 웨비나 기반 B2B 영업 리드 생성 솔루션인 웨비나우를 중심으로 B2B 기업의 다양한 문제를 해결하는 회사입니다.
※ 실제 산출물이 아닌 AI 예측 시안입니다.
웨이온은 웨비나 기반 B2B 영업 리드 생성 솔루션인 웨비나우를 중심으로 웹세미나 플랫폼과 B2B 영상 제작, 디지털 마케팅을 하나로 묶어 운영하는 회사이고, 이 공고는 B2B 서비스 백엔드 API 와 데이터 구조 설계를 맡길 사람을 찾습니다. 웨비나우에서 고객사가 얻는 결과물이 곧 영업에 넘길 리드라서, 등록과 시청 접속, 질문 기록을 이어 리드를 판정하는 계산은 이 제품의 핵심 백엔드입니다. 이 포트폴리오는 접속 구간을 합쳐 시청 시간을 세는 계산과 웨비나별 기준으로 리드를 판정하는 Node.js API, 마케터와 영업 담당자가 함께 보는 화면을 보여줍니다. B2B 영업 전략이나 리드 점수 모델 설계에 대한 전문성은 주장하지 않습니다.
웨이온(구 스튜디오얌얌)은 웨비나 기반 B2B 영업 리드 생성 솔루션 웨비나우를 중심에 둔 회사입니다. 고객사가 웨비나를 열면 등록과 시청 기록이 쌓이고, 그중 누구를 영업에 먼저 넘길지가 이 제품이 고객사에 주는 결과물이라 리드 판정이 제품의 한가운데에 있습니다.
주요업무에 데이터 구조 설계와 DB 모델링이 있고 자격요건은 MySQL·PostgreSQL 설계 경험과 REST API 설계입니다. 등록·시청 접속·웨비나별 리드 기준 세 표를 나누고, 한 사람이 PC 와 휴대폰으로 동시에 들어온 접속 구간을 합쳐 시청 시간을 세는 계산을 PostgreSQL 위에 둡니다.
공고는 AWS 기반 인프라와 배포 환경 운영, 외부 API 와 AI 서비스 연동을 주요업무로 적었고 우대사항에 OpenAI API 활용이 있습니다. 2주차에 AWS 에 올리고, 3주차에 판정된 리드를 구글 스프레드시트 API 로 영업 담당자 시트에 넘기며 OpenAI API 로 첫 연락 문안을 붙입니다.
웨비나우는 B2B 고객사가 웨비나를 열어 잠재 고객을 모으고, 그 등록·시청 기록을 영업 리드로 넘기는 솔루션입니다. 이 관리자 페이지는 웨비나 등록 명단, 등록자의 시청 접속 기록, 웨비나마다 정한 최소 시청 시간과 개인 메일 도메인 목록을 담은 리드 기준표를 받아 등록자마다 네 판정 중 하나를 붙입니다. 같은 사람이 PC 와 휴대폰으로 동시에 들어오거나 끊겼다 다시 들어온 접속 구간을 겹치는 부분 없이 합쳐 실제 시청 시간을 세고, 질문을 남겼는지 보며, 메일 주소의 도메인을 소문자로 바꿔 개인 메일 목록과 견줍니다. 고객사 마케터는 이 판정으로 영업에 넘길 명단을 고르고, 영업 담당자는 바로 넘길 리드부터 전화를 겁니다.
웨비나우로 웨비나를 연 B2B 고객사의 마케터와, 넘겨받은 리드에 연락하는 그 회사 영업 담당자
지금 고객사 마케터는 웨비나가 끝나면 등록자 명단 엑셀을 그대로 영업에 넘기고, 영업 담당자는 위에서부터 전화를 겁니다. 시청 접속 기록에는 누가 몇 시에 들어와 몇 시에 나갔는지와 질문 수가 이미 남아 있어서, 접속 구간을 사람별로 합치고 웨비나별 기준 시간과 견주면 끝까지 보고 질문한 담당자와 등록만 한 사람이 처음부터 나뉩니다. 영업 담당자는 그 순서대로 연락하면 됩니다.
마케터가 등록 명단·시청 접속 기록·리드 기준표 세 파일을 올리면 등록자마다 네 판정 중 하나와 합친 시청 분, 접속 횟수, 질문 수, 메일 도메인이 서는 관리자 페이지입니다. 접속 구간을 시각 순으로 세워 겹치는 부분을 한 번만 세는 합치기, 나간 시각이 빈 접속을 웨비나 종료 시각으로 닫는 처리, 도메인 소문자 변환, 판정 차례가 이 주에 들어갑니다.
PC·휴대폰 겹침과 끊긴 뒤 재접속을 늘린 등록자 150명에 영업 담당자 입장의 판정을 먼저 붙여 두고, 자동 판정과 갈린 사람을 회차별로 셉니다. 웨비나 플랫폼이 입장·퇴장 이벤트를 보내는 REST API 를 만들어 PostgreSQL 에 쌓고, 등록자 한 명을 펼치면 접속 구간을 시간 막대로 보여줍니다. API 서버는 Docker 이미지로 묶어 ECS Fargate 에 올리고, 테스트가 통과한 커밋만 GitHub Actions 가 배포합니다.
마케터가 바로 넘길 리드를 고르면 구글 스프레드시트 API 로 영업 담당자 시트에 한 줄씩 넣고, GPT-4o mini 가 웨비나 제목과 직무, 시청 분과 질문 수를 받아 첫 연락 문안 두 문장을 붙입니다. 문안 속 숫자와 웨비나 제목이 입력 칸과 다르면 그 리드는 문안 없이 넘깁니다.
마케터가 W-0918 「제조 현장 AI 도입 사례」의 등록 명단과 시청 기록을 올리면 PC 와 휴대폰으로 함께 들어온 서연오토 최유진이 합친 시청 44분으로 바로 넘길 리드에, 두 번 끊겨 들어온 케이메탈 한도윤이 17분으로 일찍 나감에 섭니다.
영업 담당자가 한 명을 펼쳐 접속마다 들어오고 나간 시각, 합친 시청 분과 웨비나 기준 분, 질문 수, 메일 도메인을 읽고 그 숫자로 첫 전화를 걸 순서를 정합니다.
기준 시간과 딱 같은 20분을 본 등록자, 7분만 봤지만 질문을 남긴 등록자, 나간 시각이 비어 있는 접속, 대문자로 적힌 네이버 메일, 회사명을 비워 둔 등록자를 한 웨비나에 담아도 등록자마다 묶음이 하나로 정해집니다. 시각 칸이 깨진 접속 기록 파일 10종은 깨진 접속만 시청 시간 합산에서 빼고 그 등록자 옆에 표시합니다.
등록자 150명에게는 제가 먼저 판정을 붙여 두고, 자동 판정과 갈린 사람 수를 판정별로 셉니다. 명단과 접속 기록과 정답이 전부 제 작업이라 이 수가 0 이 되면 구간 합치기와 판정 차례가 문서대로 걸린다는 데까지 말할 수 있고, 바로 넘길 리드가 실제로 미팅까지 가는지는 별개의 문제입니다.
위 수치는 더미데이터 자가채점이며, 판정이 영업 담당자의 연락 순서와 미팅 전환을 실제로 바꾸는지는 웨비나우 고객사의 실제 등록·시청 기록과 영업 결과가 있어야 측정됩니다. 웨비나우 관리자 화면에서 내려받는 등록 명단과 접속 기록의 열 이름을 그대로 받도록 업로드 형식을 맞춰 두어, 고객사 한 회차만 받아도 같은 화면으로 첫 실측을 시작합니다.
등록자 150명의 정답은 웨비나 리드에 전화를 돌려 본 영업 담당자가 아니라 제가 정했습니다. 7분 보고 질문을 남긴 오세린을 바로 연락으로 올린 판단도 제 규칙이라, 영업 쪽에서 질문 내용을 읽고 다시 가를 여지가 남고 시연은 구간 합치기와 도메인 판정이 적힌 대로 도는 데서 멈춥니다.
한 사람이 한 번 들어와 한 번 나가는 접속만 있으면 시청 시간 계산은 뺄셈 하나로 끝납니다. PC 와 휴대폰으로 겹쳐 들어온 등록자, 끊겼다 다시 들어온 등록자, 나간 시각이 비어 있는 접속, 기준 시간과 딱 같은 시청, 대문자 도메인 메일을 더미에 넣어 그 계산이 실제로 일하게 했습니다.
개인 메일로 등록했지만 끝까지 보고 질문한 김민호 같은 사람도 개인 메일 판정에 들어갑니다. 국내 B2B 웨비나에서는 개인 메일 등록이 흔해서, 이 묶음을 버릴지 회사 메일을 다시 물어볼지는 마케터가 정하도록 판정 근거에 시청 분과 질문 수를 함께 둡니다.
나간 시각이 빈 접속을 웨비나 종료 시각으로 닫으면, 실제로는 브라우저를 일찍 닫은 사람의 시청 시간이 늘어납니다. 플랫폼이 마지막 신호 시각을 남기면 그 시각으로 닫도록 바꾸는 일은 실제 이벤트 형식을 본 뒤의 도입 과제로 둡니다.
이 포트폴리오는 등록·시청 기록으로 리드를 판정하는 백엔드 계산과 마케터 화면을 보여줍니다. B2B 영업 전략이나 리드 점수 모델 설계에 대한 전문성은 주장하지 않습니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
고객사가 웨비나우로 연 웨비나의 등록 명단입니다. 등록 폼에서 회사명과 직무는 선택 항목이라 비어 있는 등록자가 있고, 메일 주소를 대문자로 적은 등록자를 일부러 넣었습니다.
| registrant_id | webinar_id | name | company | job_title | registered_at | |
|---|---|---|---|---|---|---|
| R-1801 | W-0918 | 이서준 | lee.sj@ohsung-precision.co.kr | 오성정밀 | 생산기술팀 과장 | 2026-09-10T09:12:00+09:00 |
| R-1802 | W-0918 | 박지아 | jia.park@gtech-sol.com | 지테크솔루션 | 전략기획 | 2026-09-11T13:40:00+09:00 |
| R-1803 | W-0918 | 정하린 | harin.jung@hanul-chem.co.kr | 한울화학 | 구매팀 대리 | 2026-09-12T10:05:00+09:00 |
| R-1804 | W-0918 | 김민호 | Kim.Minho@NAVER.COM | 대성기계 | 설비보전 팀장 | 2026-09-14T08:51:00+09:00 |
| R-1805 | W-0918 | 최유진 | yujin.choi@seoyeon-auto.co.kr | 서연오토 | 스마트공장 TF | 2026-09-15T17:22:00+09:00 |
아래 JSON Schema 에 맞는 웨비나 등록 명단 행을 더 만들어 주세요. {"type":"object","properties":{"registrant_id":{"type":"string"},"webinar_id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string","description":"등록자가 적은 그대로의 메일 주소입니다."},"company":{"type":["string","null"],"description":"선택 항목이라 비울 수 있습니다."},"job_title":{"type":["string","null"]},"registered_at":{"type":"string","description":"+09:00 오프셋이 붙은 ISO 8601 시각입니다."}},"required":["registrant_id","webinar_id","name","email","company","job_title","registered_at"]} 제조·물류·화학·소프트웨어 회사의 실무자가 업무 메일로 등록하는 것이 기본이고, 회사 도메인은 회사 이름을 영문으로 옮긴 꼴로 씁니다. 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) 대문자가 섞인 개인 메일(Kim@NAVER.COM 꼴), (2) company 와 job_title 이 null 인 등록자, (3) 회사명에 '개인' 이라고 적은 등록자, (4) 같은 회사에서 두 사람이 다른 회차에 등록한 경우, (5) 개인 메일 도메인과 이름이 비슷한 회사 도메인(navercorp-partner.co.kr 꼴). 생성한 행은 위 스키마를 통과해야 하며, 형식을 깨뜨리는 시도는 별도로 3건만 표시해 두세요.{"type":"object","properties":{"registrant_id":{"type":"string"},"webinar_id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string","description":"등록자가 적은 그대로의 메일 주소입니다."},"company":{"type":["string","null"],"description":"선택 항목이라 비울 수 있습니다."},"job_title":{"type":["string","null"]},"registered_at":{"type":"string","description":"+09:00 오프셋이 붙은 ISO 8601 시각입니다."}},"required":["registrant_id","webinar_id","name","email","company","job_title","registered_at"]}등록자가 웨비나에 들어오고 나간 접속 기록입니다. 기기마다, 끊겼다 다시 들어올 때마다 한 줄이 생기고, 브라우저를 닫아 퇴장 신호가 오지 않은 접속은 left_at 이 비어 있습니다. 접속 기록이 없는 등록자는 이 표에 줄이 없습니다.
| registrant_id | webinar_id | device | joined_at | left_at | questions_asked |
|---|---|---|---|---|---|
| R-1801 | W-0918 | pc | 2026-09-18T14:02:00+09:00 | 2026-09-18T14:54:00+09:00 | 2 |
| R-1803 | W-0918 | mobile | 2026-09-18T14:05:00+09:00 | 2026-09-18T14:11:00+09:00 | 0 |
| R-1803 | W-0918 | pc | 2026-09-18T14:06:00+09:00 | 2026-09-18T14:20:00+09:00 | 0 |
| R-1804 | W-0918 | pc | 2026-09-18T14:00:30+09:00 | 2026-09-18T14:58:00+09:00 | 1 |
| R-1805 | W-0918 | pc | 2026-09-18T14:03:00+09:00 | 2026-09-18T14:40:00+09:00 | 0 |
아래 JSON Schema 에 맞는 웨비나 시청 접속 기록 행을 더 만들어 주세요. {"type":"object","properties":{"registrant_id":{"type":"string"},"webinar_id":{"type":"string"},"device":{"type":"string","enum":["pc","mobile"]},"joined_at":{"type":"string","description":"+09:00 오프셋이 붙은 ISO 8601 시각입니다."},"left_at":{"type":["string","null"],"description":"퇴장 신호가 오지 않았으면 null 입니다."},"questions_asked":{"type":"integer","minimum":0,"description":"이 접속 동안 남긴 질문 수입니다."}},"required":["registrant_id","webinar_id","device","joined_at","left_at","questions_asked"]} 접속은 웨비나 시작 몇 분 전후에 몰리고, 질문은 대개 끝까지 본 사람이 남깁니다. 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) 같은 등록자가 PC 와 mobile 로 시간이 겹치게 들어온 두 줄, (2) 끊겼다 몇 분 뒤 다시 들어온 두 줄, (3) left_at 이 null 인 접속, (4) 합친 시청 분이 그 웨비나 기준 분과 정확히 같은 등록자, (5) 몇 분만 봤지만 질문을 남긴 등록자. 생성한 행은 위 스키마를 통과해야 하며, 형식을 깨뜨리는 시도는 별도로 3건만 표시해 두세요.{"type":"object","properties":{"registrant_id":{"type":"string"},"webinar_id":{"type":"string"},"device":{"type":"string","enum":["pc","mobile"]},"joined_at":{"type":"string","description":"+09:00 오프셋이 붙은 ISO 8601 시각입니다."},"left_at":{"type":["string","null"],"description":"퇴장 신호가 오지 않았으면 null 입니다."},"questions_asked":{"type":"integer","minimum":0,"description":"이 접속 동안 남긴 질문 수입니다."}},"required":["registrant_id","webinar_id","device","joined_at","left_at","questions_asked"]}고객사 마케터가 웨비나마다 정한 리드 기준표입니다. 영업에 바로 넘기려면 몇 분 이상 봐야 하는지와 회사 메일로 치지 않을 개인 메일 도메인 목록, 접속 구간을 닫을 웨비나 시작·종료 시각을 적습니다.
| webinar_id | title | starts_at | ends_at | min_watch_min | free_mail_domains |
|---|---|---|---|---|---|
| W-0904 | 물류 자동화 도입 체크리스트 | 2026-09-04T14:00:00+09:00 | 2026-09-04T15:00:00+09:00 | 20 | ["gmail.com","naver.com","daum.net","hanmail.net","kakao.com","nate.com","hotmail.com"] |
| W-0911 | 공장 에너지 비용 줄이기 | 2026-09-11T14:00:00+09:00 | 2026-09-11T15:00:00+09:00 | 20 | ["gmail.com","naver.com","daum.net","hanmail.net","kakao.com","nate.com","hotmail.com"] |
| W-0918 | 제조 현장 AI 도입 사례 | 2026-09-18T14:00:00+09:00 | 2026-09-18T15:00:00+09:00 | 20 | ["gmail.com","naver.com","daum.net","hanmail.net","kakao.com","nate.com","hotmail.com"] |
| W-0925 | B2B 영업 자동화 실무 | 2026-09-25T16:00:00+09:00 | 2026-09-25T17:00:00+09:00 | 30 | ["gmail.com","naver.com","daum.net","hanmail.net","kakao.com","nate.com","hotmail.com","outlook.com"] |
| W-1002 | 품질 검사 비전 AI 기초 | 2026-10-02T14:00:00+09:00 | 2026-10-02T15:00:00+09:00 | 20 | ["gmail.com","naver.com","daum.net","hanmail.net","kakao.com","nate.com","hotmail.com"] |
아래 JSON Schema 에 맞는 웨비나 리드 기준표 행을 더 만들어 주세요. {"type":"object","properties":{"webinar_id":{"type":"string"},"title":{"type":"string"},"starts_at":{"type":"string"},"ends_at":{"type":"string","description":"left_at 이 null 인 접속을 닫는 시각입니다."},"min_watch_min":{"type":"integer","minimum":1,"description":"합친 시청 분이 이 값 이상이면 기준 시간을 채운 것으로 봅니다."},"free_mail_domains":{"type":"array","items":{"type":"string"},"description":"소문자로 적은 개인 메일 도메인 목록입니다."}},"required":["webinar_id","title","starts_at","ends_at","min_watch_min","free_mail_domains"]} 한 시간짜리 웨비나는 min_watch_min 을 20 안팎으로, 90분짜리는 30 안팎으로 씁니다. 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) 회차마다 개인 메일 목록이 조금 다른 경우(outlook.com 추가), (2) 시작이 다른 회차보다 늦은 오후 4시 회차, (3) 기준 분이 웨비나 길이의 절반에 가까운 회차. 생성한 행은 위 스키마를 통과해야 하며, 형식을 깨뜨리는 시도는 별도로 3건만 표시해 두세요.{"type":"object","properties":{"webinar_id":{"type":"string"},"title":{"type":"string"},"starts_at":{"type":"string"},"ends_at":{"type":"string","description":"left_at 이 null 인 접속을 닫는 시각입니다."},"min_watch_min":{"type":"integer","minimum":1,"description":"합친 시청 분이 이 값 이상이면 기준 시간을 채운 것으로 봅니다."},"free_mail_domains":{"type":"array","items":{"type":"string"},"description":"소문자로 적은 개인 메일 도메인 목록입니다."}},"required":["webinar_id","title","starts_at","ends_at","min_watch_min","free_mail_domains"]}| TypeScript | 접속 구간 합치기, 도메인 판정, 판정 차례를 담은 서버 코드와 화면 코드의 언어입니다. |
| Node.js | 세 파일을 받아 판정하는 REST API 서버이고, 2주차에 입장·퇴장 이벤트 수신 엔드포인트를 더합니다. |
| PostgreSQL | 등록·시청 접속·리드 기준 세 테이블을 두고 등록자와 웨비나 두 키로 잇습니다. |
| 데이터 모델링 | 등록자 한 명이 접속을 여러 번 남기는 일대다 구조와 웨비나별 기준표를 나눠 설계합니다. |
| React / Next.js | 판정별 리드 목록과 등록자 펼침, 2주차 접속 구간 시간 막대를 그리는 관리자 화면입니다. |
| AWS | 2주차부터 ECS Fargate 와 RDS PostgreSQL 에 올려 고객사 마케터가 같은 주소로 봅니다. |
| Docker·CI/CD | API 서버를 Docker 이미지로 만들고 GitHub Actions 가 테스트 통과 뒤 AWS 에 배포합니다. |
| OpenAI API | 3주차에 GPT-4o mini 로 리드별 첫 연락 문안을 씁니다. |
| Git | 판정 규칙을 바꿀 때마다 정답 대조 결과를 커밋에 남겨 무엇이 바뀌었는지 추적합니다. |
✗ fail → 시청 시간이 어긋나면 구간 정렬과 겹침 처리부터 다시 보고, 판정 차례가 마케터 판단과 어긋나면 개인 메일과 미접속의 순서를 바꿔 봅니다.
✓ pass → 마케터가 이 표로 영업에 넘길 명단을 고를 수 있으면 1주차 결과물로 닫습니다. 더 간다면 150명 정답 대조, 이벤트 수신 API, AWS 배포를 2주차에 붙입니다.
✗ fail → 이벤트 순서 문제면 이벤트를 시각으로 다시 정렬한 뒤 합치도록 고치고, 시트 연동은 미룹니다.
✓ pass → 영업 시트 보내기와 첫 연락 문안으로 3주차를 엽니다.
위 예측 UI 는 3주차까지 완주했을 때의 화면입니다. 1주차에 실제로 만드는 것은 아래 표시된 화면 하나입니다.
verdict사유 라벨 · registrant_id + 한 줄 요약(근거 수치 포함)화면·코드·면접에서 이 단어를 그대로 씁니다. 키는 출력 스키마의 enum 과 같습니다.
영업에 바로 넘길 리드바로 연락기준 시간보다 일찍 나감일찍 나감등록만 하고 안 들어옴미접속회사 메일이 아닌 등록개인 메일웨비나 등록자 한 명이 접속 구간 합치기와 웨비나별 기준 비교, 메일 도메인 판정을 거쳐 어떤 판정을 받는지 남기는 형식입니다. 판정은 규칙이 정하고, 3주차부터 첫 연락 문안만 모델이 씁니다.
{"type":"object","properties":{"registrant_id":{"type":"string"},"webinar_id":{"type":"string"},"verdict":{"type":"string","enum":["영업에 바로 넘길 리드","등록만 하고 안 들어옴","기준 시간보다 일찍 나감","회사 메일이 아닌 등록"]},"email_domain":{"type":"string","description":"email 의 @ 뒤를 소문자로 바꾼 값입니다."},"session_count":{"type":"integer","minimum":0},"watched_min":{"type":"number","minimum":0,"description":"같은 registrant_id·webinar_id 의 joined_at~left_at 구간을 겹치는 부분 없이 합친 분입니다. left_at 이 null 이면 lead_rules.ends_at 으로 닫습니다."},"session_min_sum":{"type":"number","minimum":0,"description":"겹침을 빼지 않고 접속마다 분을 단순히 더한 값입니다. watched_min 과 다르면 겹친 접속이 있다는 뜻입니다."},"questions_total":{"type":"integer","minimum":0},"min_watch_min":{"type":"integer","minimum":1},"evidence":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"agg":{"type":["string","null"]},"value":{}},"required":["field","value"]}},"summary":{"type":"string"},"hedge":{"type":["string","null"]}},"required":["registrant_id","webinar_id","verdict","email_domain","session_count","watched_min","questions_total","min_watch_min","evidence","summary"]}[
{
"registrant_id": "R-1805",
"webinar_id": "W-0918",
"verdict": "영업에 바로 넘길 리드",
"email_domain": "seoyeon-auto.co.kr",
"session_count": 2,
"watched_min": 44,
"session_min_sum": 54,
"questions_total": 0,
"min_watch_min": 20,
"evidence": [
{
"field": "joined_at",
"value": "2026-09-18T14:03:00+09:00"
},
{
"field": "left_at",
"value": "2026-09-18T14:47:00+09:00"
},
{
"field": "min_watch_min",
"value": 20
}
],
"summary": "PC 와 휴대폰으로 함께 들어온 구간을 합치면 14시 3분부터 47분까지 44분을 봐서 기준 20분을 넘었습니다.",
"hedge": "두 접속을 그냥 더하면 54분이지만 14시 30분부터 40분까지 10분이 겹쳐 한 번만 셌습니다."
},
{
"registrant_id": "R-1810",
"webinar_id": "W-0918",
"verdict": "영업에 바로 넘길 리드",
"email_domain": "hyunwoo-steel.co.kr",
"session_count": 1,
"watched_min": 20,
"session_min_sum": 20,
"questions_total": 0,
"min_watch_min": 20,
"evidence": [
{
"field": "joined_at",
"value": "2026-09-18T14:00:00+09:00"
},
{
"field": "left_at",
"value": "2026-09-18T14:20:00+09:00"
},
{
"field": "min_watch_min",
"value": 20
}
],
"summary": "14시 정각부터 20분을 봐서 기준 20분을 채웠습니다.",
"hedge": "기준과 딱 같은 시간이라 1분만 덜 봤어도 일찍 나감으로 갑니다. 영업 담당자는 이 리드를 바로 넘길 리드 맨 아래에서 봅니다."
},
{
"registrant_id": "R-1807",
"webinar_id": "W-0918",
"verdict": "영업에 바로 넘길 리드",
"email_domain": "daon-logis.com",
"session_count": 1,
"watched_min": 7,
"session_min_sum": 7,
"questions_total": 1,
"min_watch_min": 20,
"evidence": [
{
"field": "questions_asked",
"value": 1
},
{
"field": "joined_at",
"value": "2026-09-18T14:15:00+09:00"
},
{
"field": "left_at",
"value": "2026-09-18T14:22:00+09:00"
}
],
"summary": "7분만 봤지만 질문을 1건 남겨 바로 넘길 리드로 올렸습니다.",
"hedge": "일찍 나감은 질문이 없을 때만 매깁니다. 시청 시간은 짧으니 영업 담당자는 남긴 질문을 먼저 읽고 연락합니다."
},
{
"registrant_id": "R-1808",
"webinar_id": "W-0918",
"verdict": "영업에 바로 넘길 리드",
"email_domain": "miraebio.co.kr",
"session_count": 1,
"watched_min": 59,
"session_min_sum": 59,
"questions_total": 0,
"min_watch_min": 20,
"evidence": [
{
"field": "left_at",
"value": null
},
{
"field": "ends_at",
"value": "2026-09-18T15:00:00+09:00"
},
{
"field": "joined_at",
"value": "2026-09-18T14:01:00+09:00"
},
{
"field": "company",
"value": null
}
],
"summary": "14시 1분에 들어와 퇴장 기록 없이 웨비나가 끝나 종료 시각 15시로 닫아 59분으로 셌습니다.",
"hedge": "퇴장 신호가 없어 실제로 끝까지 봤는지는 모릅니다. 회사명을 비워 둬서 영업 담당자는 메일 도메인 miraebio.co.kr 로 회사를 확인합니다."
},
{
"registrant_id": "R-1802",
"webinar_id": "W-0918",
"verdict": "등록만 하고 안 들어옴",
"email_domain": "gtech-sol.com",
"session_count": 0,
"watched_min": 0,
"session_min_sum": 0,
"questions_total": 0,
"min_watch_min": 20,
"evidence": [
{
"field": "registrant_id",
"value": "R-1802"
},
{
"field": "registrant_id",
"agg": "count",
"value": 0
}
],
"summary": "9월 11일에 등록했지만 웨비나 당일 접속 기록이 없습니다.",
"hedge": null
},
{
"registrant_id": "R-1806",
"webinar_id": "W-0918",
"verdict": "기준 시간보다 일찍 나감",
"email_domain": "kmetal.co.kr",
"session_count": 2,
"watched_min": 17,
"session_min_sum": 17,
"questions_total": 0,
"min_watch_min": 20,
"evidence": [
{
"field": "joined_at",
"value": "2026-09-18T14:10:00+09:00"
},
{
"field": "left_at",
"value": "2026-09-18T14:16:00+09:00"
},
{
"field": "joined_at",
"value": "2026-09-18T14:20:00+09:00"
},
{
"field": "left_at",
"value": "2026-09-18T14:31:00+09:00"
},
{
"field": "min_watch_min",
"value": 20
}
],
"summary": "끊겼다 다시 들어온 두 접속을 합쳐 17분을 보고 질문 없이 나가 기준 20분에 못 미쳤습니다.",
"hedge": "두 접속 사이 4분은 시청에 넣지 않았습니다."
},
{
"registrant_id": "R-1803",
"webinar_id": "W-0918",
"verdict": "기준 시간보다 일찍 나감",
"email_domain": "hanul-chem.co.kr",
"session_count": 2,
"watched_min": 15,
"session_min_sum": 20,
"questions_total": 0,
"min_watch_min": 20,
"evidence": [
{
"field": "joined_at",
"value": "2026-09-18T14:05:00+09:00"
},
{
"field": "left_at",
"value": "2026-09-18T14:11:00+09:00"
},
{
"field": "joined_at",
"value": "2026-09-18T14:06:00+09:00"
},
{
"field": "left_at",
"value": "2026-09-18T14:20:00+09:00"
},
{
"field": "min_watch_min",
"value": 20
}
],
"summary": "휴대폰으로 6분, PC 로 14분 접속했지만 14시 6분부터 11분까지 두 접속이 겹쳐 실제 시청은 14시 5분부터 20분까지 15분이라 기준 20분에 못 미칩니다.",
"hedge": "두 접속을 그냥 더하면 기준과 같은 20분이 되어 바로 넘길 리드로 잘못 올라갑니다."
},
{
"registrant_id": "R-1804",
"webinar_id": "W-0918",
"verdict": "회사 메일이 아닌 등록",
"email_domain": "naver.com",
"session_count": 1,
"watched_min": 57.5,
"session_min_sum": 57.5,
"questions_total": 1,
"min_watch_min": 20,
"evidence": [
{
"field": "email",
"value": "Kim.Minho@NAVER.COM"
},
{
"field": "free_mail_domains",
"value": "naver.com"
},
{
"field": "questions_asked",
"value": 1
}
],
"summary": "등록 메일 도메인 NAVER.COM 을 소문자로 바꾸면 개인 메일 목록의 naver.com 과 같습니다.",
"hedge": "57.5분을 보고 질문도 남겨 관심은 높습니다. 회사명은 대성기계로 적혀 있으니 마케터가 회사 메일을 다시 물어볼지 정합니다."
},
{
"registrant_id": "R-2501",
"webinar_id": "W-0925",
"verdict": "기준 시간보다 일찍 나감",
"email_domain": "bluefin-sw.com",
"session_count": 1,
"watched_min": 28,
"session_min_sum": 28,
"questions_total": 0,
"min_watch_min": 30,
"evidence": [
{
"field": "joined_at",
"value": "2026-09-25T16:01:00+09:00"
},
{
"field": "left_at",
"value": "2026-09-25T16:29:00+09:00"
},
{
"field": "min_watch_min",
"value": 30
}
],
"summary": "28분을 보고 질문 없이 나가 이 회차 기준 30분에 못 미쳤습니다.",
"hedge": "W-0918 회차 기준 20분이었다면 바로 넘길 리드였습니다. 회차마다 기준 분이 달라 웨비나 번호로 기준표를 골라야 합니다."
}
][자동 검증 · 코드가 판정합니다] 1. verdict 가 영업에 바로 넘길 리드·등록만 하고 안 들어옴·기준 시간보다 일찍 나감·회사 메일이 아닌 등록 네 값 중 하나인지 확인합니다. 2. registrant_id·webinar_id·verdict·email_domain·session_count·watched_min·questions_total·min_watch_min·evidence·summary 필드가 빠짐없이 존재하는지 확인합니다. 3. watched_min 이 0 이상이고 session_min_sum 이하인지, 웨비나 길이를 넘지 않는지 확인합니다. 4. watched_min 을 같은 registrant_id·webinar_id 의 접속 구간을 겹침 없이 합친 분으로, session_min_sum 을 접속마다 left_at − joined_at 을 더한 분으로 다시 계산합니다. left_at 이 null 이면 그 webinar_id 의 ends_at 을 씁니다. 5. email_domain 이 그 webinar_id 의 free_mail_domains 에 있으면 verdict 는 회사 메일이 아닌 등록입니다. 6. 앞 조건에 걸리지 않고 session_count 가 0 이면 verdict 는 등록만 하고 안 들어옴입니다. 7. 앞 조건에 걸리지 않고 watched_min 이 min_watch_min 미만이며 questions_total 이 0 이면 verdict 는 기준 시간보다 일찍 나감입니다. 어느 조건에도 걸리지 않으면 verdict 는 영업에 바로 넘길 리드입니다. 8. evidence 의 field 이름이 세 데이터셋 중 하나에 있는 컬럼인지 대조합니다. 9. evidence 의 value 가 수록된 행의 원문 값과 같은지 확인합니다. 여러 줄을 센 수는 agg 를 적습니다. 10. summary 가 존댓말로 끝나는지 확인합니다. [판정 차례 · 위 규칙이 둘 이상 걸릴 때] 등록자 한 명에는 판정을 하나만 남깁니다. ① 회사 메일이 아닌 등록 → ② 등록만 하고 안 들어옴 → ③ 기준 시간보다 일찍 나감 → ④ 영업에 바로 넘길 리드. 개인 메일 등록자는 시청을 했더라도 영업이 회사로 연락할 수 없어 먼저 가르고, 시청 분과 질문 수는 근거에 그대로 남깁니다. [하드 케이스 · 판정이 갈리는 이유] R-1805 는 PC 와 mobile 접속이 14:30~14:40 에서 겹쳐 합친 44분과 단순 합 54분이 다릅니다. R-1806 은 끊겼다 다시 들어와 두 접속의 합 17분입니다. R-1803 은 휴대폰 6분과 PC 14분을 그냥 더하면 기준과 같은 20분이지만 14:06~14:11 이 겹쳐 합치면 15분이라 일찍 나감입니다. R-1810 은 20분이 기준 20분과 같아 미달이 아닙니다. R-1807 은 7분이지만 질문이 있어 일찍 나감이 아닙니다. R-1808 은 left_at 이 null 이라 ends_at 15:00 으로 닫고, company 와 job_title 도 null 입니다. R-1804 는 메일이 대문자라 도메인을 소문자로 바꾼 뒤에야 naver.com 과 같아집니다. R-2501 은 같은 28분이라도 W-0925 기준 30분이라 일찍 나감입니다. [평가 러너 · 2주차] 더미 등록자 150명에 손으로 매긴 정답 판정과 자동 판정을 대조해 판정별 일치율을 내고, 어긋난 등록자는 따로 모아 구간 합치기와 판정 차례를 다시 봅니다. [수동 검증 · 사람이 봅니다] 1. 개인 메일 묶음 중 다시 연락할 사람은 마케터가 고릅니다. 2. 바로 넘길 리드 안에서 누구에게 먼저 전화할지는 영업 담당자가 정합니다.