Install any skill in seconds. Free to start, no credit card required.
Get Started Free →n8n otomasyon workflow'lari. Webhook, cron trigger, API entegrasyon, CI/CD otomasyon.
.claude/skills/n8n-workflows/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 183% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 324% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 242% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 242% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 382% | 0% |
bashnpm install -g n8n n8n start # http://localhost:5678
bashdocker run -d \ --name n8n \ -p 5678:5678 \ -v n8n_data:/home/node/.n8n \ -e N8N_BASIC_AUTH_ACTIVE=true \ -e N8N_BASIC_AUTH_USER=admin \ -e N8N_BASIC_AUTH_PASSWORD=<strong-password> \ n8nio/n8n
json{ "mcpServers": { "n8n": { "command": "npx", "args": ["-y", "@anthropic/n8n-mcp-server"], "env": { "N8N_API_URL": "http://localhost:5678/api/v1", "N8N_API_KEY": "<n8n-api-key>" } } } }
n8n UI > Settings > API > Create API Key
Scope: workflow:read, workflow:write, execution:readjson{ "name": "My Workflow", "nodes": [ { "name": "Trigger", "type": "n8n-nodes-base.webhook", "position": [250, 300], "parameters": { "path": "my-webhook", "httpMethod": "POST" } }, { "name": "Process", "type": "n8n-nodes-base.function", "position": [450, 300], "parameters": { "functionCode": "return items.map(item => ({ json: { processed: true, ...item.json } }));" } } ], "connections": { "Trigger": { "main": [[{ "node": "Process", "type": "main", "index": 0 }]] } } }
n8n.create_workflow({
name: "Deploy Notification",
nodes: [...],
connections: {...},
active: true
})n8n.list_workflows({
active: true,
tags: ["production"]
})n8n.execute_workflow({
workflow_id: "123",
data: {
environment: "production",
version: "v1.2.3"
}
})json{ "type": "n8n-nodes-base.webhook", "parameters": { "path": "deploy-hook", "httpMethod": "POST", "authentication": "headerAuth", "options": { "responseMode": "responseNode", "responseCode": 200 } } }
json{ "type": "n8n-nodes-base.cron", "parameters": { "triggerTimes": { "item": [ { "mode": "everyDay", "hour": 9, "minute": 0 }, { "mode": "custom", "cronExpression": "0 */6 * * *" } ] } } }
| Trigger | Kaynak | Kullanim | |---------|--------|----------| | Webhook | Dis sistem | GitHub push, Stripe payment | | Cron | Zamanlama | Gunluk rapor, cleanup | | Email (IMAP) | Email | Support ticket olusturma | | RSS | Feed | Icerik izleme | | Telegram | Bot mesaj | Komut isleme | | GitHub | Repo event | CI/CD tetikleme | | Slack | Mesaj/mention | Team notification | | Database | Row change | Data sync |
json{ "type": "n8n-nodes-base.pollTrigger", "parameters": { "pollTimes": { "item": [{ "mode": "everyMinute", "minute": 5 }] }, "url": "https://api.example.com/status" } }
json{ "type": "n8n-nodes-base.httpRequest", "parameters": { "url": "https://api.example.com/data", "method": "POST", "authentication": "predefinedCredentialType", "nodeCredentialType": "httpHeaderAuth", "sendBody": true, "bodyParameters": { "parameters": [ { "name": "key", "value": "={{ $json.value }}" } ] }, "options": { "timeout": 10000, "retry": { "maxRetries": 3, "retryInterval": 1000 } } } }
json{ "type": "n8n-nodes-base.function", "parameters": { "functionCode": "const results = [];\nfor (const item of items) {\n const data = item.json;\n results.push({\n json: {\n name: data.name.toUpperCase(),\n processed_at: new Date().toISOString()\n }\n });\n}\nreturn results;" } }
json{ "type": "n8n-nodes-base.if", "parameters": { "conditions": { "string": [ { "value1": "={{ $json.status }}", "operation": "equal", "value2": "success" } ] } } }
json{ "type": "n8n-nodes-base.switch", "parameters": { "dataType": "string", "value1": "={{ $json.priority }}", "rules": { "rules": [ { "value2": "critical", "output": 0 }, { "value2": "high", "output": 1 }, { "value2": "low", "output": 2 } ] } } }
json{ "type": "n8n-nodes-base.merge", "parameters": { "mode": "mergeByKey", "propertyName1": "id", "propertyName2": "userId" } }
| Node | Amac | Ornek | |------|------|-------| | HTTP Request | API cagir | REST endpoint | | Function | Kod calistir | Data transform | | IF/Switch | Dallanma | Kosula gore yonlendir | | Set | Data ata | Field ekle/degistir | | Merge | Birlestir | Iki kaynak birlestir | | Split In Batches | Parcala | Rate limiting | | Wait | Bekle | Delay/approval | | Error Trigger | Hata yakala | Hata notification | | Slack | Mesaj gonder | Team bildirim | | Gmail | Email gonder | Notification | | Postgres/MySQL | DB islem | CRUD | | Redis | Cache | Key-value store |
n8n UI > Settings > Credentials > New Credential
Tipler: API Key, OAuth2, Basic Auth, Header Auth
// Workflow'da kullanim
"authentication": "predefinedCredentialType",
"nodeCredentialType": "slackApi"json{ "type": "n8n-nodes-base.httpRequest", "parameters": { "url": "https://api.github.com/repos/{{ $json.owner }}/{{ $json.repo }}/pulls", "method": "GET", "authentication": "predefinedCredentialType", "nodeCredentialType": "githubApi", "options": { "response": { "response": { "fullResponse": true } } } } }
javascript// Function node: paginated API cagirma const allResults = []; let page = 1; let hasMore = true; while (hasMore) { const response = await this.helpers.httpRequest({ url: `https://api.example.com/items?page=${page}&per_page=100`, method: 'GET', }); allResults.push(...response.data); hasMore = response.data.length === 100; page++; } return allResults.map(item => ({ json: item }));
json{ "nodes": [ { "name": "Try", "type": "n8n-nodes-base.httpRequest", "continueOnFail": true, "parameters": { "url": "https://api.example.com/data" } }, { "name": "Check Error", "type": "n8n-nodes-base.if", "parameters": { "conditions": { "boolean": [ { "value1": "={{ $json.error }}", "value2": true } ] } } }, { "name": "Error Handler", "type": "n8n-nodes-base.slack", "parameters": { "channel": "#alerts", "text": "Workflow error: {{ $json.error.message }}" } } ] }
n8n UI > Workflow Settings > Error Workflow
Global error handler: her basarisiz workflow bu workflow'u tetikler
Error workflow node'lari:
1. Error Trigger → hata bilgisini al
2. Function → hatayi formatla
3. Slack/Email → bildirim gonder
4. HTTP Request → incident sisteme kaydetjson{ "parameters": { "options": { "retry": { "maxRetries": 3, "retryInterval": 2000, "retryOnTimeout": true } } } }
n8n.list_executions({
workflow_id: "123",
status: "error",
limit: 10
})n8n.get_execution({
execution_id: "456",
include_data: true
})
// Her node'un input/output data'sini gosterir1. Manual execution: UI'da "Execute Workflow" tikla
2. Node output: Her node'un ciktisini incele
3. Expression editor: {{ $json.field }} ifadelerini test et
4. Console log: Function node'da console.log() kullan
5. Test webhook: Postman/curl ile webhook'u test et
6. Pin data: Test data'yi node'a sabitle (development icin)yaml# .github/workflows/deploy.yml name: Deploy on: push: branches: [main] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Deploy run: ./deploy.sh - name: Notify n8n run: | curl -X POST https://n8n.example.com/webhook/deploy-complete \ -H "Content-Type: application/json" \ -H "Authorization: Bearer ${{ secrets.N8N_WEBHOOK_TOKEN }}" \ -d '{ "repo": "${{ github.repository }}", "branch": "${{ github.ref_name }}", "commit": "${{ github.sha }}", "actor": "${{ github.actor }}" }'
bash# Webhook ile tetikle curl -X POST http://localhost:5678/webhook/my-workflow \ -H "Content-Type: application/json" \ -d '{"action": "deploy", "version": "v1.2.3"}' # API ile tetikle curl -X POST http://localhost:5678/api/v1/workflows/123/execute \ -H "X-N8N-API-KEY: <api-key>" \ -H "Content-Type: application/json" \ -d '{"data": {"key": "value"}}'
bash# Export (backup) curl -s http://localhost:5678/api/v1/workflows \ -H "X-N8N-API-KEY: <key>" | jq '.' > workflows-backup.json # Import curl -X POST http://localhost:5678/api/v1/workflows \ -H "X-N8N-API-KEY: <key>" \ -H "Content-Type: application/json" \ -d @workflow.json
Trigger: Webhook (GitHub Actions'dan)
→ Function: Deploy bilgisini formatla
→ Slack: #deployments kanalina bildir
→ IF: Production deploy mi?
→ YES: Telegram'a da bildir
→ NO: Sadece Slackjson{ "name": "Deploy Notification", "nodes": [ { "name": "Webhook", "type": "n8n-nodes-base.webhook", "parameters": { "path": "deploy-notify", "httpMethod": "POST" } }, { "name": "Format", "type": "n8n-nodes-base.function", "parameters": { "functionCode": "const d = items[0].json;\nreturn [{ json: { text: `Deploy: ${d.repo} (${d.branch}) by ${d.actor}\\nCommit: ${d.commit.substring(0,7)}` } }];" } }, { "name": "Slack", "type": "n8n-nodes-base.slack", "parameters": { "channel": "#deployments", "text": "={{ $json.text }}" } } ] }
Trigger: GitHub (issue opened)
→ Function: Label belirle (title/body analizi)
→ GitHub: Label ata
→ IF: Bug mu?
→ YES: Slack #bugs kanalina bildir, P1 ise mention
→ NO: Backlog'a ekleTrigger: Cron (her gun 10:00)
→ GitHub: Acik PR'lari listele
→ IF: 24+ saat review bekleyen var mi?
→ YES: Slack'te reviewer'a mention at
→ NO: Bos geçTrigger: Cron (her gun 09:00)
→ Slack: #standup kanalina soru gonder
→ Wait: 2 saat
→ Slack: Cevaplari topla
→ Function: Ozet olustur
→ Notion: Standup sayfasina kaydetTrigger: Webhook (app error handler'dan)
→ Function: Error dedup (son 5dk ayni hata var mi)
→ IF: Yeni hata mi?
→ YES:
→ Switch (severity):
→ Critical: PagerDuty + Slack + Telegram
→ High: Slack + Email
→ Low: Slack only
→ NO: Counter artir, sessiz kal| Kural | Aciklama | |-------|----------| | Tek sorumluluk | Her workflow tek bir is yapsin | | Error handling | Her dis API call'da continueOnFail | | Idempotent | Ayni input, ayni output (retry-safe) | | Timeout | HTTP request'lere timeout koy | | Rate limit | Split In Batches ile API limit'e uy | | Credential | Hardcode yapma, n8n credential store kullan | | Naming | Node isimlerini aciklayici yap | | Testing | Pin data ile test et, sonra production'a al |
1. Webhook'lara authentication ekle (header auth veya HMAC)
2. Credential'lari n8n credential store'da tut
3. Sensitive data'yi log'lama
4. Network: n8n'i public internet'e ACMA (reverse proxy kullan)
5. API key'leri environment variable'dan al
6. Workflow export'larinda credential'lar OLMAZ (import sonrasi set et)1. Batch processing: Split In Batches node kullan
2. Parallel execution: baska node'lara dallan
3. Caching: Redis node ile sik kullanilan data'yi cache'le
4. Pagination: Buyuk data set'lerde sayfalama yap
5. Timeout: Uzun workflow'lara timeout koy (workflow settings)
6. Cleanup: Eski execution log'larini sil (Settings > Pruning)| Anti-Pattern | Dogru Yol | |-------------|-----------| | Monolithic workflow | Kucuk, tek sorumluluk workflow'lar | | No error handling | continueOnFail + error workflow | | Hardcoded credentials | n8n credential store | | No retry | Retry config ekle | | Polling every second | Webhook kullan veya 5min+ interval | | No dedup | Duplicate event kontrolu ekle | | No monitoring | Execution log + error alert workflow |
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 8,657 | 8,639 | -0% | 1 | 1 | 0% | 1,721 | 6,109 | +255% | 0 | 0 | — |
case-02 | fail→pass | 10,344 | 6,675 | -35% | 1 | 1 | 0% | 2,068 | 5,844 | +183% | 0 | 0 | — |
case-03 | fail→pass | 6,103 | 5,046 | -17% | 1 | 1 | 0% | 1,245 | 5,281 | +324% | 0 | 0 | — |
case-04 | pass→pass | 3,668 | 3,221 | -12% | 1 | 1 | 0% | 802 | 5,105 | +537% | 0 | 0 | — |
case-05 | pass→pass | 5,599 | 3,443 | -39% | 1 | 1 | 0% | 1,054 | 5,131 | +387% | 0 | 0 | — |
case-06 | fail→pass | 7,539 | 4,850 | -36% | 1 | 1 | 0% | 1,643 | 5,623 | +242% | 0 | 0 | — |
case-07 | fail→pass | 7,988 | 6,099 | -24% | 1 | 1 | 0% | 1,571 | 5,373 | +242% | 0 | 0 | — |
case-08 | fail→pass | 5,687 | 5,017 | -12% | 1 | 1 | 0% | 1,118 | 5,393 | +382% | 0 | 0 | — |
case-09 | pass→pass | 10,217 | 7,186 | -30% | 1 | 1 | 0% | 2,056 | 5,845 | +184% | 0 | 0 | — |
case-10 | pass→pass | 7,525 | 7,787 | +3% | 1 | 1 | 0% | 1,176 | 5,910 | +403% | 0 | 0 | — |
case-11 | fail→pass | 4,748 | 2,107 | -56% | 1 | 1 | 0% | 898 | 4,782 | +433% | 0 | 0 | — |
case-12 | fail→pass | 3,993 | 1,822 | -54% | 1 | 1 | 0% | 803 | 4,735 | +490% | 0 | 0 | — |
case-13 | pass→pass | 5,618 | 3,632 | -35% | 1 | 1 | 0% | 1,175 | 5,122 | +336% | 0 | 0 | — |
case-14 | pass→pass | 5,121 | 3,170 | -38% | 1 | 1 | 0% | 1,058 | 5,072 | +379% | 0 | 0 | — |
case-15 | pass→pass | 6,987 | 3,412 | -51% | 1 | 1 | 0% | 1,407 | 5,162 | +267% | 0 | 0 | — |
case-16 | fail→fail | 3,000 | 4,716 | +57% | 1 | 1 | 0% | 561 | 5,363 | +856% | 0 | 0 | — |
case-17 | fail→fail | 12,450 | 2,981 | -76% | 1 | 1 | 0% | 2,575 | 5,076 | +97% | 0 | 0 | — |
case-18 | pass→pass | 4,434 | 3,891 | -12% | 1 | 1 | 0% | 800 | 5,252 | +557% | 0 | 0 | — |
case-19 | pass→pass | 15,680 | 15,380 | -2% | 1 | 1 | 0% | 2,749 | 7,302 | +166% | 0 | 0 | — |
case-20 | pass→pass | 12,840 | 11,178 | -13% | 1 | 1 | 0% | 2,506 | 6,704 | +168% | 0 | 0 | — |
case-21 | pass→pass | 9,184 | 6,613 | -28% | 1 | 1 | 0% | 1,534 | 5,763 | +276% | 0 | 0 | — |
case-22 | pass→pass | 4,327 | 5,141 | +19% | 1 | 1 | 0% | 948 | 5,378 | +467% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +32 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 7/29/2026 | +41% |
Other measured skills in the registry, with their headline benchmark lift.