DEV Community

Ale Santini
Ale Santini

Posted on

I Replaced 3 SaaS Tools With n8n + OpenRouter (Saving $80/month)

I Replaced 3 SaaS Tools With n8n + OpenRouter (Saving $80/month)

Last year I was paying for 6 SaaS tools. Now I pay for one.

The shift wasn't about being cheap. It was about control. Every tool I used sat behind an API with rate limits, feature gates, and pricing that climbed with usage. So I built a stack around n8n and OpenRouter instead.

Here's what I killed and what I built to replace it.

Why n8n + OpenRouter Changes the Game

Zapier charges per task. OpenRouter charges per token. That's the fundamental difference.

With Zapier at $50/month, I was paying for task volume whether I used it or not. A task is anything that happens in your workflow—reading a database, calling an API, transforming data. Run 10,000 tasks and you hit their limit. You upgrade or hit the wall.

OpenRouter is different. I pay $0.02 per million tokens for Claude 3.5 Sonnet. A token is roughly 4 characters. So I can humanize 50,000 notifications for $1 if I'm using their API directly. With n8n self-hosted, there's no per-execution fee at all.

Zapier also locks you into their UI. n8n runs on your infrastructure. You get JSON configs, version control, and the ability to debug without refreshing a web form 40 times.

The trade: you need to understand JSON, handle errors yourself, and manage a server. Worth it at $80/month saved.

Workflow 1: Smart Notification Engine

The problem: I had 27 SQL data collectors feeding alerts to Slack. Most were noise. Notifications weren't personalized by role. I was paying $15/month to a custom SaaS just to filter and rewrite them.

The solution: n8n + OpenRouter humanizes raw data and routes by role.

Here's the flow:

┌─────────────────────┐
│  27 SQL Collectors  │
│   (cron: every 5m)  │
└──────────┬──────────┘
           │
           ▼
┌─────────────────────┐
│  n8n Merge Node     │
│  (combine all data) │
└──────────┬──────────┘
           │
           ▼
┌─────────────────────────────────────┐
│  OpenRouter API Call                │
│  (Claude 3.5 Sonnet humanization)   │
│  Cost: ~$0.001 per execution        │
└──────────┬──────────────────────────┘
           │
           ▼
┌─────────────────────┐
│  Role-Based Router  │
│  (IF/ELSE by dept)  │
└──────────┬──────────┘
           │
    ┌──────┴──────┬──────────┐
    ▼             ▼          ▼
┌────────┐   ┌────────┐  ┌────────┐
│ Slack  │   │ Email  │  │ PagerD │
│ Eng    │   │ Mgmt   │  │ OnCall │
└────────┘   └────────┘  └────────┘
Enter fullscreen mode Exit fullscreen mode

The n8n workflow JSON (simplified):

{
  "nodes": [
    {
      "name": "Merge SQL Results",
      "type": "n8n-nodes-base.merge",
      "parameters": {
        "mode": "combine",
        "combinationMode": "multiplex"
      }
    },
    {
      "name": "Call OpenRouter",
      "type": "n8n-nodes-base.httpRequest",
      "parameters": {
        "url": "https://openrouter.ai/api/v1/chat/completions",
        "method": "POST",
        "headers": {
          "Authorization": "Bearer {{ $env.OPENROUTER_KEY }}",
          "HTTP-Referer": "https://myapp.com"
        },
        "body": {
          "model": "claude-3.5-sonnet",
          "messages": [
            {
              "role": "user",
              "content": "Humanize this alert for a {{ $node['Merge SQL Results'].json.department }} team member:\n\n{{ JSON.stringify($node['Merge SQL Results'].json.raw_data) }}"
            }
          ],
          "max_tokens": 150
        }
      }
    },
    {
      "name": "Route by Role",
      "type": "n8n-nodes-base.switch",
      "parameters": {
        "cases": [
          {
            "condition": "department === 'engineering'",
            "output": 0
          },
          {
            "condition": "department === 'management'",
            "output": 1
          }
        ]
      }
    },
    {
      "name": "Send to Slack",
      "type": "n8n-nodes-base.slack",
      "parameters": {
        "channel": "#eng-alerts",
        "text": "{{ $node['Call OpenRouter'].json.choices[0].message.content }}"
      }
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

Raw OpenRouter API call:

curl https://openrouter.ai/api/v1/chat/completions \
  -H "Authorization: Bearer $OPENROUTER_KEY" \
  -H "HTTP-Referer: https://myapp.com" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "claude-3.5-sonnet",
    "messages": [
      {
        "role": "user",
        "content": "Rewrite this database alert for a non-technical manager: Database connection pool at 89% capacity. Avg query time 245ms. P99 latency spike detected."
      }
    ],
    "max_tokens": 150
  }'
Enter fullscreen mode Exit fullscreen mode

Response:

{
  "choices": [
    {
      "message": {
        "content": "Our database is running hot right now. Response times are slower than normal, and we're approaching capacity limits. The team is monitoring this closely."
      }
    }
  ],
  "usage": {
    "prompt_tokens": 45,
    "completion_tokens": 28
  }
}
Enter fullscreen mode Exit fullscreen mode

Cost: Runs 27 times per day. ~$0.002 per run. Total: ~$1.60/month. The SaaS it replaced: $15/month.

Workflow 2: Meeting Intelligence

The problem: I was paying $30/month for a meeting summarization tool that recorded calls, transcribed them, and extracted action items. I only needed summaries 3-4 times per week.

The solution: n8n + Whisper + OpenRouter on-demand.

┌──────────────────────┐
│  Slack Command:      │
│  /summarize [link]   │
└──────────┬───────────┘
           │
           ▼
┌──────────────────────┐
│  Download Audio      │
│  (from Slack/Drive)  │
└──────────┬───────────┘
           │
           ▼
┌──────────────────────┐
│  Whisper API         │
│  Transcription       │
│  Cost: $0.02 per min │
└──────────┬───────────┘
           │
           ▼
┌──────────────────────────────────────┐
│  OpenRouter API                      │
│  (Claude 3.5 Sonnet)                 │
│  - Summarize (3 key points)          │
│  - Extract tasks (assign to people)  │
│  - Generate follow-up questions      │
│  Cost: ~$0.01 per meeting            │
└──────────┬───────────────────────────┘
           │
           ▼
┌──────────────────────┐
│  Generate PDF        │
│  (n8n template)      │
└──────────┬───────────┘
           │
           ▼
┌──────────────────────┐
│  Post to Slack       │
│  + Save to Drive     │
└──────────────────────┘
Enter fullscreen mode Exit fullscreen mode

The n8n workflow:

{
  "nodes": [
    {
      "name": "Receive Slack Command",
      "type": "n8n-nodes-base.slackTrigger",
      "parameters": {
        "event": "slash_command",
        "command": "summarize"
      }
    },
    {
      "name": "Download Audio",
      "type": "n8n-nodes-base.httpRequest",
      "parameters": {
        "url": "{{ $node['Receive Slack Command'].json.files[0].url_private }}",
        "method": "GET",
        "headers": {
          "Authorization": "Bearer {{ $env.SLACK_BOT_TOKEN }}"
        }
      }
    },
    {
      "name": "Transcribe with Whisper",
      "type": "n8n-nodes-base.openAi",
      "parameters": {
        "resource": "audio",
        "operation": "transcribe",
        "binaryPropertyName": "data",
        "options": {
          "model": "whisper-1"
        }
      }
    },
    {
      "name": "Analyze with OpenRouter",
      "type": "n8n-nodes-base.httpRequest",
      "parameters": {
        "url": "https://openrouter.ai/api/v1/chat/completions",
        "method": "POST",
        "headers": {
          "Authorization": "Bearer {{ $env.OPENROUTER_KEY }}",
          "HTTP-Referer": "https://myapp.com"
        },
        "body": {
          "model": "claude-3.5-sonnet",
          "messages": [
            {
              "role": "user",
              "content": "Analyze this meeting transcript and provide:\n1. Three key discussion points\n2. Action items with assigned owners\n3. Follow-up questions\n\nTranscript:\n\n{{ $node['Transcribe with Whisper'].json.text }}"
            }
          ],
          "max_tokens": 800
        }
      }
    },
    {
      "name": "Build PDF",
      "type": "n8n-nodes-base.pdf",
      "parameters": {
        "content": "Meeting Summary\n\n{{ $node['Analyze with OpenRouter'].json.choices[0].message.content }}"
      }
    },
    {
      "name": "Upload to Slack",
      "type": "n8n-nodes-base.slack",
      "parameters": {
        "resource": "file",
        "operation": "upload",
        "channels": ["{{ $node['Receive Slack Command'].json.channel_id }}"],
        "binaryPropertyName": "data"
      }
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

Cost per meeting:

  • Whisper: 30-min call = ~$0.30
  • OpenRouter: ~$0.20
  • Total: ~$0.50/month average (4 meetings/week). The SaaS it replaced: $30/month.

Workflow 3: Automated Reporting

The problem: I had a reporting SaaS that pulled data from 5 sources, formatted it, and emailed it every Monday. $20/month. I built this in n8n in 2 hours.


json
{
  "nodes": [
    {
      "name": "Cron Trigger",
      "type": "n8n-nodes-base.cron",
      "parameters": {
        "cronExpression": "0 9 * * 1"
      }
    },
    {
      "name": "Query Data Warehouse",
      "type": "n8n-nodes-base.postgres",
      "

---
**Need an AI system for your business?**
I'm Alessandro Trimarco, AI engineer behind a 6-module AI stack for a 14-location restaurant chain (236 users, ~88k EUR/month processed).
Email: **alevibecoding@gmail.com** | [Portfolio](https://alessandrotrimarco.github.io) | [Case study](https://github.com/AlessandroTrimarco/aires-burger-case-study)
Enter fullscreen mode Exit fullscreen mode

Top comments (0)