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
- 01 Daily to-do summary
- 02 Weekly window aggregate
- 03 Monthly report skeleton
- 04 Workflow clock vs server clock
- 05 Interval field vs cron expression
- 06 Skip-weekend condition gate
- 07 Catching up after a missed run
- 08 Digest email body
- 09 Fetch, transform, format — a 3-stage pipeline
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.
{
"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.
{
"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.
{
"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.
{
"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.
{
"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.
{
"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.
{
"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.
{
"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.
{
"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.