Claude Code로 워크샵 신청 자동화 만들기 — 슬랙 알림 + 확인 이메일을 코드 한 줄 없이 대화로 구현

시도하고자 했던 것과 그 이유를 알려주세요.

Above Coding Club 워크샵을 운영하면서 신청이 들어올 때마다 수동으로 처리하던 업무들을 자동화했습니다.

  • 신청자가 생길 때마다 슬랙에서 알림 받기

  • 신청 완료 확인 이메일 자동 발송

  • 모집 마감 후 상세 안내 이메일 일괄 발송

기존에는 Airtable에 신청 데이터가 쌓이기만 하고, 알림도 이메일도 전부 수동이었습니다. 워크샵을 반복 운영하면서 이 과정을 코드로 자동화하고 싶었습니다.


진행 방법

어떤 도구를 사용했고, 어떻게 활용하셨나요?

Claude Code에게 현재 프로젝트 구조(Vercel + Airtable)를 기반으로 자동화 방법을 상의하고, 함께 구현했습니다.

1단계: 자동화할 업무 정리 + 방법 논의

첫 프롬프트로 자동화하고 싶은 업무 목록을 주고, 기술 스택에 맞는 방법을 제안받았습니다.

이제 상세페이지로 워크샵을 오픈할거야. 그럼 이 과정에서의 일어나는 일들을 자동화하고 싶어. 자동화 필요한 업무를 살펴보면, 아래의 일과 같아. 이걸 어떻게 할 수 있을까?
- 신청자 발생할 때마다 알림 받기
- 신청 완료 메일 발송
- 리마인더 문자 발송 (d-1)

Claude Code가 현재 스택(Vercel Serverless + Airtable)을 분석하고, 각 업무별로 구현 방법과 난이도를 비교 정리해줬습니다. 슬랙 알림은 웹훅, 이메일은 Resend API, 문자는 알리고 API를 추천받았습니다.

2단계: 계획 수립 + 이메일 내용 공유

Claude Code가 계획 모드에서 구현 계획을 세우고, 이메일 내용은 제가 직접 공유했습니다.

대화하면서 신청 확인 이메일(자동)과 상세 안내 이메일(수동 트리거) 두 종류로 나뉘어야 한다는 것도 정리되었습니다. 문자 리마인더는 이번 스코프에서 제외하고 나중에 추가하기로 했습니다.

3단계: 구현

Claude Code가 기존 api/apply.js를 수정하고 api/send-info.js를 새로 만들었습니다.

api/apply.js — 신청 시 슬랙 알림 + 확인 이메일 자동 발송:

// 슬랙 알림 발송
async function sendSlackNotification({ name, phone, email, job, tool }) {
  const webhookUrl = process.env.SLACK_WEBHOOK_URL;
  if (!webhookUrl) return;

  const text = `🎉 새 워크샵 신청!\n이름: ${name}\n하시는 일: ${job}\n이메일: ${email}\n연락처: ${phone}${tool ? `\n만들고 싶은 도구: ${tool}` : ''}`;

  await fetch(webhookUrl, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ text })
  });
}

// 신청 확인 이메일 발송
async function sendConfirmationEmail({ name, email }) {
  const apiKey = process.env.RESEND_API_KEY;
  if (!apiKey) return;

  await fetch('https://api.resend.com/emails', {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${apiKey}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      from: process.env.FROM_EMAIL || 'Above Coding Club <[email protected]>',
      to: email,
      subject: '[어보브 코딩 클럽] 워크샵 신청이 완료되었습니다',
      text: `${name}님, 어보브 코딩 클럽 워크샵 신청이 완료되었습니다!\n\n신청 내역을 확인한 후 상세 안내 메일을 보내드릴게요.\n궁금한 점은 이 메일로 편하게 답장 주세요.\n\n어보브 코딩 클럽 드림`
    })
  });
}

Airtable 저장 성공 후 두 함수를 호출:

await Promise.allSettled([
  sendSlackNotification({ name, phone, email, job, tool }),
  sendConfirmationEmail({ name, email })
]);

api/send-info.js — 모집 마감 후 상세 안내 이메일 일괄 발송 API도 별도로 만들어, 워크샵 날짜를 넘기면 Airtable에서 신청자를 조회해 참석자 소개와 만들고 싶은 도구 목록을 자동으로 채워 발송합니다.

4단계: 환경변수 설정 + 배포

Vercel Dashboard에서 환경변수 2개를 추가하고, git push로 자동 배포했습니다.

Key

용도

SLACK_WEBHOOK_URL

슬랙 Incoming Webhook URL

RESEND_API_KEY

Resend 이메일 API 키


결과와 배운 점

배운 점과 나만의 꿀팁

  • 외부 라이브러리 없이 fetch만으로 슬랙 웹훅과 Resend API를 호출할 수 있어서 의존성을 최소화할 수 있었습니다.

  • Claude Code에게 현재 코드를 먼저 분석하게 한 후 방법을 제안받으면, 기존 구조에 자연스럽게 녹아드는 방식으로 구현할 수 있습니다.

  • 이메일 내용처럼 정해진 텍스트가 있으면 직접 공유하는 게 좋습니다. Claude Code가 알아서 동적 변수({이름}, {날짜} 등)를 분리해서 템플릿화해줍니다.

시행착오

  • 처음에 슬랙/이메일 발송을 await 없이 비동기로 실행했더니 아무것도 오지 않았습니다. Vercel 서버리스 함수는 응답을 보내면 바로 종료되기 때문에, 알림 발송이 완료되기 전에 함수가 꺼진 것이었습니다. await Promise.allSettled()로 변경하여 해결했습니다.

  • Vercel 환경변수 추가 시 Key와 Value를 바꿔 넣는 실수를 했습니다. Key에는 변수 이름(SLACK_WEBHOOK_URL), Value에 실제 값을 넣어야 합니다.

여러 항목이 표시된 컴퓨터 화면의 스크린샷

앞으로의 계획

  • D-1 문자 리마인더 추가 (알리고 API + Vercel Cron Job)

  • Resend 도메인 인증 후 자체 이메일 주소로 발송

  • 상세 안내 이메일에 HTML 디자인 적용

뉴스레터 무료 구독

👉 이 게시글도 읽어보세요