RECIPE P6
미니 프로젝트 — 소규모 사업체의 월간 재무 자동화
- ▸영수증·인보이스·결제 데이터를 하나의 재무 시트에 자동 통합할 수 있다
- ▸월간 손익 계산을 자동화해 매월 1일 대표에게 리포트를 발송할 수 있다
- ▸예산 초과 항목을 실시간 감지해 즉시 알림을 발송할 수 있다
✅사전 준비
- □레시피 061~070 핵심 워크플로우 동작 확인
- □Stripe 또는 토스페이먼츠 API 키 연결 완료
- □Google Sheets '재무 대시보드' 시트 구성 (수입/지출/잔액 탭)
- □법인카드 내역 CSV 자동 수신 이메일 설정
- □Gmail 자격증명 연결 완료
월간 재무 자동화 전체 흐름
[실시간 - 결제 발생 시]
Stripe Webhook → 수입 시트 자동 기록
법인카드 이메일 수신 → 지출 시트 기록
예산 초과 감지 → Slack 즉시 알림
[매일 23:50 - 일간 마감]
오늘 수입/지출 집계
→ 잔액 계산 → 시트 업데이트
[매월 1일 09:00 - 월간 리포트]
전월 수입/지출 집계
→ 손익 계산
→ PDF 리포트 생성
→ 대표 이메일 발송월간 손익 집계 — Code 노드
const rows = $input.all();
const lastMonth = new Date();
lastMonth.setMonth(lastMonth.getMonth() - 1);
const ym = `${lastMonth.getFullYear()}-${String(lastMonth.getMonth()+1).padStart(2,'0')}`;
const income = rows
.filter(r => r.json.type === '수입' && r.json.date?.startsWith(ym))
.reduce((sum, r) => sum + Number(r.json.amount || 0), 0);
const expense = rows
.filter(r => r.json.type === '지출' && r.json.date?.startsWith(ym))
.reduce((sum, r) => sum + Number(r.json.amount || 0), 0);
const profit = income - expense;
const margin = income > 0 ? (profit / income * 100).toFixed(1) : 0;
return [{
json: {
month: ym,
income, expense, profit, margin,
message:
`📊 *${ym} 월간 재무 리포트*
💰 총 수입: ${income.toLocaleString()}원
💸 총 지출: ${expense.toLocaleString()}원
📈 순이익: ${profit.toLocaleString()}원
📉 이익률: ${margin}%
${profit >= 0 ? '✅ 흑자' : '⚠️ 적자 — 비용 검토 필요'}`
}
}];예산 초과 감지 — IF 노드 설정
월 예산 한도: 5,000,000원 (Sheets에서 읽어옴)
현재 지출: {{ $json.monthlyExpense }}
조건: {{ $json.monthlyExpense }} > {{ $json.budget }}
True → Slack 알림
"⚠️ 이번 달 지출이 예산을 초과했습니다.
예산: {{ $json.budget }}원
지출: {{ $json.monthlyExpense }}원
초과: {{ $json.monthlyExpense - $json.budget }}원"
False → 정상 종료💡 TIP법인카드 내역 이메일에서 금액을 추출할 때 Code 노드의 정규식을 활용하세요. 예: const amount = text.match(/(\d{1,3}(,\d{3})*)(원)/)?.[0]?.replace(/[^\d]/g, ''). 카드사마다 이메일 형식이 달라 초기 파싱 테스트가 중요합니다.
⚠️ 주의재무 데이터는 세무 신고에 활용될 수 있습니다. n8n 워크플로우로 자동 집계한 데이터는 반드시 회계사 또는 세무사와 교차 검증하세요. 자동화는 보조 도구이며 공식 장부를 대체하지 않습니다.
⚡
워크플로우 JSON
아래 JSON을 복사해 n8n에 바로 임포트하세요
📥 n8n 임포트 방법
n8n 화면 우측 상단 메뉴 (⋮) → Import from JSON → 아래 JSON 전체 복사 후 붙여넣기 → Import 클릭
n8n 화면 우측 상단 메뉴 (⋮) → Import from JSON → 아래 JSON 전체 복사 후 붙여넣기 → Import 클릭
{
"projectId": "miniproject06",
"title": "소규모 사업체의 월간 재무 자동화",
"chapter": 6,
"difficulty": "⭐⭐⭐",
"estimatedTime": "120분",
"description": "직원 5인 이하의 스타트업이나 소상공인이 경리 담당자 없이도 재무를 체계적으로 관리할 수 있도록, 영수증 수집부터 세금계산서 발행까지 재무 업무 전체 파이프라인을 자동화합니다.",
"usedRecipes": [
"recipe061",
"recipe062",
"recipe063",
"recipe064",
"recipe065",
"recipe066",
"recipe068",
"recipe069",
"recipe070"
],
"pipeline": [
{
"phase": 1,
"name": "상시 지출 자동 수집",
"description": "영수증 이메일 수신 즉시 OpenAI로 금액·용도·결제수단을 추출해 경비 시트에 기록하고, 법인카드 내역도 카드사 이메일을 통해 자동 분류합니다.",
"recipes": [
"recipe061",
"recipe069"
],
"trigger": "Gmail Trigger (상시)"
},
{
"phase": 2,
"name": "결제 자동 기록",
"description": "Stripe 결제 완료 이벤트를 즉시 감지해 매출 시트에 자동 기록하고, 100만 원 이상 대형 결제 건은 대표에게 Slack 알림을 발송합니다.",
"recipes": [
"recipe063"
],
"trigger": "Stripe Webhook (상시)"
},
{
"phase": 3,
"name": "경비 사전 승인",
"description": "직원의 경비 신청을 구글 폼으로 접수해 팀장 Slack에 승인·반려 버튼을 발송하고, 결과를 자동 기록 및 신청자에게 이메일로 통보합니다.",
"recipes": [
"recipe066"
],
"trigger": "Google Forms Webhook (상시)"
},
{
"phase": 4,
"name": "예산 초과 경보",
"description": "매일 오전 부서별 예산 사용률을 자동 계산해 80% 초과 시 부서장에게, 100% 초과 시 대표와 경리팀에 Slack 긴급 알림을 발송합니다.",
"recipes": [
"recipe065"
],
"trigger": "Schedule Trigger (매일 09:00)"
},
{
"phase": 5,
"name": "미수금 자동 추적",
"description": "미결제 인보이스를 매일 점검해 D+7, D+14, D+30 단계별로 입금 리마인더 이메일과 Slack 알림을 자동 발송합니다.",
"recipes": [
"recipe064"
],
"trigger": "Schedule Trigger (매일 09:00)"
},
{
"phase": 6,
"name": "인보이스 & 세금계산서 자동 발행",
"description": "구글 시트에 청구 정보를 입력하면 Google Docs 템플릿으로 PDF 인보이스를 자동 생성·발송하고, 매월 지정일에 국세청 API로 세금계산서를 자동 발행해 거래처에 이메일로 전달합니다.",
"recipes": [
"recipe062",
"recipe068"
],
"trigger": "Google Sheets Trigger + Schedule Trigger (매월 10일)"
},
{
"phase": 7,
"name": "주간·연간 예산 대시보드 갱신",
"description": "매주 월요일 지출 내역을 집계해 연간 예산 대시보드를 자동 갱신하고, 주요 변화를 Slack 재무팀 채널에 요약 발송합니다.",
"recipes": [
"recipe070"
],
"trigger": "Schedule Trigger (매주 월요일 08:00)"
}
],
"envVariables": {
"EXPENSE_SHEET_ID": "경비 관리 Google Sheets ID",
"CARD_SHEET_ID": "법인카드 내역 Google Sheets ID",
"SALES_SHEET_ID": "매출 Google Sheets ID",
"INVOICE_SHEET_ID": "인보이스 목록 Google Sheets ID",
"TAX_INVOICE_SHEET_ID": "세금계산서 목록 Google Sheets ID",
"BUDGET_SHEET_ID": "예산 현황 Google Sheets ID",
"PAYROLL_SHEET_ID": "급여 현황 Google Sheets ID",
"EXPENSE_REQUEST_SHEET_ID": "경비 신청 Google Sheets ID",
"INVOICE_TEMPLATE_DOC_ID": "Google Docs 인보이스 템플릿 ID",
"FINANCE_SLACK_CHANNEL": "재무팀 Slack 채널 ID",
"CEO_SLACK_ID": "대표 Slack DM ID",
"MANAGER_SLACK_ID": "팀장 Slack DM ID",
"FINANCE_CONTACT_EMAIL": "재무팀 연락 이메일",
"CARD_COMPANY_EMAIL": "카드사 발신 이메일",
"OPENBANKING_ACCESS_TOKEN": "오픈뱅킹 API 토큰",
"HOMETAX_API_TOKEN": "국세청 홈택스 API 토큰",
"MY_BIZ_NO": "사업자등록번호",
"BUDGET_DASHBOARD_URL": "예산 대시보드 공유 URL"
},
"tips": [
"모든 재무 데이터를 하나의 Google Sheets 파일 안에 탭(시트)으로 구성하면 관리가 편하고 대시보드 연결도 쉬워집니다.",
"경비·매출·예산 시트를 주간 단위로 백업하는 Google Drive 복사 워크플로우를 추가하면 데이터 분실 위험을 줄일 수 있어요.",
"국세청 API와 오픈뱅킹 API는 발급에 1~3 영업일이 걸릴 수 있으니 먼저 신청해두고 다른 레시피부터 구성하세요."
],
"qrUrl": "www.koreaaitimes.com/books/n8n-vol2/recipe070p"
}