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 │
└────────┘ └────────┘ └────────┘
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 }}"
}
}
]
}
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
}'
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
}
}
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 │
└──────────────────────┘
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"
}
}
]
}
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)
Top comments (0)