RECIPE 051
Typeform 응답 → Notion 데이터베이스 자동 저장
- ▸Typeform 설문 제출 시 즉시 Notion에 레코드 생성
- ▸응답 필드를 Notion 속성(텍스트, 선택, 날짜)에 매핑
- ▸중복 제출 방지 로직 추가
✅사전 준비
- □Typeform 계정 및 폼 생성 완료
- □Notion 통합 토큰 발급 (https://www.notion.so/my-integrations)
- □Notion 데이터베이스 ID 확인
- □n8n Typeform Trigger 자격증명 설정
워크플로우 구성
Typeform Trigger
→ IF (중복 체크: 이메일 필드 존재 여부)
→ Notion (Create Page)
→ Slack (신규 응답 알림)Notion 페이지 생성 Body 예시
{
"parent": { "database_id": "YOUR_DATABASE_ID" },
"properties": {
"이름": { "title": [{ "text": { "content": "{{ $json.answers[0].text }}" } }] },
"이메일": { "email": "{{ $json.answers[1].email }}" },
"제출일": { "date": { "start": "{{ $now.toISO() }}" } },
"점수": { "number": {{ $json.calculated_score }} }
}
}💡 TIPTypeform 필드 ID는 폼 편집 화면 URL 또는 Typeform API 응답의 `answers[n].field.id`에서 확인할 수 있습니다.
⚡
워크플로우 JSON
아래 JSON을 복사해 n8n에 바로 임포트하세요
📥 n8n 임포트 방법
n8n 화면 우측 상단 메뉴 (⋮) → Import from JSON → 아래 JSON 전체 복사 후 붙여넣기 → Import 클릭
n8n 화면 우측 상단 메뉴 (⋮) → Import from JSON → 아래 JSON 전체 복사 후 붙여넣기 → Import 클릭
{
"recipeId": "recipe051",
"title": "채용 지원서 → 구글 시트 자동 정리 & Slack 알림",
"chapter": 5,
"category": "HR & 조직 운영 자동화",
"difficulty": "⭐",
"estimatedTime": "20분",
"usedApps": [
"Gmail",
"Google Sheets",
"Slack"
],
"description": "잡코리아·사람인·원티드 등에서 지원서가 이메일로 수신되면 지원자 이름·포지션·이메일을 Google Sheets에 자동 기록하고 채용팀 Slack에 새 지원자 알림을 보냅니다.",
"nodes": [
{
"id": "trigger_gmail",
"type": "trigger",
"service": "Gmail",
"name": "지원서 이메일 감지",
"config": {
"event": "messageReceived",
"pollInterval": "every 10 minutes",
"filters": {
"subject": "지원"
}
}
},
{
"id": "extract_info",
"type": "action",
"service": "OpenAI",
"name": "지원자 정보 추출",
"config": {
"operation": "chat",
"model": "gpt-4o-mini",
"messages": [
{
"role": "system",
"content": "채용 지원서 이메일에서 정보를 추출합니다. 반드시 JSON 형식으로만 답하세요: {\"name\": \"이름\", \"position\": \"포지션\", \"email\": \"이메일\", \"phone\": \"연락처\"}"
},
{
"role": "user",
"content": "제목: {{$json['subject']}}\n내용: {{$json['text'].slice(0, 1000)}}"
}
]
}
},
{
"id": "parse_json",
"type": "action",
"service": "Function",
"name": "JSON 파싱",
"config": {
"code": "const raw = $json['choices'][0]['message']['content'];\nconst parsed = JSON.parse(raw);\nreturn [{ json: { ...parsed, receivedAt: new Date().toISOString() } }];"
}
},
{
"id": "record_sheet",
"type": "action",
"service": "Google Sheets",
"name": "지원자 시트 기록",
"config": {
"operation": "appendRow",
"spreadsheetId": "{{$env.RECRUIT_SHEET_ID}}",
"sheetName": "지원자목록",
"row": {
"접수일시": "{{$json['receivedAt']}}",
"이름": "{{$json['name']}}",
"포지션": "{{$json['position']}}",
"이메일": "{{$json['email']}}",
"연락처": "{{$json['phone']}}",
"상태": "서류검토중"
}
}
},
{
"id": "notify_slack",
"type": "action",
"service": "Slack",
"name": "채용팀 Slack 알림",
"config": {
"operation": "sendMessage",
"channel": "{{$env.RECRUIT_SLACK_CHANNEL}}",
"message": "📨 새 지원자가 접수되었습니다!\n\n👤 이름: {{$json['name']}}\n💼 포지션: {{$json['position']}}\n📧 이메일: {{$json['email']}}\n📞 연락처: {{$json['phone']}}\n\n👉 시트에서 확인하세요: {{$env.RECRUIT_SHEET_URL}}"
}
}
],
"edges": [
{
"from": "trigger_gmail",
"to": "extract_info"
},
{
"from": "extract_info",
"to": "parse_json"
},
{
"from": "parse_json",
"to": "record_sheet"
},
{
"from": "record_sheet",
"to": "notify_slack"
}
],
"tips": [
"지원서 이메일 양식이 플랫폼마다 다르기 때문에 OpenAI 추출 방식이 가장 유연하게 대응할 수 있어요.",
"포지션별로 다른 Slack 채널에 알림을 보내고 싶다면 IF 노드로 포지션을 분기하세요.",
"지원자 시트에 '상태' 열을 두고 서류검토중 → 서류합격 → 면접예정 순으로 관리하면 레시피 052와 자연스럽게 연결돼요."
],
"qrUrl": "www.koreaaitimes.com/books/n8n-vol2/recipe051"
}