DEV Community

Cristian Tala
Cristian Tala

Posted on

20 n8n Workflows That Save 15 Hours/Week (With Code to Copy)

I run 20+ n8n workflows in production. 8,000+ executions/month.

Time saved: 15 hours/week.

Cost: $20/month (vs $99/month for an equivalent Zapier plan).

These aren't theoretical tutorial workflows. These are workflows that publish blog posts, sync data, generate images, send newsletters, create tasks — automatically, 24/7.

I'll show you the 5 most useful workflows (with JSON code to import directly).

The Problem: Zapier Is Expensive, Make Is Limited

Zapier pricing (2026):

  • 8,000 tasks/month → Team plan $99/month

Make pricing:

  • 10,000 operations/month → Pro plan $79/month

Additional problems:

  • Vendor lock-in (workflows live on their platform)
  • Limited logic (branching, loops, complex transformations)
  • No code inspection (can't see what's happening under the hood)

The Solution: n8n (Self-Hosted + Cloud Hybrid)

n8n = Open source Zapier/Make alternative.

My setup:

  • Dev instance: n8n.nyx.yourdomain.com (Docker, VPS)
  • Prod instance: n8n.yourdomain.com (Docker, VPS)
  • Cloud instance: yourdomain.app.n8n.cloud (external webhooks)

Why 3 instances:

  • Dev: Testing without breaking prod
  • Prod: Critical workflows self-hosted (cost $0)
  • Cloud: External webhooks (Stripe, etc.) that need uptime SLA

Cost:

  • Dev + Prod: $0 (self-hosted on VPS I already have)
  • Cloud: $20/month (Starter plan)
  • Total: $20/month (vs $99 Zapier)

Annual savings: $948/year

Workflow 1: Blog Post → Multi-Channel Distribution

Trigger: WordPress post published

Flow:

WordPress Webhook
  ↓
Extract post data (title, excerpt, featured image, URL)
  ↓
IF featured image exists:
  ├─ Yes → Use it
  └─ No → Generate with Replicate API (Synthwave style)
  ↓
Create LinkedIn post (Late API)
  ├─ Text: Excerpt + CTA
  └─ Image: Featured image
  ↓
Create Twitter thread (Late API)
  ├─ Text: Title + 3 key points
  └─ Image: Featured image
  ↓
Create newsletter (Listmonk)
  ├─ Subject: Post title
  └─ Body: Excerpt + "Read more" link
  ↓
Track in NocoDB (Content Calendar table)
  ├─ Platform: LinkedIn, Twitter, Newsletter
  └─ Status: Scheduled
  ↓
Notify Telegram: "Post distributed to 3 channels ✅"
Enter fullscreen mode Exit fullscreen mode

Execution time: 30-45 seconds

Manual equivalent: 30-45 minutes

Savings: 44 minutes per post × 8 posts/month = 6 hours/month

Workflow JSON (Import Directly into n8n)

{
  "nodes": [
    {
      "name": "WordPress Webhook",
      "type": "n8n-nodes-base.webhook",
      "parameters": {
        "path": "wordpress-post-published",
        "responseMode": "onReceived",
        "options": {}
      },
      "position": [250, 300]
    },
    {
      "name": "Extract Post Data",
      "type": "n8n-nodes-base.set",
      "parameters": {
        "values": {
          "string": [
            {"name": "title", "value": "={{$json.title}}"},
            {"name": "excerpt", "value": "={{$json.excerpt}}"},
            {"name": "url", "value": "={{$json.link}}"},
            {"name": "featuredImage", "value": "={{$json.featured_media_url}}"}
          ]
        }
      },
      "position": [450, 300]
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

Import: n8n dashboard → Workflows → Import from File → Paste JSON

Workflow 2: Stripe → NocoDB Revenue Tracking

Trigger: Stripe webhook (payment successful)

Flow:

Stripe Webhook (charge.succeeded)
  ↓
Extract payment data (amount, customer, product)
  ↓
Create NocoDB record (Revenue Tracker table)
  ├─ Amount: {{amount / 100}} USD
  ├─ Customer: {{customer_email}}
  ├─ Product: {{product_name}}
  ├─ Date: {{created_timestamp}}
  └─ Source: Stripe
  ↓
IF amount > $100:
  ↓
  Notify Telegram: "🎉 New sale: ${{amount}} from {{customer_email}}"
Enter fullscreen mode Exit fullscreen mode

Function Node (Transform Stripe Data)

// Input: Stripe charge object
const charge = $input.item.json;

// Transform to NocoDB format
const record = {
  "Amount": charge.amount / 100,  // Cents to dollars
  "Currency": charge.currency.toUpperCase(),
  "Customer": charge.billing_details.email,
  "Product": charge.description,
  "Date": new Date(charge.created * 1000).toISOString(),
  "Source": "Stripe",
  "Status": charge.status
};

return { json: record };
Enter fullscreen mode Exit fullscreen mode

Workflow 3: SEO Auto-Indexing

Trigger: New WordPress post published

Flow:

WordPress Webhook
  ↓
Extract post URL
  ↓
Submit to IndexNow
  ├─ Endpoint: https://api.indexnow.org/indexnow
  ├─ Key: YOUR_INDEX_NOW_KEY
  ├─ URL: {{post_url}}
  ↓
Submit to Google Search Console
  ├─ Auth: Service Account
  ├─ URL: {{post_url}}
  ↓
Wait 48 hours (delay node)
  ↓
Check indexing status (Google API)
  ↓
IF not indexed:
  ↓
  Notify Telegram: "⚠️ Post not indexed: {{post_url}}"
Enter fullscreen mode Exit fullscreen mode

Value: Posts indexed automatically (no manual submission)

Indexing time: Reduced from 7 days → 1-2 days

Workflow 4: Daily Task Backup (NocoDB → Git)

Trigger: Cron (daily 2 AM)

Flow:

Cron Trigger (daily 2 AM)
  ↓
Fetch all active tasks from NocoDB
  ↓
Transform to JSON
  ↓
Write to file: tasks-YYYY-MM-DD.json
  ↓
Git add + commit + push
  ↓
Notify: "✅ Daily backup completed"
Enter fullscreen mode Exit fullscreen mode

Git Commit Node

#!/bin/bash
cd /home/user/backups
echo '$json.tasks' > tasks-$(date +%Y-%m-%d).json
git add tasks-$(date +%Y-%m-%d).json
git commit -m "Daily backup $(date +%Y-%m-%d)"
git push origin main
Enter fullscreen mode Exit fullscreen mode

Workflow 5: Listmonk Campaign Stats → NocoDB

Trigger: Cron (daily 12 PM, 3 hours after typical send time)

Flow:

Cron Trigger
  ↓
Fetch recent campaigns from Listmonk API
  ↓
FOR EACH campaign:
  ├─ Get stats (opens, clicks, bounces)
  ├─ Find corresponding NocoDB record (by Listmonk ID)
  ├─ Update record:
      ├─ Status: Sent
      ├─ Opens: {{opens}}
      ├─ Open Rate: {{opens / total * 100}}%
      └─ Click Rate: {{clicks / total * 100}}%
  ↓
Notify: "✅ Newsletter stats updated"
Enter fullscreen mode Exit fullscreen mode

OpenClaw ↔ n8n Integration Patterns

Pattern 1: n8n Triggers OpenClaw

Use case: External event needs AI processing

// n8n HTTP Request node
POST https://gateway.openclaw.local/api/session/send
{
  "message": "New customer: {{$json.customer_email}}. Generate personalized thank-you email.",
  "sessionKey": "main"
}
Enter fullscreen mode Exit fullscreen mode

Pattern 2: OpenClaw Calls n8n Webhook

## OpenClaw skill
import requests

webhook_url = "https://n8n.yourdomain.com/webhook/upload-to-cdn"
response = requests.post(webhook_url, json={
    "image_data": base64_image,
    "filename": "synthwave-featured.jpg"
})

cdn_url = response.json()['cdn_url']
Enter fullscreen mode Exit fullscreen mode

Pattern 3: n8n as Middleware

OpenClaw: "Publish blog post X"
  ↓
OpenClaw calls n8n webhook: /webhook/publish-blog-post
  ↓
n8n orchestrates:
  ├─ Generate image (Replicate)
  ├─ Publish LinkedIn (Late API)
  ├─ Publish Twitter (Late API)
  ├─ Create newsletter (Listmonk)
  ├─ Track in NocoDB
  └─ Return summary to OpenClaw
  ↓
OpenClaw announces: "Post published to 3 platforms ✅"
Enter fullscreen mode Exit fullscreen mode

Lessons Learned

1. Self-Hosted Dev + Cloud Prod = Best of Both

  • All self-hosted: ✅ Free — ❌ Public webhooks break
  • All cloud: ✅ Reliable — ❌ $99/month for >10K executions
  • Hybrid: ✅ Test locally, deploy to cloud — Cost: $20/month

2. Error Handling = Production-Ready

Bad workflow:

Trigger → API Call → Done
Enter fullscreen mode Exit fullscreen mode

If API fails: workflow stops, no notification, no retry.

Production workflow:

Trigger
  ↓
TRY:
  ├─ API Call
  └─ Success → Log to NocoDB
CATCH:
  ├─ Log error
  ├─ Retry 3x (exponential backoff)
  └─ IF still fails:
      └─ Notify Telegram: "Workflow failed: {{error}}"
Enter fullscreen mode Exit fullscreen mode

3. Sub-Workflows = Reusable Patterns

Create a sub-workflow for common operations (like "generate Synthwave image") and call it from multiple workflows instead of duplicating code.

Results (12 Months)

Stats:

  • Active workflows: 20+
  • Monthly executions: 8,000+
  • Success rate: 97.2%
  • Failed executions: 224 (mostly API rate limits, handled by retry)

Time saved:

  • Blog distribution: 30 min → 30 sec (60x faster)
  • SEO indexing: 15 min → 0 min
  • Revenue tracking: 10 min/week → 0 min
  • Social scheduling: 2 hours/week → 0 min
  • Total: ~15 hours/week

Costs

Instance Hosting Monthly Cost
Dev Docker (VPS) $0
Prod Docker (VPS) $0
Cloud n8n Cloud Starter $20
Total $20/month

vs equivalents:

  • Zapier (8K tasks): $99/month
  • Make (10K ops): $79/month

Savings: $79-99/month = $948-1,188/year

n8n Self-Hosted Setup

version: '3.8'

services:
  n8n:
    image: n8nio/n8n:latest
    container_name: n8n-prod
    restart: always
    ports:
      - "5678:5678"
    environment:
      - N8N_HOST=n8n.yourdomain.com
      - N8N_PROTOCOL=https
      - WEBHOOK_URL=https://n8n.yourdomain.com/
      - N8N_BASIC_AUTH_ACTIVE=true
      - N8N_BASIC_AUTH_USER=${N8N_USER}
      - N8N_BASIC_AUTH_PASSWORD=${N8N_PASSWORD}
    volumes:
      - n8n_data:/home/node/.n8n

volumes:
  n8n_data:
Enter fullscreen mode Exit fullscreen mode
docker-compose up -d
Enter fullscreen mode Exit fullscreen mode

Conclusion: 15 Hours/Week Saved

Setup time: 1-2 days (one-time).

Monthly savings: 60 hours (15h/week × 4).

Cost: $20/month.

ROI: 60 hours × $100/hour = $6,000 value / $20 cost = 300x ROI.

If you automate workflows and pay >$50/month in Zapier/Make, n8n self-hosted pays for itself immediately.

Do you use n8n? What workflows are you running? Share in the comments.

📝 Originally published in Spanish at cristiantala.com

Top comments (0)