GODRICH

Automate Repetitive Tasks in n8n, No Account First

n8n is a no-code tool that wires apps and APIs into automations. Before you set up a single account, here are 9 workflows to automate repetitive tasks, ready

Auto-plays · click a tile to jump to its section · all nine in one zip

The nine are ordered the way a real recurring task actually gets automated. Start with three basic fire-on-a-schedule patterns (01 daily, 02 weekly, 03 monthly), move through the two things that trip these up most — a timezone trap (04) and trigger syntax (05) — then a condition gate that decides whether to even run (06) and a way to catch up after a missed run (07), and finish with two that shape the output into something you'd actually send (08 an email body, 09 a full fetch-transform-format pipeline). Most real automations get refined in exactly this order — get it firing, check the clock, filter the exceptions, then make it presentable.

01Daily to-do summary

A Schedule Trigger wakes up every morning at 8 (Manual Trigger tests it instantly), HTTP Request fetches a to-do list, Filter keeps one person's items, and a Code node writes a five-line summary with a checkbox for each one. Use it for a morning work briefing, or just checking what got done each day.

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 } }];"
  }
}

02Weekly window aggregate

Schedule wakes up every Monday at 9, HTTP fetches every comment, and a Code node keeps only this week's slice. Unlike Aggregate, the Summarize node here groups by post before it counts. Reach for it when you need a weekly engagement report, or per-post reaction counts you check every Monday.

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" }
  }
}

03Monthly report skeleton

Schedule wakes up on the 1st of every month at 9, HTTP fetches the user list, and one single Code node writes the report sentence directly — no Aggregate, no Markdown node in between. Fewer nodes mean fewer places for it to break. It's the shape you'd use for a monthly status email or a signup-count report.

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 } }];"
  }
}

04Workflow clock vs server clock

Pin a timezone in the workflow settings and Schedule fires on that clock — but print $now (which follows the workflow timezone) next to a plain JS Date (always UTC) inside a Code node, and the two describe the same instant differently. Run this whenever you're diagnosing a schedule that fires at the wrong hour.

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 } }];"
  }
}

05Interval field vs cron expression

Two Schedule Triggers sit side by side — one sets the Hours field to 6, the other writes 0 */6 * * * into the Custom (Cron) field. The UI field is enough for a plain cadence, but something like "last weekday of the month" only exists in cron syntax. In short: the UI for simple cadences, cron for complex conditions like this one.

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

06Skip-weekend condition gate

Code makes seven sample dates, Monday through Sunday, and IF splits them by weekend (dayOfWeek is 0 or 6) — weekdays fetch posts and build a report, weekends skip right away. Both branches meet after Merge in the same action field. Use it for alerts that only run on business days — muting weekends without deleting the schedule.

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"
    }
  }
}

07Catching up after a missed run

Schedule is supposed to run every 15 minutes, but a Code node remembers the last run time in the workflow's own static data ($getWorkflowStaticData) and works out how many minutes passed and how many runs it missed. A way for n8n to notice its own downtime. It's built for detecting gaps after a server restart, timing intervals without an execution log to check against.

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 } }];"
  }
}

08Digest email body

Schedule reads the newest RSS items every 3 hours, Sort puts them newest-first, Limit trims to 5, Code weaves titles and a greeting into markdown, and the Markdown node turns that into HTML ready to paste into an email. This is the shape for a recurring newsletter, or a Slack or email notification body you send on a timer.

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

09Fetch, transform, format — a 3-stage pipeline

Schedule fetches a 3-day forecast from a keyless weather API every day at 6am, Code transforms it by averaging the daily highs and lows, and the Markdown node formats it into a report sentence. Most report workflows boil down to exactly these three stages. Use it as a daily weather briefing, or swap the API for a generic report pipeline skeleton you reuse elsewhere.

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": {}
  }
}

Prerequisites — accounts, permissions, versions

Every row below says "none" for prerequisites, but the table still matters because the grade and n8n version are what actually shift between items. Grades run V0 (structure), V1 (import verified), V2 (execute verified) — this post is 9 for 9 at V2.

Item Grade Prerequisites n8n version
01 Daily to-do summary V2 none 2.38.5
02 Weekly window aggregate V2 none 2.38.5
03 Monthly report skeleton V2 none 2.38.5
04 Workflow clock vs server clock V2 none 2.38.5
05 Interval field vs cron expression V2 none 2.38.5
06 Skip-weekend condition gate V2 none 2.38.5
07 Catching up after a missed run V2 none 2.38.5
08 Digest email body V2 none 2.38.5
09 Fetch, transform, format pipeline V2 none 2.38.5

You have three ways to load these in: paste the JSON straight into the n8n canvas with Ctrl/Cmd+V, use the canvas menu's Import from File to pick a file out of the zip, or run n8n import:workflow --input=file.json from the CLI. Once it's in, hit Test workflow in the top-left corner (or the play icon on the Manual Trigger node) and it runs right there.

Where this breaks — one real trap

The thing people trip on most is the timezone in item 04 — pin the workflow settings to a timezone and Schedule's firing time and any $now expression follow it, but reach for a plain new Date() inside a Code node without thinking and you get the server's system clock (usually UTC) instead. Mix the two and you get bugs like "this fires at 9am — why does the report say midnight?" The password for this zip is kenrd2uf, and once it's unzipped, all nine JSON files sit right there under workflows/. Item 02's Summarize node hides a smaller version of the same trap — its output field isn't a name you typed, it's an auto-built one like count_id, so guessing count leaves the next node with nothing to read.

FAQ

Do I need to make an account before trying n8n?

No. None of the nine workflows in this zip use community nodes or credentials that need an account — import them into any local or free n8n instance and the Manual Trigger runs them immediately.

What if my n8n version is different?

A typeVersion error means you should build that node fresh on your canvas, export it, and read off the value it actually supports. This zip was import- and execute-verified against n8n 2.38.5 on Node 24.

How do I point this at a real destination like Sheets or Slack?

Swap the last node — the HTTP Request or the Code node building the report — for whatever destination you need (Google Sheets, Slack, or email). Add credentials through the node's own Authentication option rather than typing a key into the workflow JSON where it'd get shared; that's the approach n8n's own docs recommend too.

If you want to keep learning n8n, the automation category has more examples in this pillar, and the about page explains how this site verifies what it publishes.

Enter the archive password

The password is inside this article. You will find it as you read.