GODRICH

반복 업무 자동화, 계정 없이 n8n으로 먼저 확인하기

n8n은 여러 앱과 API를 코드 없이 연결하는 자동화 도구입니다. 계정 다섯 개 만들기 전에, 내 반복 업무 자동화가 실제로 되는지부터 확인하고 싶은 분들을 위해 그대로 가져와 실행할 수 있는 9가지를 준비했습니다.

자동 재생 · 눌러서 해당 항목으로 · 전부 한 zip

아홉 개는 실제 반복 업무가 자동화되는 순서대로 놓았습니다. 먼저 매일·매주·매월 정해진 시각에 도는 기본 패턴 셋(01 일간·02 주간·03 월간)으로 시작해, 이 자동화가 흔히 걸려 넘어지는 시간대 함정(04)과 트리거 문법(05)을 짚고, 실제로 도는지 조건으로 거르는 법(06)과 놓친 실행을 따라잡는 법(07)을 지나, 마지막으로 결과를 완성된 형태로 꾸미는 두 가지(08 이메일 본문·09 3단 파이프라인)로 끝납니다. 실제 업무 자동화도 대개 이 순서로 다듬어집니다 — 일단 돌고, 시간이 맞는지 확인하고, 예외를 거르고, 보기 좋게 다듬습니다.

01매일 할 일 요약

Schedule 트리거가 아침 8시마다 깨어나고(Manual Trigger 로도 바로 테스트됩니다) HTTP Request 가 할 일 목록을 가져옵니다. Filter 가 한 사람 몫만 남기고, Code 노드가 완료 여부를 체크박스로 찍은 다섯 줄 요약을 만듭니다. 아침 업무 브리핑이나 완료 항목 확인처럼, 매일 같은 걸 점검하는 반복 업무에 그대로 씁니다.

Schedule triggerAtHourFilter → CodeV2 실행 확인
{
  "name": "Build Summary",
  "type": "n8n-nodes-base.code",
  "typeVersion": 2,
  "parameters": {
    "jsCode": "const items = $input.all();\nconst lines = items.map(item => `- [${item.json.completed ? 'x' : ' '}] ${item.json.title}`);\nconst summary = `# Daily Summary\\n\\n${items.length} to-dos for user 3 today\\n\\n` + lines.join('\\n');\nreturn [{ json: { summary } }];"
  }
}

02주간 구간 집계

Schedule 이 월요일 09시에 깨어나 HTTP 로 댓글 전체를 가져오면 Code 가 이번 주 몫만 남깁니다. Summarize 노드가 Aggregate 와 달리 글(postId)별로 그룹을 나눠서 댓글 수를 셉니다. 주간 참여도 리포트나 글별 반응 집계처럼, 매주 같은 지표를 확인할 때 씁니다.

Schedule triggerAtDayCode → SummarizeV2 실행 확인
{
  "name": "Count Per Post",
  "type": "n8n-nodes-base.summarize",
  "typeVersion": 1.1,
  "parameters": {
    "fieldsToSummarize": {
      "values": [
        { "aggregation": "count", "field": "id" }
      ]
    },
    "fieldsToSplitBy": "postId",
    "options": { "outputFormat": "separateItems" }
  }
}

03월간 리포트 뼈대

Schedule 이 매월 1일 09시에 깨어나 HTTP 로 사용자 목록을 가져오면 Code 노드 하나가 Aggregate·Markdown 노드 없이 곧바로 문장형 리포트를 만듭니다. 노드 수가 적을수록 고칠 곳도 적습니다. 월간 현황 메일이나 가입자 수 보고처럼, 매달 한 번 상태를 알려야 할 때 씁니다.

Schedule 매월 1일Code 단독 리포트V2 실행 확인
{
  "name": "Build Monthly Report",
  "type": "n8n-nodes-base.code",
  "typeVersion": 2,
  "parameters": {
    "jsCode": "const users = $input.all().map(item => item.json);\nconst lines = users.map(u => `- ${u.name} <${u.email}>`);\nconst monthlyReport = `# Monthly Report\\n\\n${users.length} users on file this month.\\n\\n` + lines.join('\\n');\nreturn [{ json: { monthlyReport } }];"
  }
}

04워크플로 시계 vs 서버 시계

워크플로 설정에 시간대를 박아두면 Schedule 이 그 시간대 기준으로 도는데, Code 노드 안에서 그 시간대를 따르는 $now 와 항상 UTC 인 순수 JS Date 를 나란히 찍어보면 둘이 같은 순간을 다르게 말합니다. 스케줄이 엉뚱한 시각에 도는 문제 진단이 필요할 때, 이 항목을 그대로 재현해서 원인을 확인하면 됩니다.

timezone Asia/Seoul$now vs Date()V2 실행 확인
{
  "name": "Compare Clocks",
  "type": "n8n-nodes-base.code",
  "typeVersion": 2,
  "parameters": {
    "jsCode": "const workflowNow = $now.toFormat('yyyy-LL-dd HH:mm:ss');\nconst workflowZone = $now.zoneName;\nconst serverNow = new Date().toISOString();\nreturn [{ json: { workflowNow, workflowZone, serverNow } }];"
  }
}

05간격 설정 vs 크론 표현식

Schedule 트리거 두 개를 나란히 둡니다. 하나는 Hours 필드에 6을, 다른 하나는 Custom(Cron) 필드에 0 */6 * * * 를 적어 같은 6시간 간격을 두 문법으로 표현합니다. 간단한 주기는 UI로 충분하지만, 복잡한 조건은 크론으로 풀어야 합니다 — "매월 마지막 평일" 같은 조건이 그렇습니다.

Schedule ×2cronExpressionV2 실행 확인
{
  "name": "Every 6 Hours (Cron)",
  "type": "n8n-nodes-base.scheduleTrigger",
  "typeVersion": 1.4,
  "parameters": {
    "rule": {
      "interval": [
        { "field": "cronExpression", "expression": "0 */6 * * *" }
      ]
    }
  }
}

06주말은 건너뛰는 조건 게이트

Code 가 월~일 일곱 개 샘플 날짜를 만들면 IF 가 주말 여부(dayOfWeek 가 0 또는 6)로 갈라, 평일은 HTTP 로 글을 가져와 리포트를 만들고 주말은 곧바로 건너뜁니다. 두 갈래 다 Merge 뒤에서 같은 action 필드로 만납니다. 영업일에만 도는 알림이나 주말 무음 처리가 필요할 때 이 패턴을 그대로 씁니다.

IF 주말 분기HTTP → MergeV2 실행 확인
{
  "name": "Is Weekend",
  "type": "n8n-nodes-base.if",
  "typeVersion": 2.3,
  "parameters": {
    "conditions": {
      "conditions": [
        { "leftValue": "={{ $json.dayOfWeek }}", "rightValue": 0, "operator": { "type": "number", "operation": "equals" } },
        { "leftValue": "={{ $json.dayOfWeek }}", "rightValue": 6, "operator": { "type": "number", "operation": "equals" } }
      ],
      "combinator": "or"
    }
  }
}

07놓친 실행 따라잡기

Schedule 이 15분마다 돌아야 하는데, Code 노드가 워크플로 자체에 저장되는 정적 데이터($getWorkflowStaticData)로 마지막 실행 시각을 기억해뒀다가 이번엔 몇 분 지났고 몇 번을 놓쳤는지 계산합니다. n8n이 잠깐 죽어 있던 시간을 스스로 알아채는 방법입니다. 서버 재시작 뒤 누락 감지나 실행 이력 없이 간격 재기가 필요할 때 이 패턴을 씁니다.

Schedule 15분$getWorkflowStaticDataV2 실행 확인
{
  "name": "Detect Missed Runs",
  "type": "n8n-nodes-base.code",
  "typeVersion": 2,
  "parameters": {
    "jsCode": "const staticData = $getWorkflowStaticData('node');\nconst expectedIntervalMinutes = 15;\nconst now = Date.now();\nconst lastRun = staticData.lastRun || (now - expectedIntervalMinutes * 3 * 60000);\nconst elapsedMinutes = Math.round((now - lastRun) / 60000);\nconst missedRuns = Math.max(0, Math.floor(elapsedMinutes / expectedIntervalMinutes) - 1);\nstaticData.lastRun = now;\nreturn [{ json: { elapsedMinutes, missedRuns } }];"
  }
}

08다이제스트 이메일 본문

Schedule 이 3시간마다 RSS 로 최신 글을 읽으면 Sort 가 최신순으로 세우고 Limit 이 5개로 줄인 뒤 Code 가 제목·인사말을 마크다운으로 엮고, Markdown 노드가 그걸 그대로 보낼 수 있는 HTML 로 바꿉니다. 정기 뉴스레터나 슬랙·이메일 알림 본문을 만들 때 이 흐름을 그대로 씁니다.

Sort → LimitMarkdown → HTMLV2 실행 확인
{
  "name": "Markdown to HTML",
  "type": "n8n-nodes-base.markdown",
  "typeVersion": 1,
  "parameters": {
    "mode": "markdownToHtml",
    "markdown": "={{ $json.markdown }}",
    "destinationKey": "emailHtml",
    "options": {}
  }
}

09받기·바꾸기·꾸미기 3단 파이프라인

Schedule 이 매일 06시에 키 없는 날씨 API 로 3일치 예보를 받으면, Code 가 최고·최저 기온 평균을 계산하고, Markdown 노드가 문장형 리포트로 다듬습니다. 이 세 단계가 대부분의 리포트 워크플로의 기본형입니다. 일간 날씨 브리핑이나 범용 리포트 파이프라인 뼈대가 필요할 때 이 구조를 그대로 씁니다.

HTTP → CodeMarkdown 리포트V2 실행 확인
{
  "name": "Build Report",
  "type": "n8n-nodes-base.markdown",
  "typeVersion": 1,
  "parameters": {
    "mode": "markdownToHtml",
    "markdown": "={{ '# Weather Report — ' + $json.reportDate + '\\n\\n3-day average high: ' + $json.avgHigh + '°C\\n3-day average low: ' + $json.avgLow + '°C' }}",
    "destinationKey": "report",
    "options": {}
  }
}

준비물 — 계정·권한·버전

아홉 개 다 준비물 행이 "없음"이고 등급도 전부 V2 로 같지만, 항목마다 실제로 검증했다는 사실을 그대로 보여주기 위해 표로 남겨둡니다. 등급은 V0(구조)·V1(가져오기 확인)·V2(실행까지 확인) 세 단계로 재는데, 이 편은 9개 전부 V2 입니다.

항목 등급 준비물 n8n 버전
01 매일 할 일 요약 V2 없음 2.38.5
02 주간 구간 집계 V2 없음 2.38.5
03 월간 리포트 뼈대 V2 없음 2.38.5
04 워크플로 시계 vs 서버 시계 V2 없음 2.38.5
05 간격 설정 vs 크론 표현식 V2 없음 2.38.5
06 주말은 건너뛰는 조건 게이트 V2 없음 2.38.5
07 놓친 실행 따라잡기 V2 없음 2.38.5
08 다이제스트 이메일 본문 V2 없음 2.38.5
09 받기·바꾸기·꾸미기 3단 파이프라인 V2 없음 2.38.5

이 파일을 n8n에 넣는 방법은 셋 중 하나를 고르면 됩니다. 캔버스에 Ctrl/Cmd+V 로 JSON 텍스트를 붙여넣거나, 캔버스 메뉴의 Import from File 로 zip 속 파일을 고르거나, CLI를 쓴다면 n8n import:workflow --input=파일.json 한 줄이면 됩니다. 그다음 캔버스 왼쪽 위 Test workflow 버튼(또는 Manual Trigger 노드의 재생 아이콘)을 누르면 바로 돌아갑니다.

어디서 깨지는가 — 함정 하나

가장 많이 헷갈리는 지점은 04 항목의 시간대입니다 — 워크플로 설정에 시간대를 Asia/Seoul 로 박아두면 Schedule 트리거의 발동 시각과 $now 표현식은 그 시간대를 따르지만, Code 노드 안에서 아무 생각 없이 new Date() 를 쓰면 그 값은 서버의 시스템 시간대(대개 UTC)를 그대로 따라갑니다. 둘을 섞어 쓰면 "분명 9시에 도는데 리포트엔 자정으로 찍힌다" 같은 버그가 납니다. 압축을 풀면 workflows/ 폴더 안에 아홉 개 JSON 파일이 바로 들어 있고, 여는 암호는 문장 속에 심어둔 kenrd2uf 입니다. 02 항목의 Summarize 노드도 비슷한 함정이 있습니다 — 출력 필드 이름이 직접 지은 게 아니라 count_id 처럼 집계 방식과 필드명이 자동으로 합쳐진 이름이라, 짐작해서 count 라고만 쓰면 다음 노드가 그 필드를 못 찾습니다.

FAQ

n8n을 처음 써보는데 계정부터 만들어야 하나요?

아니요. 이 zip 의 워크플로 아홉 개는 전부 커뮤니티 노드나 계정이 필요한 자격증명을 쓰지 않아서, 로컬 환경이나 무료로 켤 수 있는 n8n 인스턴스에 가져오기(Import)만 하면 Manual Trigger 로 바로 돌려볼 수 있습니다.

내 n8n 버전이 다르면 어떻게 하나요?

가져오다가 typeVersion 이 안 맞는다는 오류를 보면, 같은 종류 노드를 캔버스에 직접 하나 놓아보고 export 된 값이 얼마인지 눈으로 확인한 다음 그 값으로 고쳐 쓰면 해결됩니다. n8n 2.38.5(Node 24) 기준으로는 이 zip 의 워크플로 아홉 개가 가져오기·실행 둘 다 그대로 통과했습니다.

실제 업무(엑셀·구글시트·슬랙)로 넓히려면?

HTTP Request 노드나 마지막 Code 노드가 만든 리포트를 원하는 목적지 노드(Google Sheets·Slack·이메일)로 이어붙이면 됩니다. 키가 필요한 노드는 Authentication 옵션에서 자격증명을 따로 추가하고, 워크플로 JSON 안에 직접 값을 적어 공유하지 않는 게 n8n 공식 문서가 권하는 방식입니다.

n8n을 조금 더 익히고 싶다면 자동화 기둥 글 모음에서 이어지는 예제를 볼 수 있고, 이 사이트가 어떤 기준으로 검증하는지는 소개 페이지에 적어 두었습니다.

압축 비밀번호를 입력하세요

비밀번호는 이 글 본문 안에 있습니다. 읽다 보면 나옵니다.