AutomationFlowsAI & RAG › Audit Connected Integrations and Email Pricing & Limits Report with N8n Api,…

Audit Connected Integrations and Email Pricing & Limits Report with N8n Api,…

Original n8n title: Audit Connected Integrations and Email Pricing & Limits Report with N8n Api, Claude and Gmail

ByPoghos Adamyan @poghos on n8n.io

Connects to your n8n instance via API and fetches all credentials you have set up Maps each credential type to its real service name (supports 40+ services: OpenAI, Slack, Notion, Airtable, Google, Stripe, and more) Sends the full list to Claude AI, which researches current…

Event trigger★★★★☆ complexityAI-powered10 nodesHTTP RequestChain LlmAnthropic ChatGmail
AI & RAG Trigger: Event Nodes: 10 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #14125 — we link there as the canonical source.

This workflow follows the Chainllm → Gmail recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "id": "hDAapZssmvlPHvHn",
  "name": "n8n Integration Audit \u2014 Pricing, Tiers & Limits Report",
  "tags": [],
  "nodes": [
    {
      "id": "sticky-overview",
      "name": "Sticky Overview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -176,
        80
      ],
      "parameters": {
        "width": 640,
        "height": 380,
        "content": "## \ud83d\udd0c n8n Integration Audit Report\n\n**What this does:**\n1. Reads all credentials connected to your n8n instance\n2. Maps credential types to real service names\n3. Sends the list to Claude AI \u2014 researches pricing, free tiers, and rate limits for each\n4. Emails a colour-coded HTML report: \ud83d\udfe2 Free \u00b7 \ud83d\udfe1 Freemium \u00b7 \ud83d\udd34 Paid\n\n**Run manually** or connect a Schedule trigger for weekly reports."
      },
      "typeVersion": 1
    },
    {
      "id": "sticky-setup",
      "name": "Sticky Setup",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -176,
        480
      ],
      "parameters": {
        "color": 4,
        "width": 640,
        "height": 420,
        "content": "## \u2699\ufe0f Setup \u2014 3 steps\n\n**1. n8n API Key credential**\nCreate an **HTTP Header Auth** credential:\n- Name: `n8n API Key`\n- Header Name: `X-N8N-API-KEY`\n- Header Value: your n8n API key\n(Settings \u2192 API \u2192 Create API Key)\n\n**2. Instance URL**\nIn the **Configuration** node, replace the placeholder with your n8n instance URL.\nExample: `https://myname.app.n8n.cloud`\n\n**3. Notification email**\nIn the **Configuration** node, set your email address.\n\n**Anthropic credential** is used for Claude AI pricing research."
      },
      "typeVersion": 1
    },
    {
      "id": "n-trigger",
      "name": "Run Audit",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        0,
        304
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "n-config",
      "name": "Configuration",
      "type": "n8n-nodes-base.set",
      "position": [
        240,
        304
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "c1",
              "name": "n8nInstanceUrl",
              "type": "string",
              "value": "https://YOUR-INSTANCE.app.n8n.cloud"
            },
            {
              "id": "c2",
              "name": "notificationEmail",
              "type": "string",
              "value": "your@email.com"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "n-getcreds",
      "name": "Get n8n Credentials",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        480,
        304
      ],
      "parameters": {
        "url": "={{ $('Configuration').first().json.n8nInstanceUrl + '/api/v1/credentials?limit=250' }}",
        "options": {},
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth"
      },
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "n-extract",
      "name": "Extract Service Names",
      "type": "n8n-nodes-base.code",
      "position": [
        720,
        304
      ],
      "parameters": {
        "jsCode": "const body = $input.first().json;\nconst creds = body.data || (Array.isArray(body) ? body : []);\n\nconst typeToService = {\n  openAiApi: 'OpenAI', anthropicApi: 'Anthropic (Claude AI)',\n  googleDriveOAuth2Api: 'Google Drive', gmailOAuth2: 'Gmail',\n  googleSheetsOAuth2Api: 'Google Sheets', googleCalendarOAuth2Api: 'Google Calendar',\n  googleDocsOAuth2Api: 'Google Docs', youtubeOAuth2Api: 'YouTube Data API',\n  slackApi: 'Slack', slackOAuth2Api: 'Slack', telegramApi: 'Telegram Bot API',\n  notionApi: 'Notion', airtableTokenApi: 'Airtable', airtableApi: 'Airtable',\n  githubApi: 'GitHub', gitlabApi: 'GitLab', hubspotApi: 'HubSpot',\n  salesforceOAuth2Api: 'Salesforce', stripeApi: 'Stripe', twilioApi: 'Twilio',\n  sendGridApi: 'SendGrid', mailchimpApi: 'Mailchimp', shopifyApi: 'Shopify',\n  dropboxApi: 'Dropbox', oneDriveApi: 'Microsoft OneDrive',\n  microsoftTeamsOAuth2Api: 'Microsoft Teams', outlookOAuth2Api: 'Microsoft Outlook',\n  linkedInOAuth2Api: 'LinkedIn', twitterOAuth2Api: 'Twitter / X',\n  facebookGraphApi: 'Facebook Graph API', wordpressApi: 'WordPress REST API',\n  asanaApi: 'Asana', trelloApi: 'Trello', jiraApi: 'Jira (Atlassian)',\n  linearApi: 'Linear', clickupApi: 'ClickUp', mondayApi: 'Monday.com',\n  pipedriveApi: 'Pipedrive', zendeskApi: 'Zendesk', discordApi: 'Discord',\n  discordBotApi: 'Discord Bot', postgresDb: 'PostgreSQL', mysqlDb: 'MySQL',\n  mongoDb: 'MongoDB', supabaseApi: 'Supabase', pineconeApi: 'Pinecone',\n  httpHeaderAuth: null, httpBasicAuth: null, httpQueryAuth: null,\n  httpDigestAuth: null, oAuth2Api: null, oAuth1Api: null,\n  sshPrivateKey: null, noAuth: null,\n};\n\nconst seen = new Set();\nconst services = [];\nfor (const cred of creds) {\n  const mapped = typeToService[cred.type];\n  if (mapped === null) continue;\n  const name = mapped || cred.type.replace(/([A-Z])/g, ' $1').replace('Api', ' API').trim();\n  if (!seen.has(name)) { seen.add(name); services.push({ name, type: cred.type }); }\n}\n\nreturn [{ json: { services, serviceList: services.map(s => s.name).join(', '), totalCreds: creds.length, uniqueServices: services.length } }];"
      },
      "typeVersion": 2
    },
    {
      "id": "n-research",
      "name": "Research Pricing with Claude",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        960,
        304
      ],
      "parameters": {
        "text": "=Analyze these {{ $json.uniqueServices }} services and return their API pricing, free tiers, and rate limits.\n\nServices: {{ $json.serviceList }}\n\nReturn ONLY a valid JSON array, no markdown, no explanation:\n[\n  {\n    \"service\": \"service name\",\n    \"category\": \"AI | Storage | Communication | CRM | Productivity | Social | Database | Payment | Other\",\n    \"tier\": \"free | freemium | paid\",\n    \"hasFree\": true or false,\n    \"freeLimits\": \"specific quota e.g. 10K chars/month\",\n    \"paidFrom\": \"lowest price e.g. $10/month\",\n    \"rateLimit\": \"e.g. 60 RPM or No published limit\",\n    \"notes\": \"1-2 sentences on key restrictions\"\n  }\n]",
        "batching": {},
        "messages": {
          "messageValues": [
            {
              "message": "You are an API pricing expert. Return accurate, specific pricing and rate limit data. Return only the JSON array."
            }
          ]
        },
        "promptType": "define"
      },
      "typeVersion": 1.9
    },
    {
      "id": "n-claude-model",
      "name": "Claude Sonnet 4.5",
      "type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
      "position": [
        960,
        528
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "id",
          "value": "claude-sonnet-4-5-20250929"
        },
        "options": {}
      },
      "credentials": {
        "anthropicApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "n-format",
      "name": "Build HTML Report",
      "type": "n8n-nodes-base.code",
      "position": [
        1200,
        304
      ],
      "parameters": {
        "jsCode": "const rawText = $input.first().json.text || '';\nconst meta = $('Extract Service Names').first().json;\n\nlet integrations = [];\ntry {\n  const cleaned = rawText.replace(/```json\\n?/g,'').replace(/```\\n?/g,'').trim();\n  integrations = JSON.parse(cleaned);\n} catch(e) {\n  integrations = [{ service:'Parse Error', category:'Error', tier:'freemium', hasFree:false, freeLimits:'Could not parse response', paidFrom:'N/A', rateLimit:'N/A', notes: rawText.substring(0,300) }];\n}\n\nconst tierOrder = { free:0, freemium:1, paid:2 };\nintegrations.sort((a,b) => {\n  const ta = tierOrder[a.tier]??1, tb = tierOrder[b.tier]??1;\n  return ta!==tb ? ta-tb : a.service.localeCompare(b.service);\n});\n\nconst tierColor={free:'#16a34a',freemium:'#b45309',paid:'#dc2626'};\nconst tierBg={free:'#dcfce7',freemium:'#fef3c7',paid:'#fee2e2'};\nconst tierIcon={free:'\ud83d\udfe2',freemium:'\ud83d\udfe1',paid:'\ud83d\udd34'};\n\nconst rows = integrations.map((item,i) => {\n  const t = item.tier||'freemium';\n  const bg = i%2===0?'#ffffff':'#f9fafb';\n  return `<tr style=\"background:${bg};border-bottom:1px solid #e5e7eb;\">\n    <td style=\"padding:10px 14px;font-weight:600;\">${item.service}</td>\n    <td style=\"padding:10px 14px;color:#6b7280;font-size:13px;\">${item.category||''}</td>\n    <td style=\"padding:10px 14px;\"><span style=\"background:${tierBg[t]};color:${tierColor[t]};padding:3px 10px;border-radius:12px;font-size:12px;font-weight:700;\">${tierIcon[t]} ${t.charAt(0).toUpperCase()+t.slice(1)}</span></td>\n    <td style=\"padding:10px 14px;font-size:13px;\">${item.freeLimits||(item.hasFree?'Yes':'\u274c None')}</td>\n    <td style=\"padding:10px 14px;font-size:13px;\">${item.paidFrom||'N/A'}</td>\n    <td style=\"padding:10px 14px;font-size:13px;\">${item.rateLimit||'N/A'}</td>\n    <td style=\"padding:10px 14px;font-size:12px;color:#6b7280;\">${item.notes||''}</td>\n  </tr>`;\n}).join('');\n\nconst date = new Date().toLocaleDateString('en-US',{year:'numeric',month:'long',day:'numeric'});\nconst freeCount=integrations.filter(i=>i.tier==='free').length;\nconst freemiumCount=integrations.filter(i=>i.tier==='freemium').length;\nconst paidCount=integrations.filter(i=>i.tier==='paid').length;\n\nconst html=`<div style=\"font-family:Arial,sans-serif;max-width:1100px;margin:0 auto;padding:20px;\">\n  <h1 style=\"color:#0F1117;border-bottom:4px solid #EA4B71;padding-bottom:14px;\">\ud83d\udd0c n8n Integration Audit Report</h1>\n  <p style=\"color:#6b7280;\">Generated: ${date} \u00b7 ${meta.totalCreds} credentials \u00b7 ${integrations.length} services analysed</p>\n  <div style=\"display:flex;gap:12px;margin:16px 0 24px;\">\n    <div style=\"background:#dcfce7;color:#16a34a;padding:10px 18px;border-radius:8px;font-weight:700;\">\ud83d\udfe2 Free: ${freeCount}</div>\n    <div style=\"background:#fef3c7;color:#b45309;padding:10px 18px;border-radius:8px;font-weight:700;\">\ud83d\udfe1 Freemium: ${freemiumCount}</div>\n    <div style=\"background:#fee2e2;color:#dc2626;padding:10px 18px;border-radius:8px;font-weight:700;\">\ud83d\udd34 Paid only: ${paidCount}</div>\n  </div>\n  <table style=\"border-collapse:collapse;width:100%;font-size:14px;border:1px solid #e5e7eb;\">\n    <thead><tr style=\"background:#0F1117;color:#fff;\">\n      <th style=\"padding:12px 14px;text-align:left;\">Service</th><th style=\"padding:12px 14px;text-align:left;\">Category</th>\n      <th style=\"padding:12px 14px;text-align:left;\">Tier</th><th style=\"padding:12px 14px;text-align:left;\">Free Limits</th>\n      <th style=\"padding:12px 14px;text-align:left;\">Paid From</th><th style=\"padding:12px 14px;text-align:left;\">Rate Limits</th>\n      <th style=\"padding:12px 14px;text-align:left;\">Notes</th>\n    </tr></thead>\n    <tbody>${rows}</tbody>\n  </table>\n  <p style=\"color:#9ca3af;font-size:12px;margin-top:16px;\">\u26a0\ufe0f Pricing researched by Claude AI \u2014 verify with official docs.</p>\n</div>`;\n\nreturn [{ json:{ html, totalCount:integrations.length, freeCount, freemiumCount, paidCount, date } }];"
      },
      "typeVersion": 2
    },
    {
      "id": "n-email",
      "name": "Email Audit Report",
      "type": "n8n-nodes-base.gmail",
      "position": [
        1440,
        304
      ],
      "parameters": {
        "sendTo": "={{ $('Configuration').first().json.notificationEmail }}",
        "message": "={{ $json.html }}",
        "options": {
          "appendAttribution": false
        },
        "subject": "={{ '\ud83d\udd0c Integration Audit: ' + $json.totalCount + ' services | \ud83d\udfe2 ' + $json.freeCount + ' Free | \ud83d\udfe1 ' + $json.freemiumCount + ' Freemium | \ud83d\udd34 ' + $json.paidCount + ' Paid' }}"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    }
  ],
  "active": false,
  "settings": {
    "callerPolicy": "workflowsFromSameOwner",
    "availableInMCP": false,
    "executionOrder": "v1",
    "saveManualExecutions": true,
    "saveExecutionProgress": true,
    "saveDataErrorExecution": "all",
    "saveDataSuccessExecution": "all"
  },
  "versionId": "9af03acb-c0ca-44a8-abf8-8f1f06d335e8",
  "connections": {
    "Run Audit": {
      "main": [
        [
          {
            "node": "Configuration",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Configuration": {
      "main": [
        [
          {
            "node": "Get n8n Credentials",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build HTML Report": {
      "main": [
        [
          {
            "node": "Email Audit Report",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Claude Sonnet 4.5": {
      "ai_languageModel": [
        [
          {
            "node": "Research Pricing with Claude",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Get n8n Credentials": {
      "main": [
        [
          {
            "node": "Extract Service Names",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Service Names": {
      "main": [
        [
          {
            "node": "Research Pricing with Claude",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Research Pricing with Claude": {
      "main": [
        [
          {
            "node": "Build HTML Report",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

Connects to your n8n instance via API and fetches all credentials you have set up Maps each credential type to its real service name (supports 40+ services: OpenAI, Slack, Notion, Airtable, Google, Stripe, and more) Sends the full list to Claude AI, which researches current…

Source: https://n8n.io/workflows/14125/ — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

Submit a research topic through a form and receive a professionally styled executive report in your inbox — fully automated, with built-in scraping resilience.

Form Trigger, HTTP Request, Chain Llm +3
AI & RAG

This workflow automates Invoice & Payment Tracking (with Approvals) across Notion and Slack. Ingest — You drop invoices/receipts (PDF/IMG/JSON) into the flow. Extract — OCR + parsing pulls out key fie

HTTP Request, Chain Llm, Anthropic Chat +5
AI & RAG

Content - Newsletter Agent. Uses formTrigger, chainLlm, outputParserStructured, httpRequest. Event-driven trigger; 91 nodes.

Form Trigger, Chain Llm, Output Parser Structured +8
AI & RAG

A Telegram bot that converts natural-language work descriptions into detailed cost estimates using AI parsing, vector search, and the open-source DDC CWICR database with 55,000+ construction work item

HTTP Request, Telegram, Telegram Trigger +6
AI & RAG

Content - Newsletter Agent. Uses formTrigger, chainLlm, outputParserStructured, httpRequest. Event-driven trigger; 87 nodes.

Form Trigger, Chain Llm, Output Parser Structured +7