후보자를 찾았습니다. 분석도 끝났습니다. 그런데 메일을 보내는 건 여전히 수작업입니다.
Candidate Analyzer가 "찾기"와 "분석"을 자동화했다면, 그 다음 단계는 당연히 "연락"이었습니다. 리크루터가 하루에 가장 많은 시간을 쓰는 업무 중 하나가 아웃리치 이메일 작성입니다. 개인화된 메시지를 쓰고, 적절한 간격으로 팔로업하고, 회신을 추적하는 것. 이걸 자동화하기로 했습니다.
결론부터 말하면, 4일 만에 전체 기능을 구현했습니다. AI와 함께.
• • •
리크루터에게 아웃리치란
리크루터의 아웃리치는 마케팅 이메일과 다릅니다. 마케팅은 1만 명에게 같은 메시지를 보내도 됩니다. 하지만 헤드헌팅 아웃리치는 한 명 한 명에게 맞춤 메시지를 보내야 합니다. 시니어 개발자에게 "귀하의 프로필을 보고 연락드립니다"라는 템플릿 메일을 보내면, 그냥 무시당합니다.
그래서 보통 이렇게 합니다.
리크루터의 아웃리치 프로세스 (수작업)
1
후보자 프로필 확인 (LinkedIn, 이력서)
~5분
3
3일 후 팔로업 메일 작성 (안 읽었으면)
~7분
4
7일 후 마지막 메일 (여전히 무응답이면)
~5분
후보자 1명당 약 30분. 하루 20명이면 10시간.
후보자 1명에 30분. 하루에 20명을 컨택하려면 10시간입니다. 물리적으로 불가능합니다. 그래서 대부분의 리크루터는 메시지 품질을 포기하고 템플릿을 돌리거나, 컨택 수를 줄입니다. 둘 다 좋지 않은 선택입니다.
• • •
Gmail OAuth라는 관문
이메일 시퀀스 엔진의 첫 번째 관문은 기술이 아니라 인증이었습니다.
사용자의 Gmail 계정에서 이메일을 보내려면 Google OAuth를 통해 Gmail API 권한을 받아야 합니다. 그런데 Google은 이 권한을 쉽게 주지 않습니다. 특히 gmail.send 스코프는 민감한 권한으로 분류되어 있어서, Google의 보안 심사를 통과해야 합니다.
Gmail API 권한 확보 과정
Step 1
Google Cloud Console에서 OAuth 클라이언트 생성
이건 쉽습니다. 10분이면 됩니다.
Step 2
gmail.send + gmail.readonly 스코프 요청
민감한 권한이라 Google 보안 심사 필요.
Step 3
프로덕션 모드 전환 + 동의 화면 구성
개인정보처리방침, 서비스 약관 필요. 여기서 시간 소모.
Step 4
Refresh Token으로 지속적 접근
사용자가 한 번만 인증하면 이후 자동 갱신.
CA에서는 이미 Google OAuth를 로그인에 사용하고 있었기 때문에 기반이 있었습니다. 하지만 로그인과 이메일 발송은 다른 스코프를 요구합니다. 기존 OAuth 플로우에 Gmail 스코프를 추가하고, 토큰 관리 로직을 확장하는 작업이 필요했습니다.
여기서 AI CTO의 아키텍처 결정이 빛을 발했습니다. 토큰 기반 보안 인증의 stateless 구조 덕분에, Gmail 토큰을 별도로 저장하고 관리하는 로직을 깔끔하게 분리할 수 있었습니다.
• • •
3스텝 AI 메시지 생성
시퀀스 엔진의 핵심은 AI가 개인화된 메시지를 생성하는 것입니다. 하지만 완전 자동이 아니라, 하이브리드 3-Layer 구조를 채택했습니다.
| Layer |
역할 |
주체 |
| Layer 1: AI 초안 |
후보자 프로필 + JD 기반 맞춤 메시지 생성 |
AI 엔진 (자동) |
| Layer 2: 유저 편집 |
AI 초안을 확인하고 수정/보완 |
리크루터 (수동) |
| Layer 3: AI 변수 |
발송 시 동적 변수 치환 (이름, 회사명 등) |
시스템 (자동, 변수 6종) |
시퀀스는 3스텝으로 구성됩니다. 초기 연락(Day 0), 팔로업(Day 3), 마지막 연락(Day 7). 간격은 유저가 변경할 수 있습니다.
왜 완전 자동이 아니라 유저 편집 레이어를 넣었냐면, 리크루터의 톤과 맥락은 AI가 완벽히 재현할 수 없기 때문입니다. AI가 80%를 만들고, 리크루터가 나머지 20%를 다듬는 구조. 이게 현실적으로 가장 효율적이었습니다.
완전 자동화보다 "AI 80% + 사람 20%"가 실제 회신율에서 더 좋은 결과를 냅니다. 사람의 터치가 느껴지는 메시지와 AI가 뿌린 메시지는 받는 사람이 구분합니다.
• • •
추적: 오픈, 클릭, 회신
이메일을 보내는 것만으로는 부족합니다. 보낸 메일이 읽혔는지, 링크를 클릭했는지, 회신이 왔는지를 알아야 다음 액션을 결정할 수 있습니다.
오픈 추적은 1x1 투명 픽셀 이미지를 이메일에 삽입하는 방식입니다. 수신자가 이메일을 열면 이 이미지가 서버에서 로드되고, 그 요청을 기록합니다. 이메일 마케팅에서 널리 쓰이는 기법입니다.
클릭 추적은 이메일 내 링크를 프록시 URL로 변환합니다. 수신자가 링크를 클릭하면 먼저 우리 서버를 거치고(클릭 기록), 그 후 원래 URL로 리다이렉트됩니다.
회신 모니터링이 가장 까다로웠습니다. 발송한 이메일의 스레드를 추적합니다. 주기적으로 스케줄러가 돌면서 새 회신이 있는지 확인하고, 회신이 감지되면 AI 분류로 넘어갑니다.
자동화 스케줄러 — 발송·추적 흐름
🕔
주기적 실행
대기 중인 이메일 발송 + 회신 확인
📩
Gmail API 호출
Thread 조회로 새 회신 감지
• • •
AI가 회신을 분류한다
회신이 오면 리크루터는 그 회신의 성격을 파악하고 다음 액션을 결정해야 합니다. 긍정적인 회신이면 미팅을 잡고, 부정적이면 시퀀스를 중단하고, 부재중(OOO) 자동회신이면 일시정지해야 합니다.
이걸 AI가 자동으로 합니다.
Positive
"관심 있습니다. 자세한 이야기 나눠볼 수 있을까요?"
→ 참여도 스코어 업 + 알림
Negative
"현재 이직 의향이 없습니다. 더 이상 연락 주시지 않았으면 합니다."
→ 시퀀스 자동 중단
Question
"어떤 포지션인가요? 연봉 레인지가 어떻게 되나요?"
→ 시퀀스 일시정지 + 리크루터 응답 대기
OOO (부재중)
"현재 휴가 중입니다. 3월 15일에 돌아옵니다."
→ 시퀀스 자동 일시정지 (복귀 후 재개)
특히 OOO 자동 일시정지가 실무에서 중요합니다. 후보자가 휴가 중인데 팔로업 메일이 계속 가면, 돌아와서 쌓인 메일을 보고 짜증을 냅니다. 첫인상이 나빠지는 거죠. OOO를 감지하면 자동으로 시퀀스를 멈추고, 복귀 시점에 재개합니다.
부정적 회신의 자동 중단도 마찬가지입니다. "더 이상 연락하지 마세요"라는 회신을 받았는데 시스템이 팔로업을 보내면 그건 사고입니다. AI가 회신 내용을 분석해서 부정적 의사를 감지하면 즉시 시퀀스를 중단합니다.
참여도 스코어 (4단계)
각 후보자에게 오픈, 클릭, 회신 데이터를 기반으로 참여도 스코어를 부여합니다.
Hot — 긍정 회신 또는 3회 이상 오픈
Warm — 오픈 + 클릭 있음
Cool — 오픈만 있음
Cold — 무응답
• • •
4일 만에 가능했던 이유
정직하게 말하면, 사람 개발자 혼자서 이걸 4일 만에 만드는 건 불가능합니다. Gmail API 연동만 해도 보통 1~2일이 걸리고, 이메일 추적 시스템을 처음부터 만들려면 최소 1주일은 필요합니다.
4일이 가능했던 건 세 가지 이유였습니다.
4일 구현이 가능했던 이유
1
기반 인프라가 이미 있었다
인증, 데이터베이스, 서버 인프라. CA를 만들면서 구축한 기반 위에 얹은 겁니다. 처음부터 만들었으면 4일은 절대 불가능했습니다.
2
AI가 코드를 짰다
제가 설계하고, AI가 구현했습니다. "Gmail Thread API로 회신을 추적하는 로직을 만들어줘"라고 요청하면 동작하는 코드가 나왔습니다. 물론 수정은 필요했지만, 골격은 AI가 만들었습니다.
3
도메인 지식이 있었다
어떤 기능이 필요한지 이미 알고 있었습니다. 12년간 아웃리치를 직접 해왔으니까요. "3스텝", "OOO 자동 일시정지", "부정 회신 자동 중단" 같은 요구사항은 현장 경험에서 나온 겁니다.
결국 AI 코딩 + 도메인 지식 + 기존 인프라의 조합입니다. 이 세 가지 중 하나라도 빠지면 4일은 불가능했습니다. AI만 있으면 될 거라고 생각하는 분들에게 드리는 솔직한 이야기입니다.
• • •
아직 남은 것들
4일 만에 전체 기능을 구현했지만, "완성"은 아닙니다. 구현과 완성은 다른 개념입니다.
구현 완료
• 캠페인 CRUD
• 후보자 등록 (수동 + CSV)
• AI 메시지 3스텝 생성
• Gmail API 발송
• 자동 스케줄러
• 오픈/클릭/회신 추적
• AI 회신 분류 (4종)
• OOO 자동 일시정지
• 부정 회신 자동 중단
• 참여도 스코어 (4단계)
• 7종 지표 대시보드
• 템플릿 CRUD
• i18n 178키 3개국어
고도화 대기
• 소싱 파이프라인 연동
• A/B 테스트 (메시지 변형)
• 발송 최적 시간대 분석
• 팀 기능 (다중 사용자)
• 회신율 벤치마크
• CRM 연동
특히 소싱 파이프라인과의 연동이 다음 핵심 과제입니다. AI로 후보자를 찾고(검색) → 분석하고(CA) → 연락하고(시퀀스) → 추적하는(파이프라인) 전체 흐름이 하나로 연결되어야 합니다. 지금은 각 기능이 독립적으로 존재하는데, 이걸 하나의 파이프라인으로 만드는 게 다음 목표입니다.
도구의 가치는 개별 기능이 아니라 워크플로우 전체를 얼마나 매끄럽게 연결하느냐에서 나옵니다.
그 이야기는 다음 편에서. 7일 만에 전체 UI를 재설계한 이야기를 먼저 해야겠습니다.
You've found the candidate. Analysis is done. But sending the email? Still manual.
If Candidate Analyzer automated "finding" and "analyzing," the next logical step was "reaching out." One of the most time-consuming tasks for recruiters is writing outreach emails -- crafting personalized messages, following up at the right intervals, and tracking replies. We decided to automate this.
The bottom line: we built the entire feature in 4 days. With AI.
• • •
What Outreach Means to Recruiters
Recruiter outreach is fundamentally different from marketing emails. Marketing can blast the same message to 10,000 people. But headhunting outreach requires personalized messages for every single candidate. Send a senior developer a template saying "I came across your profile and wanted to reach out" -- instant ignore.
Here's the typical process:
Recruiter Outreach Process (Manual)
1
Review candidate profile (LinkedIn, resume)
~5 min
2
Write personalized initial email
~10 min
3
Write follow-up 3 days later (if unread)
~7 min
4
Write final email 7 days later (still no response)
~5 min
5
Check replies + classify + decide next action
~3 min
~30 min per candidate. 20 candidates/day = 10 hours.
30 minutes per candidate. Reaching 20 candidates a day means 10 hours. Physically impossible. So most recruiters either sacrifice message quality by using templates, or reduce the number of contacts. Neither is a good choice.
• • •
The Gmail OAuth Hurdle
The first hurdle for the email sequence engine wasn't technical -- it was authentication.
Sending emails from a user's Gmail account requires Gmail API permissions via Google OAuth. Google doesn't grant these easily. The gmail.send scope is classified as a sensitive permission, requiring Google's security review.
Gmail API Permission Flow
Step 1
Create OAuth client in Google Cloud Console
Easy. 10 minutes.
Step 2
Request gmail.send + gmail.readonly scopes
Sensitive permissions -- Google security review required.
Step 3
Production mode + consent screen setup
Privacy policy, terms of service required. This is where time gets spent.
Step 4
Persistent access via Refresh Tokens
Users authenticate once, tokens auto-refresh afterward.
Since CA already used Google OAuth for login, we had a foundation. But login and email sending require different scopes. We needed to add Gmail scopes to the existing OAuth flow and extend the token management logic.
This is where the AI CTO's architecture decisions paid off. The stateless, token-based auth structure made it clean to separate Gmail token storage and management into its own module.
• • •
3-Step AI Message Generation
The core of the sequence engine is AI generating personalized messages. But rather than full automation, we adopted a hybrid 3-Layer approach.
| Layer |
Role |
Owner |
| Layer 1: AI Draft |
Generate personalized message from candidate profile + JD |
AI Engine (automated) |
| Layer 2: User Edit |
Review and refine AI draft |
Recruiter (manual) |
| Layer 3: AI Variables |
Dynamic variable substitution at send time (name, company, etc.) |
System (automated, 6 variable types) |
The sequence has 3 steps: initial contact (Day 0), follow-up (Day 3), final outreach (Day 7). Intervals are user-configurable.
Why include a user editing layer instead of full automation? Because a recruiter's tone and context can't be perfectly replicated by AI. AI creates 80%, the recruiter refines the remaining 20%. This proved to be the most effective approach in practice.
"AI 80% + Human 20%" actually produces better reply rates than full automation. Recipients can tell the difference between a message with a human touch and one that's purely AI-generated.
• • •
Tracking: Opens, Clicks, Replies
Sending emails isn't enough. You need to know if they were read, if links were clicked, and if there was a reply to determine your next move.
Open tracking embeds a 1x1 transparent pixel image in the email. When the recipient opens it, the image loads from our server, and that request gets logged. A standard technique in email marketing.
Click tracking converts links in the email to proxy URLs. When a recipient clicks a link, it first hits our server (logging the click), then redirects to the original URL.
Reply monitoring was the trickiest part. We track the email thread of each sent message. A scheduler periodically checks for new replies, and when one is detected, it moves to AI classification.
Automated Scheduler -- Send & Track Flow
🕔
Periodic Execution
Send pending emails + check for replies
📩
Gmail API Calls
Thread lookups to detect new replies
🤖
AI Classification
Auto-classify reply content + trigger actions
• • •
AI Classifies Replies
When a reply comes in, the recruiter needs to assess its nature and decide on the next action. Positive reply? Schedule a meeting. Negative? Stop the sequence. OOO auto-reply? Pause it.
AI handles this automatically.
Positive
"I'm interested. Can we discuss further details?"
→ Engagement score up + notification
Negative
"I'm not looking to move right now. Please don't contact me further."
→ Sequence auto-stopped
Question
"What's the position? What's the salary range?"
→ Sequence paused + awaiting recruiter response
OOO (Out of Office)
"I'm currently on vacation. I'll be back on March 15th."
→ Sequence auto-paused (resumes on return)
The OOO auto-pause is especially critical in practice. If follow-up emails keep arriving while a candidate is on vacation, they'll return to a pile of messages and be annoyed. Bad first impression. When OOO is detected, the sequence automatically pauses and resumes when they're back.
Auto-stopping on negative replies is equally important. If someone says "please don't contact me again" and your system sends a follow-up anyway, that's an incident. The AI analyzes reply content and immediately stops the sequence when it detects a negative response.
Engagement Score (4 Levels)
Each candidate receives an engagement score based on open, click, and reply data.
Hot -- Positive reply or 3+ opens
Warm -- Opens + clicks
Cool -- Opens only
Cold -- No response
• • •
Why 4 Days Was Possible
Honestly, a human developer building this solo in 4 days is impossible. Gmail API integration alone typically takes 1-2 days, and building an email tracking system from scratch requires at least a week.
Three factors made 4 days possible:
Why 4-Day Implementation Was Possible
1
Existing infrastructure was already in place
Auth, database, server infrastructure -- all built during CA development. We layered on top of that. Starting from zero would have made 4 days absolutely impossible.
2
AI wrote the code
I designed, AI implemented. "Build reply-tracking logic using the Gmail Thread API" -- and working code came out. It needed modifications, but the skeleton was AI-built.
3
Domain expertise existed
I already knew exactly what features were needed. 12 years of doing outreach myself. Requirements like "3-step sequences," "OOO auto-pause," and "negative reply auto-stop" came from field experience.
It's the combination of AI coding + domain knowledge + existing infrastructure. Remove any one of these three, and 4 days would have been impossible. An honest message for those who think AI alone is enough.
• • •
What's Still Left
We implemented all features in 4 days, but "implemented" isn't the same as "finished." Implementation and completion are different concepts.
Implemented
• Campaign CRUD
• Candidate enrollment (manual + CSV)
• AI 3-step message generation
• Gmail API sending
• Automated scheduler
• Open/click/reply tracking
• AI reply classification (4 types)
• OOO auto-pause
• Negative reply auto-stop
• Engagement score (4 levels)
• 7-metric dashboard
• Template CRUD
• i18n -- 178 keys, 3 languages
Pending Enhancement
• Sourcing pipeline integration
• A/B testing (message variants)
• Optimal send-time analysis
• Team features (multi-user)
• Reply rate benchmarks
• CRM integration
The key next challenge is sourcing pipeline integration. The complete flow of finding candidates (search) → analyzing (CA) → reaching out (sequence) → tracking (pipeline) needs to be connected end-to-end. Currently each feature exists independently -- connecting them into a single pipeline is the next goal.
A tool's value isn't in individual features -- it's in how seamlessly it connects the entire workflow.
That story is for the next post. First, let me tell you about redesigning the entire UI in 7 days.