발행일: 2026-10-06(화) 11:44
← 목차로 돌아가기|하루 30분 n8n 시리즈 ② 실무 자동화 레시피 100
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 클릭
{
  "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"
}
← 이전 레시피☰ 목차다음 레시피 →