{
  "workflow": {
    "id": 8943,
    "name": "Automated monthly & quarterly Stripe revenue reports to Slack with financial insights",
    "views": 136,
    "recentViews": 0,
    "totalViews": 136,
    "createdAt": "2025-09-26T08:59:36.141Z",
    "description": "## Description\nAutomate your financial reporting by pulling charge and refund data from Stripe, calculating key revenue and risk metrics, and delivering professional reports directly into Slack. This workflow runs on a monthly or quarterly schedule, processes Stripe data into insights, and formats a rich Slack message with revenue breakdowns, top customers, refund analysis, and payment method insights. 📊💰💬\n\n## What This Template Does\n- Runs automatically on a monthly (1st day) or quarterly schedule (every 3 months) at 9 AM. ⏱️\n- Fetches Stripe charges and refunds for the reporting period. 💳\n- Merges charge and refund data for a unified dataset. 🔄\n- Calculates financial metrics: total revenue, net revenue, average transaction value, refund rate. 📈\n- Estimates growth metrics: Monthly Recurring Revenue (MRR) and Annual Recurring Revenue (ARR). 🚀\n- Identifies top 3 customers by revenue. 🏆\n- Breaks down payment methods used (e.g., Visa, Mastercard, etc.). 💳\n- Performs risk analysis on transactions by Stripe’s risk scores. ⚠️\n- Analyzes refund reasons and generates insights. 🔄\n- Formats all results into a clear, structured Slack message with sections for finance, growth, risk, and customers. 💬\n\n## Key Benefits\n- Eliminates manual Stripe report exports. ⚡\n- Ensures timely financial reporting (monthly or quarterly). 📅\n- Provides instant visibility of revenue, refunds, and risks in Slack. 📲\n- Surfaces top customers and payment methods for strategic insights. 🏅\n- Helps finance and ops teams catch anomalies early (high refunds or risky transactions). 🛡️\n- Keeps leadership and teams aligned with automated reporting. 👩‍💻👨‍💻\n\n## Features\n- Schedule Triggers – Automates reporting on monthly or quarterly cycles.\n- Stripe Charges & Refunds – Pulls transaction and refund data directly from Stripe API.\n- Merge Node – Combines charges and refunds into a single dataset.\n- Custom Code Metrics – Calculates revenue, net revenue, refund rates, and growth metrics.\n- Top Customer Analysis – Highlights top revenue-generating customers.\n- Payment Breakdown – Shows revenue split by card brand/payment method.\n- Refund Analysis – Summarizes refund reasons and rates.\n- Risk Analysis – Categorizes payments by low, medium, or high risk scores.\n- Slack Integration – Delivers insights in a professional report format.\n\n## Requirements\n- n8n instance (cloud or self-hosted).\n- Stripe API credentials with read access to charges and refunds.\n- Slack Bot token with chat:write permission.\n- Target Audience\n- Finance teams needing automated recurring Stripe reports. 💼\n- SaaS companies monitoring MRR, ARR, and refunds. 🚀\n- Founders/Execs who want financial dashboards in Slack. 👩‍💼\n- Operations teams tracking risk and refund trends. 🛠️\n- Remote teams relying on Slack for reporting. 🌍\n\n## Step-by-Step Setup Instructions\n- Connect your Stripe API credentials in n8n. 🔑\n- Connect your Slack API credentials and select your target channel. 💬\n- Adjust the schedule triggers (monthly/quarterly) if needed. ⏱️\n- Customize the Slack message formatting if you want branding or tone changes. 🎨\n- Test the workflow with sample data to confirm financial metrics. ✅\n",
    "workflow": {
      "id": "2K34ps0eKEbH4n1w",
      "meta": {
        "instanceId": "8443f10082278c46aa5cf3acf8ff0f70061a2c58bce76efac814b16290845177",
        "templateCredsSetupCompleted": true
      },
      "name": "Quaterly/Monthly Revenue Summary To Slack",
      "tags": [],
      "nodes": [
        {
          "id": "4ab84e5a-6892-4428-bda6-3a8bdb8a2255",
          "name": "Workflow Description",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -336,
            272
          ],
          "parameters": {
            "color": 6,
            "width": 310,
            "height": 480,
            "content": "## 📊 Stripe Financial Reporting Workflow\n\nThis workflow automatically generates comprehensive monthly and quarterly financial reports from your Stripe data and sends them to Slack.\n\n**Features:**\n- Monthly reports on the 1st of each month\n- Quarterly reports every 3 months\n- Revenue analysis with refund tracking\n- Customer insights and payment method breakdown\n- Risk analysis and refund reasons\n- Automated Slack notifications\n\n**Perfect for:** Business owners, finance teams, and anyone who needs regular Stripe revenue insights delivered automatically."
          },
          "typeVersion": 1
        },
        {
          "id": "c7612bb2-02bc-4ca2-b8fe-cd1ae7562c41",
          "name": "Setup Instructions",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -384,
            -96
          ],
          "parameters": {
            "color": 7,
            "width": 358,
            "height": 320,
            "content": "## ⚙️ Setup Instructions\n\n1. **Stripe API Credentials:** Add your Stripe API key in the credential settings\n2. **Slack Integration:** Connect your Slack workspace and select the target channel\n3. **Schedule Timing:** Modify cron expressions if you want different timing\n4. **Channel Configuration:** Update the Slack channel ID to your desired channel\n\n**Important:** Test the workflow manually before enabling the schedule triggers!"
          },
          "typeVersion": 1
        },
        {
          "id": "29f2e1af-d3a6-4c02-b727-3b0f35084544",
          "name": "Monthly Schedule (1st day, 9 AM)",
          "type": "n8n-nodes-base.scheduleTrigger",
          "position": [
            128,
            128
          ],
          "parameters": {
            "rule": {
              "interval": [
                {
                  "field": "cronExpression",
                  "expression": "0 9 1 */1 *"
                }
              ]
            }
          },
          "typeVersion": 1
        },
        {
          "id": "7012ee9d-438f-40e8-9f17-f29be330a3a1",
          "name": "Quarterly Schedule (1st day every 3 months, 9 AM)",
          "type": "n8n-nodes-base.scheduleTrigger",
          "position": [
            128,
            320
          ],
          "parameters": {
            "rule": {
              "interval": [
                {
                  "field": "cronExpression",
                  "expression": "0 9 1 */3 *"
                }
              ]
            }
          },
          "typeVersion": 1
        },
        {
          "id": "edac5bee-0e1f-468f-884a-ef99558c12e8",
          "name": "Schedule Note",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            16,
            -144
          ],
          "parameters": {
            "color": 7,
            "width": 342,
            "height": 240,
            "content": "## 🗓️ Schedule Configuration\n\n**Monthly:** Runs on the 1st of every month at 9 AM\n**Quarterly:** Runs on the 1st day of every 3rd month at 9 AM\n\nBoth triggers feed into the same date calculation logic to determine the appropriate reporting period."
          },
          "typeVersion": 1
        },
        {
          "id": "eeef03a3-45f4-4bdd-ab84-0c43e7ad1afa",
          "name": "Calculate Date Range",
          "type": "n8n-nodes-base.code",
          "position": [
            352,
            224
          ],
          "parameters": {
            "jsCode": "// Determine if this is monthly or quarterly based on current date\nconst now = new Date();\nconst currentMonth = now.getMonth() + 1; // getMonth() returns 0-11\n\n// Check if current month is a quarter start (Jan=1, Apr=4, Jul=7, Oct=10)\nconst isQuarterly = currentMonth % 3 === 1;\n\n// Calculate date ranges\nlet startDate, endDate, period;\n\nif (isQuarterly && [1, 4, 7, 10].includes(currentMonth)) {\n  // Quarterly report - get previous quarter\n  const quarterStartMonth = currentMonth - 3;\n  startDate = new Date(now.getFullYear(), quarterStartMonth - 1, 1);\n  if (quarterStartMonth <= 0) {\n    startDate = new Date(now.getFullYear() - 1, quarterStartMonth + 12 - 1, 1);\n  }\n  endDate = new Date(now.getFullYear(), currentMonth - 1, 0); // Last day of previous month\n  period = 'quarterly';\n} else {\n  // Monthly report - get previous month\n  startDate = new Date(now.getFullYear(), currentMonth - 2, 1);\n  if (currentMonth === 1) {\n    startDate = new Date(now.getFullYear() - 1, 11, 1); // December of previous year\n  }\n  endDate = new Date(now.getFullYear(), currentMonth - 1, 0); // Last day of previous month\n  period = 'monthly';\n}\n\n// Convert to Unix timestamps for Stripe API\nconst startTimestamp = Math.floor(startDate.getTime() / 1000);\nconst endTimestamp = Math.floor(endDate.getTime() / 1000);\n\nreturn [{\n  json: {\n    startDate: startTimestamp,\n    endDate: endTimestamp,\n    period: period,\n    startDateFormatted: startDate.toISOString().split('T')[0],\n    endDateFormatted: endDate.toISOString().split('T')[0]\n  }\n}];"
          },
          "typeVersion": 2
        },
        {
          "id": "a66fb369-570e-4494-a2a9-ce2071757e4e",
          "name": "Date Range Note",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            288,
            384
          ],
          "parameters": {
            "color": 7,
            "width": 246,
            "height": 288,
            "content": "## 📅 Date Range Logic\n\nThis node determines whether to generate a monthly or quarterly report based on the current date and calculates the appropriate date range for data collection.\n\nOutputs Unix timestamps for Stripe API compatibility."
          },
          "typeVersion": 1
        },
        {
          "id": "5d537942-36cb-40e5-b20c-d36c26a1c94b",
          "name": "Get Stripe Charges",
          "type": "n8n-nodes-base.stripe",
          "position": [
            576,
            128
          ],
          "parameters": {
            "resource": "charge",
            "operation": "getAll",
            "returnAll": true
          },
          "credentials": {
            "stripeApi": {
              "id": "credential-id",
              "name": "stripeApi Credential"
            }
          },
          "typeVersion": 1
        },
        {
          "id": "f6301611-55a1-4598-ba5c-14ece63f4e55",
          "name": "Stripe Data Note",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            464,
            -128
          ],
          "parameters": {
            "color": 7,
            "width": 326,
            "height": 240,
            "content": "## 💳 Stripe Data Collection\n\n**Charges Node:** Fetches all successful payments\n**Refunds Node:** Fetches all refund transactions\n\nBoth nodes use your Stripe API credentials and collect data for the calculated date range."
          },
          "typeVersion": 1
        },
        {
          "id": "d1f56e15-1867-4677-a044-0be5fc745288",
          "name": "Format Slack Message",
          "type": "n8n-nodes-base.code",
          "position": [
            1248,
            224
          ],
          "parameters": {
            "jsCode": "const data = $json;\n\n// Format currency\nconst formatCurrency = (amount) => {\n  return new Intl.NumberFormat('en-US', {\n    style: 'currency',\n    currency: 'USD'\n  }).format(amount);\n};\n\n// Format percentage\nconst formatPercentage = (value) => {\n  return `${value}%`;\n};\n\n// Create period title from metadata\nconst periodTitle = `Revenue Report - ${data.metadata.period}`;\n\n// Build top customers text\nlet topCustomersText = '';\nif (data.customers.topCustomers && data.customers.topCustomers.length > 0) {\n  topCustomersText = data.customers.topCustomers.map((customer, index) => {\n    const customerName = customer.customer === 'Unknown Customer' ? \n      'Unknown Customer' : \n      `Customer ${customer.customer.substring(4, 14)}...`; // Show more meaningful part of customer ID\n    return `   ${index + 1}. ${customerName}: ${formatCurrency(customer.amount)}`;\n  }).join('\\n');\n} else {\n  topCustomersText = '   No customer data available';\n}\n\n// Build payment methods breakdown\nlet paymentMethodsText = '';\nif (data.payments.paymentMethodBreakdown) {\n  paymentMethodsText = Object.entries(data.payments.paymentMethodBreakdown)\n    .map(([method, amount]) => `   • ${method.charAt(0).toUpperCase() + method.slice(1)}: ${formatCurrency(amount)}`)\n    .join('\\n');\n}\n\n// Build refund reasons text\nlet refundReasonsText = '';\nif (data.refundAnalysis.refundReasons && Object.keys(data.refundAnalysis.refundReasons).length > 0) {\n  refundReasonsText = Object.entries(data.refundAnalysis.refundReasons)\n    .map(([reason, count]) => `   • ${reason.replace(/_/g, ' ').replace(/\\b\\w/g, l => l.toUpperCase())}: ${count}`)\n    .join('\\n');\n} else {\n  refundReasonsText = '   No refunds in this period';\n}\n\n// Risk level summary\nconst riskSummary = `Low: ${data.payments.riskAnalysis.low} | Medium: ${data.payments.riskAnalysis.medium} | High: ${data.payments.riskAnalysis.high}`;\n\n// Build the comprehensive Slack message\nconst slackMessage = `📊 **${periodTitle}**\n📅 *Generated: ${new Date(data.metadata.dataProcessedAt).toLocaleDateString()}*\n\n💰 **Financial Summary:**\n• Total Revenue: ${formatCurrency(data.summary.totalRevenue)}\n• Total Refunds: ${formatCurrency(data.summary.totalRefunds)}\n• Net Revenue: ${formatCurrency(data.summary.netRevenue)}\n• Average Transaction: ${formatCurrency(data.summary.averageTransactionValue)}\n\n📈 **Growth Metrics:**\n• Estimated MRR: ${formatCurrency(data.growth.estimatedMRR)}\n• Estimated ARR: ${formatCurrency(data.growth.estimatedARR)}\n\n📊 **Transaction Analysis:**\n• Successful Transactions: ${data.summary.totalTransactions}\n• Refund Transactions: ${data.summary.totalRefundTransactions}\n• Refund Rate: ${formatPercentage(data.summary.refundRate)}\n• Unique Customers: ${data.customers.uniqueCustomers}\n\n🏆 **Top Customers by Revenue:**\n${topCustomersText}\n\n💳 **Payment Methods:**\n${paymentMethodsText}\n\n⚠️ **Risk Analysis:**\n${riskSummary}\n\n🔄 **Refund Analysis:**\n• Refund Rate: ${formatPercentage(data.refundAnalysis.refundRate)}\n**Refund Reasons:**\n${refundReasonsText}\n\n---\n*Data processed: ${data.metadata.chargesAnalyzed} charges, ${data.metadata.refundsAnalyzed} refunds*\n*Auto-generated from Stripe API*`;\n\nreturn [{\n  json: {\n    text: slackMessage,\n    // Include original data for reference\n    originalData: data,\n    // Additional Slack formatting options\n    blocks: [\n      {\n        \"type\": \"section\",\n        \"text\": {\n          \"type\": \"mrkdwn\",\n          \"text\": slackMessage\n        }\n      }\n    ]\n  }\n}];"
          },
          "typeVersion": 2
        },
        {
          "id": "ba6697a5-1aac-4b74-859f-6344c20fadfc",
          "name": "Slack Format Note",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            1184,
            384
          ],
          "parameters": {
            "color": 7,
            "width": 278,
            "height": 288,
            "content": "## 💬 Slack Message Formatting\n\nTransforms the financial metrics into a beautifully formatted Slack message with:\n- Emojis and formatting\n- Currency formatting\n- Percentage calculations\n- Organized sections for easy reading"
          },
          "typeVersion": 1
        },
        {
          "id": "85f38b2b-9e5a-4cb6-a2cf-56687a822544",
          "name": "Calculate Financial Metrics",
          "type": "n8n-nodes-base.code",
          "position": [
            1024,
            224
          ],
          "parameters": {
            "jsCode": "// Get all merged data from the merge node\nconst allData = $input.all();\n\n// Separate charges and refunds based on the data structure\nlet charges = [];\nlet refunds = [];\n\n// Process each item from the merged data\nallData.forEach(item => {\n  const data = item.json;\n  \n  // Check if this is a charge object\n  if (data.object === 'charge') {\n    charges.push(data);\n  }\n  // Check if this is refunds list object\n  else if (data.object === 'list' && data.data) {\n    // Extract refund objects from the list\n    refunds = refunds.concat(data.data);\n  }\n  // Check if this is a single refund object\n  else if (data.object === 'refund') {\n    refunds.push(data);\n  }\n});\n\n// Filter only successful/paid charges that are not refunded\nconst paidCharges = charges.filter(charge => \n  charge.status === 'succeeded' && \n  charge.paid === true &&\n  charge.amount_refunded === 0 // This means not refunded\n);\n\n// Calculate total revenue from non-refunded charges\nconst totalRevenue = paidCharges.reduce((sum, charge) => {\n  return sum + (charge.amount / 100); // Convert from cents to dollars\n}, 0);\n\n// Calculate total refunds amount\nconst totalRefundsAmount = refunds.reduce((sum, refund) => {\n  return sum + (refund.amount / 100); // Convert from cents to dollars\n}, 0);\n\n// Calculate net revenue\nconst netRevenue = totalRevenue - totalRefundsAmount;\n\n// Get customer revenue breakdown\nconst customerRevenue = {};\npaidCharges.forEach(charge => {\n  const customer = charge.customer || 'Unknown Customer';\n  const amount = charge.amount / 100;\n  customerRevenue[customer] = (customerRevenue[customer] || 0) + amount;\n});\n\n// Get top 3 customers by revenue\nconst topCustomers = Object.entries(customerRevenue)\n  .sort(([,a], [,b]) => b - a)\n  .slice(0, 3)\n  .map(([customer, amount]) => ({ \n    customer, \n    amount: Math.round(amount * 100) / 100 \n  }));\n\n// Calculate payment method breakdown\nconst paymentMethodBreakdown = {};\npaidCharges.forEach(charge => {\n  const brand = charge.payment_method_details?.card?.brand || 'unknown';\n  const amount = charge.amount / 100;\n  paymentMethodBreakdown[brand] = (paymentMethodBreakdown[brand] || 0) + amount;\n});\n\n// Calculate average transaction value\nconst averageTransactionValue = paidCharges.length > 0 ? totalRevenue / paidCharges.length : 0;\n\n// Get current date for period estimation\nconst currentDate = new Date();\nconst currentMonth = currentDate.getMonth() + 1;\nconst currentYear = currentDate.getFullYear();\n\n// Simple MRR estimation (assuming monthly data)\nconst estimatedMRR = totalRevenue;\nconst estimatedARR = estimatedMRR * 12;\n\n// Risk analysis based on risk scores\nconst riskAnalysis = {\n  low: paidCharges.filter(c => c.outcome?.risk_score <= 20).length,\n  medium: paidCharges.filter(c => c.outcome?.risk_score > 20 && c.outcome?.risk_score <= 50).length,\n  high: paidCharges.filter(c => c.outcome?.risk_score > 50).length\n};\n\n// Refund reasons breakdown\nconst refundReasons = {};\nrefunds.forEach(refund => {\n  const reason = refund.reason || 'no_reason_given';\n  refundReasons[reason] = (refundReasons[reason] || 0) + 1;\n});\n\nreturn [{\n  json: {\n    // Summary metrics\n    summary: {\n      totalRevenue: Math.round(totalRevenue * 100) / 100,\n      totalRefunds: Math.round(totalRefundsAmount * 100) / 100,\n      netRevenue: Math.round(netRevenue * 100) / 100,\n      totalTransactions: paidCharges.length,\n      totalRefundTransactions: refunds.length,\n      averageTransactionValue: Math.round(averageTransactionValue * 100) / 100,\n      refundRate: paidCharges.length > 0 ? Math.round((refunds.length / paidCharges.length) * 100 * 100) / 100 : 0\n    },\n    \n    // Growth metrics\n    growth: {\n      estimatedMRR: Math.round(estimatedMRR * 100) / 100,\n      estimatedARR: Math.round(estimatedARR * 100) / 100\n    },\n    \n    // Customer insights\n    customers: {\n      topCustomers: topCustomers,\n      uniqueCustomers: Object.keys(customerRevenue).length\n    },\n    \n    // Payment analysis\n    payments: {\n      paymentMethodBreakdown: paymentMethodBreakdown,\n      riskAnalysis: riskAnalysis\n    },\n    \n    // Refund analysis\n    refundAnalysis: {\n      refundReasons: refundReasons,\n      refundRate: totalRevenue > 0 ? Math.round((totalRefundsAmount / totalRevenue) * 100 * 100) / 100 : 0\n    },\n    \n    // Metadata\n    metadata: {\n      dataProcessedAt: new Date().toISOString(),\n      chargesAnalyzed: charges.length,\n      refundsAnalyzed: refunds.length,\n      period: `${currentMonth}/${currentYear}`\n    }\n  }\n}];"
          },
          "typeVersion": 2
        },
        {
          "id": "7695ff48-1b74-4a29-9d1c-963515e0c7de",
          "name": "Financial Metrics Note",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            960,
            -240
          ],
          "parameters": {
            "color": 7,
            "width": 246,
            "height": 432,
            "content": "## 📊 Financial Analysis Engine\n\nThis node processes the merged Stripe data to calculate:\n- Revenue metrics (total, net, average)\n- Customer insights (top customers, unique count)\n- Payment method breakdown\n- Risk analysis by transaction risk score\n- Refund analysis with reasons\n- Growth metrics (MRR/ARR estimates)\n\nAll amounts are converted from cents to dollars and properly rounded."
          },
          "typeVersion": 1
        },
        {
          "id": "ce84cff7-e8e7-474a-9c30-e93a032f2074",
          "name": "Merge",
          "type": "n8n-nodes-base.merge",
          "position": [
            800,
            224
          ],
          "parameters": {},
          "typeVersion": 3.2
        },
        {
          "id": "6d4051e6-7972-47c4-99e1-57e109edcbb5",
          "name": "Merge Note",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            752,
            384
          ],
          "parameters": {
            "color": 7,
            "width": 246,
            "content": "## 🔄 Data Merger\n\nCombines charges and refunds data streams into a single dataset for comprehensive analysis."
          },
          "typeVersion": 1
        },
        {
          "id": "eb6df223-4d46-47f9-bd11-44a1b16b2c8b",
          "name": "Send To Slack",
          "type": "n8n-nodes-base.slack",
          "position": [
            1472,
            224
          ],
          "webhookId": "4e77062d-a1d4-46ca-8d70-1a3bf3beaa71",
          "parameters": {
            "text": "={{ $json.text }}",
            "select": "channel",
            "channelId": {
              "__rl": true,
              "mode": "list",
              "value": "C09H21LK9BJ",
              "cachedResultName": "reply-needed"
            },
            "otherOptions": {
              "mrkdwn": true
            }
          },
          "credentials": {
            "slackApi": {
              "id": "credential-id",
              "name": "slackApi Credential"
            }
          },
          "typeVersion": 2
        },
        {
          "id": "c57a3d62-a880-46fd-95a6-5d9ea10b5e85",
          "name": "Slack Delivery Note",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            1472,
            -64
          ],
          "parameters": {
            "color": 7,
            "width": 294,
            "height": 240,
            "content": "## 🚀 Slack Delivery\n\n**IMPORTANT:** Update the channelId value to match your target Slack channel.\n\nThe formatted report will be sent with markdown formatting enabled for better readability."
          },
          "typeVersion": 1
        },
        {
          "id": "25c482b2-ffed-4faf-afd3-5148ded842f1",
          "name": "Get Stripe Refunds",
          "type": "n8n-nodes-base.httpRequest",
          "position": [
            576,
            320
          ],
          "parameters": {
            "url": "https://api.stripe.com/v1/refunds",
            "options": {},
            "sendQuery": true,
            "authentication": "predefinedCredentialType",
            "queryParameters": {
              "parameters": [
                {
                  "name": "limit",
                  "value": "100"
                }
              ]
            },
            "nodeCredentialType": "stripeApi"
          },
          "credentials": {
            "stripeApi": {
              "id": "credential-id",
              "name": "stripeApi Credential"
            }
          },
          "typeVersion": 4.1
        }
      ],
      "active": false,
      "pinData": {},
      "settings": {
        "executionOrder": "v1"
      },
      "versionId": "7edbbd68-e5ad-4b54-a498-8d1b69da06a2",
      "connections": {
        "Merge": {
          "main": [
            [
              {
                "node": "Calculate Financial Metrics",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Get Stripe Charges": {
          "main": [
            [
              {
                "node": "Merge",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Get Stripe Refunds": {
          "main": [
            [
              {
                "node": "Merge",
                "type": "main",
                "index": 1
              }
            ]
          ]
        },
        "Calculate Date Range": {
          "main": [
            [
              {
                "node": "Get Stripe Charges",
                "type": "main",
                "index": 0
              },
              {
                "node": "Get Stripe Refunds",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Format Slack Message": {
          "main": [
            [
              {
                "node": "Send To Slack",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Calculate Financial Metrics": {
          "main": [
            [
              {
                "node": "Format Slack Message",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Monthly Schedule (1st day, 9 AM)": {
          "main": [
            [
              {
                "node": "Calculate Date Range",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Quarterly Schedule (1st day every 3 months, 9 AM)": {
          "main": [
            [
              {
                "node": "Calculate Date Range",
                "type": "main",
                "index": 0
              }
            ]
          ]
        }
      }
    },
    "lastUpdatedBy": 1,
    "workflowInfo": {
      "nodeCount": 18,
      "nodeTypes": {
        "n8n-nodes-base.code": {
          "count": 3
        },
        "n8n-nodes-base.merge": {
          "count": 1
        },
        "n8n-nodes-base.slack": {
          "count": 1
        },
        "n8n-nodes-base.stripe": {
          "count": 1
        },
        "n8n-nodes-base.stickyNote": {
          "count": 9
        },
        "n8n-nodes-base.httpRequest": {
          "count": 1
        },
        "n8n-nodes-base.scheduleTrigger": {
          "count": 2
        }
      }
    },
    "status": "published",
    "user": {
      "name": "Rahul Joshi",
      "username": "rahul08",
      "bio": "Rahul Joshi is a seasoned technology leader specializing in the n8n automation tool and AI-driven workflow automation. With deep expertise in building open-source workflow automation and self-hosted automation platforms, he helps organizations eliminate manual processes through intelligent n8n ai agent automation solutions.\n\n",
      "verified": true,
      "links": [
        "https://www.linkedin.com/in/callrahul/"
      ],
      "avatar": "https://gravatar.com/avatar/b6cf57822463143589b36ada06fbf6cb1509223a740fae3160b28f1ce41ccc12?r=pg&d=retro&size=200"
    },
    "nodes": [
      {
        "id": 19,
        "icon": "file:httprequest.svg",
        "name": "n8n-nodes-base.httpRequest",
        "codex": {
          "data": {
            "alias": [
              "API",
              "Request",
              "URL",
              "Build",
              "cURL"
            ],
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/",
                  "icon": "☀️",
                  "label": "2021: The Year to Automate the New You with n8n"
                },
                {
                  "url": "https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/",
                  "icon": "🧬",
                  "label": "Why business process automation with n8n can change your daily life"
                },
                {
                  "url": "https://n8n.io/blog/automatically-pulling-and-visualizing-data-with-n8n/",
                  "icon": "📈",
                  "label": "Automatically pulling and visualizing data with n8n"
                },
                {
                  "url": "https://n8n.io/blog/learn-how-to-automatically-cross-post-your-content-with-n8n/",
                  "icon": "✍️",
                  "label": "Learn how to automatically cross-post your content with n8n"
                },
                {
                  "url": "https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/",
                  "icon": "🧾",
                  "label": "Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"
                },
                {
                  "url": "https://n8n.io/blog/running-n8n-on-ships-an-interview-with-maranics/",
                  "icon": "🛳",
                  "label": "Running n8n on ships: An interview with Maranics"
                },
                {
                  "url": "https://n8n.io/blog/what-are-apis-how-to-use-them-with-no-code/",
                  "icon": " 🪢",
                  "label": "What are APIs and how to use them with no code"
                },
                {
                  "url": "https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/",
                  "icon": "⚡️",
                  "label": "5 tasks you can automate with the new Notion API "
                },
                {
                  "url": "https://n8n.io/blog/world-poetry-day-workflow/",
                  "icon": "📜",
                  "label": "Celebrating World Poetry Day with a daily poem in Telegram"
                },
                {
                  "url": "https://n8n.io/blog/automate-google-apps-for-productivity/",
                  "icon": "💡",
                  "label": "15 Google apps you can combine and automate to increase productivity"
                },
                {
                  "url": "https://n8n.io/blog/automate-designs-with-bannerbear-and-n8n/",
                  "icon": "🎨",
                  "label": "Automate Designs with Bannerbear and n8n"
                },
                {
                  "url": "https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/",
                  "icon": " 🕸️",
                  "label": "How uProc scraped a multi-page website with a low-code workflow"
                },
                {
                  "url": "https://n8n.io/blog/building-an-expense-tracking-app-in-10-minutes/",
                  "icon": "📱",
                  "label": "Building an expense tracking app in 10 minutes"
                },
                {
                  "url": "https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/",
                  "icon": "🤖",
                  "label": "5 workflow automations for Mattermost that we love at n8n"
                },
                {
                  "url": "https://n8n.io/blog/how-to-use-the-http-request-node-the-swiss-army-knife-for-workflow-automation/",
                  "icon": "🧰",
                  "label": "How to use the HTTP Request Node - The Swiss Army Knife for Workflow Automation"
                },
                {
                  "url": "https://n8n.io/blog/learn-how-to-use-webhooks-with-mattermost-slash-commands/",
                  "icon": "🦄",
                  "label": "Learn how to use webhooks with Mattermost slash commands"
                },
                {
                  "url": "https://n8n.io/blog/how-a-membership-development-manager-automates-his-work-and-investments/",
                  "icon": "📈",
                  "label": "How a Membership Development Manager automates his work and investments"
                },
                {
                  "url": "https://n8n.io/blog/a-low-code-bitcoin-ticker-built-with-questdb-and-n8n-io/",
                  "icon": "📈",
                  "label": "A low-code bitcoin ticker built with QuestDB and n8n.io"
                },
                {
                  "url": "https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/",
                  "icon": "🎡",
                  "label": "How to set up a no-code CI/CD pipeline with GitHub and TravisCI"
                },
                {
                  "url": "https://n8n.io/blog/automations-for-activists/",
                  "icon": "✨",
                  "label": "How Common Knowledge use workflow automation for activism"
                },
                {
                  "url": "https://n8n.io/blog/creating-scheduled-text-affirmations-with-n8n/",
                  "icon": "🤟",
                  "label": "Creating scheduled text affirmations with n8n"
                },
                {
                  "url": "https://n8n.io/blog/how-goomer-automated-their-operations-with-over-200-n8n-workflows/",
                  "icon": "🛵",
                  "label": "How Goomer automated their operations with over 200 n8n workflows"
                },
                {
                  "url": "https://n8n.io/blog/aws-workflow-automation/",
                  "label": "7 no-code workflow automations for Amazon Web Services"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/"
                }
              ]
            },
            "categories": [
              "Development",
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Helpers"
              ]
            }
          }
        },
        "group": "[\"output\"]",
        "defaults": {
          "name": "HTTP Request",
          "color": "#0004F5"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00MCAyMEM0MCA4Ljk1MzE0IDMxLjA0NjkgMCAyMCAwQzguOTUzMTQgMCAwIDguOTUzMTQgMCAyMEMwIDMxLjA0NjkgOC45NTMxNCA0MCAyMCA0MEMzMS4wNDY5IDQwIDQwIDMxLjA0NjkgNDAgMjBaTTIwIDM2Ljk0NThDMTguODg1MiAzNi45NDU4IDE3LjEzNzggMzUuOTY3IDE1LjQ5OTggMzIuNjk4NUMxNC43OTY0IDMxLjI5MTggMTQuMTk2MSAyOS41NDMxIDEzLjc1MjYgMjcuNjg0N0gyNi4xODk4QzI1LjgwNDUgMjkuNTQwMyAyNS4yMDQ0IDMxLjI5MDEgMjQuNTAwMiAzMi42OTg1QzIyLjg2MjIgMzUuOTY3IDIxLjExNDggMzYuOTQ1OCAyMCAzNi45NDU4Wk0xMi45MDY0IDIwQzEyLjkwNjQgMjEuNjA5NyAxMy4wMDg3IDIzLjE2NCAxMy4yMDAzIDI0LjYzMDVIMjYuNzk5N0MyNi45OTEzIDIzLjE2NCAyNy4wOTM2IDIxLjYwOTcgMjcuMDkzNiAyMEMyNy4wOTM2IDE4LjM5MDMgMjYuOTkxMyAxNi44MzYgMjYuNzk5NyAxNS4zNjk1SDEzLjIwMDNDMTMuMDA4NyAxNi44MzYgMTIuOTA2NCAxOC4zOTAzIDEyLjkwNjQgMjBaTTIwIDMuMDU0MTlDMjEuMTE0OSAzLjA1NDE5IDIyLjg2MjIgNC4wMzA3OCAyNC41MDAxIDcuMzAwMzlDMjUuMjA2NiA4LjcxNDA4IDI1LjgwNzIgMTAuNDA2NyAyNi4xOTIgMTIuMzE1M0gxMy43NTAxQzE0LjE5MzMgMTAuNDA0NyAxNC43OTQyIDguNzEyNTQgMTUuNDk5OCA3LjMwMDY0QzE3LjEzNzcgNC4wMzA4MyAxOC44ODUxIDMuMDU0MTkgMjAgMy4wNTQxOVpNMzAuMTQ3OCAyMEMzMC4xNDc4IDE4LjQwOTkgMzAuMDU0MyAxNi44NjE3IDI5LjgyMjcgMTUuMzY5NUgzNi4zMDQyQzM2LjcyNTIgMTYuODQyIDM2Ljk0NTggMTguMzk2NCAzNi45NDU4IDIwQzM2Ljk0NTggMjEuNjAzNiAzNi43MjUyIDIzLjE1OCAzNi4zMDQyIDI0LjYzMDVIMjkuODIyN0MzMC4wNTQzIDIzLjEzODMgMzAuMTQ3OCAyMS41OTAxIDMwLjE0NzggMjBaTTI2LjI3NjcgNC4yNTUxMkMyNy42MzY1IDYuMzYwMTkgMjguNzExIDkuMTMyIDI5LjM3NzQgMTIuMzE1M0gzNS4xMDQ2QzMzLjI1MTEgOC42NjggMzAuMTA3IDUuNzgzNDYgMjYuMjc2NyA0LjI1NTEyWk0xMC42MjI2IDEyLjMxNTNINC44OTI5M0M2Ljc1MTQ3IDguNjY3ODQgOS44OTM1MSA1Ljc4MzQxIDEzLjcyMzIgNC4yNTUxM0MxMi4zNjM1IDYuMzYwMjEgMTEuMjg5IDkuMTMyMDEgMTAuNjIyNiAxMi4zMTUzWk0zLjA1NDE5IDIwQzMuMDU0MTkgMjEuNjAzIDMuMjc3NDMgMjMuMTU3NSAzLjY5NDg0IDI0LjYzMDVIMTAuMTIxN0M5Ljk0NjE5IDIzLjE0MiA5Ljg1MjIyIDIxLjU5NDMgOS44NTIyMiAyMEM5Ljg1MjIyIDE4LjQwNTcgOS45NDYxOSAxNi44NTggMTAuMTIxNyAxNS4zNjk1SDMuNjk0ODRDMy4yNzc0MyAxNi44NDI1IDMuMDU0MTkgMTguMzk3IDMuMDU0MTkgMjBaTTI2LjI3NjYgMzUuNzQyN0MyNy42MzY1IDMzLjYzOTMgMjguNzExIDMwLjg2OCAyOS4zNzc0IDI3LjY4NDdIMzUuMTA0NkMzMy4yNTEgMzEuMzMyMiAzMC4xMDY4IDM0LjIxNzkgMjYuMjc2NiAzNS43NDI3Wk0xMy43MjM0IDM1Ljc0MjdDOS44OTM2OSAzNC4yMTc5IDYuNzUxNTUgMzEuMzMyNCA0Ljg5MjkzIDI3LjY4NDdIMTAuNjIyNkMxMS4yODkgMzAuODY4IDEyLjM2MzUgMzMuNjM5MyAxMy43MjM0IDM1Ljc0MjdaIiBmaWxsPSIjM0E0MkU5Ii8+Cjwvc3ZnPgo="
        },
        "displayName": "HTTP Request",
        "typeVersion": 4,
        "nodeCategories": [
          {
            "id": 5,
            "name": "Development"
          },
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 24,
        "icon": "file:merge.svg",
        "name": "n8n-nodes-base.merge",
        "codex": {
          "data": {
            "alias": [
              "Join",
              "Concatenate",
              "Wait"
            ],
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/how-to-sync-data-between-two-systems/",
                  "icon": "🏬",
                  "label": "How to synchronize data between two systems (one-way vs. two-way sync"
                },
                {
                  "url": "https://n8n.io/blog/supercharging-your-conference-registration-process-with-n8n/",
                  "icon": "🎫",
                  "label": "Supercharging your conference registration process with n8n"
                },
                {
                  "url": "https://n8n.io/blog/migrating-community-metrics-to-orbit-using-n8n/",
                  "icon": "📈",
                  "label": "Migrating Community Metrics to Orbit using n8n"
                },
                {
                  "url": "https://n8n.io/blog/build-your-own-virtual-assistant-with-n8n-a-step-by-step-guide/",
                  "icon": "👦",
                  "label": "Build your own virtual assistant with n8n: A step by step guide"
                },
                {
                  "url": "https://n8n.io/blog/sending-automated-congratulations-with-google-sheets-twilio-and-n8n/",
                  "icon": "🙌",
                  "label": "Sending Automated Congratulations with Google Sheets, Twilio, and n8n "
                },
                {
                  "url": "https://n8n.io/blog/aws-workflow-automation/",
                  "label": "7 no-code workflow automations for Amazon Web Services"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.merge/"
                }
              ]
            },
            "categories": [
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Flow",
                "Data Transformation"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "Merge"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8xMTc3XzUxOCkiPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTAgNDhDMCAyMS40OTAzIDIxLjQ5MDMgMCA0OCAwSDExMkMxMzguNTEgMCAxNjAgMjEuNDkwMyAxNjAgNDhWNTZIMTk2LjI1MkMyNDAuNDM1IDU2IDI3Ni4yNTIgOTEuODE3MiAyNzYuMjUyIDEzNlYxOTJDMjc2LjI1MiAyMTQuMDkxIDI5NC4xNjEgMjMyIDMxNi4yNTIgMjMySDM1MlYyMjRDMzUyIDE5Ny40OSAzNzMuNDkgMTc2IDQwMCAxNzZINDY0QzQ5MC41MSAxNzYgNTEyIDE5Ny40OSA1MTIgMjI0VjI4OEM1MTIgMzE0LjUxIDQ5MC41MSAzMzYgNDY0IDMzNkg0MDBDMzczLjQ5IDMzNiAzNTIgMzE0LjUxIDM1MiAyODhWMjgwSDMxNi4yNTJDMjk0LjE2MSAyODAgMjc2LjI1MiAyOTcuOTA5IDI3Ni4yNTIgMzIwVjM3NkMyNzYuMjUyIDQyMC4xODMgMjQwLjQzNSA0NTYgMTk2LjI1MiA0NTZIMTYwVjQ2NEMxNjAgNDkwLjUxIDEzOC41MSA1MTIgMTEyIDUxMkg0OEMyMS40OTAzIDUxMiAwIDQ5MC41MSAwIDQ2NFY0MDBDMCAzNzMuNDkgMjEuNDkwMyAzNTIgNDggMzUySDExMkMxMzguNTEgMzUyIDE2MCAzNzMuNDkgMTYwIDQwMFY0MDhIMTk2LjI1MkMyMTMuOTI1IDQwOCAyMjguMjUyIDM5My42NzMgMjI4LjI1MiAzNzZWMzIwQzIyOC4yNTIgMjk0Ljc4NCAyMzguODU5IDI3Mi4wNDQgMjU1Ljg1MyAyNTZDMjM4Ljg1OSAyMzkuOTU2IDIyOC4yNTIgMjE3LjIxNiAyMjguMjUyIDE5MlYxMzZDMjI4LjI1MiAxMTguMzI3IDIxMy45MjUgMTA0IDE5Ni4yNTIgMTA0SDE2MFYxMTJDMTYwIDEzOC41MSAxMzguNTEgMTYwIDExMiAxNjBINDhDMjEuNDkwMyAxNjAgMCAxMzguNTEgMCAxMTJWNDhaTTEwNCA0OEMxMDguNDE4IDQ4IDExMiA1MS41ODE3IDExMiA1NlYxMDRDMTEyIDEwOC40MTggMTA4LjQxOCAxMTIgMTA0IDExMkg1NkM1MS41ODE3IDExMiA0OCAxMDguNDE4IDQ4IDEwNFY1NkM0OCA1MS41ODE3IDUxLjU4MTcgNDggNTYgNDhIMTA0Wk00NTYgMjI0QzQ2MC40MTggMjI0IDQ2NCAyMjcuNTgyIDQ2NCAyMzJWMjgwQzQ2NCAyODQuNDE4IDQ2MC40MTggMjg4IDQ1NiAyODhINDA4QzQwMy41ODIgMjg4IDQwMCAyODQuNDE4IDQwMCAyODBWMjMyQzQwMCAyMjcuNTgyIDQwMy41ODIgMjI0IDQwOCAyMjRINDU2Wk0xMTIgNDA4QzExMiA0MDMuNTgyIDEwOC40MTggNDAwIDEwNCA0MDBINTZDNTEuNTgxNyA0MDAgNDggNDAzLjU4MiA0OCA0MDhWNDU2QzQ4IDQ2MC40MTggNTEuNTgxNyA0NjQgNTYgNDY0SDEwNEMxMDguNDE4IDQ2NCAxMTIgNDYwLjQxOCAxMTIgNDU2VjQwOFoiIGZpbGw9IiM1NEI4QzkiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xMTc3XzUxOCI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="
        },
        "displayName": "Merge",
        "typeVersion": 3,
        "nodeCategories": [
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 40,
        "icon": "file:slack.svg",
        "name": "n8n-nodes-base.slack",
        "codex": {
          "data": {
            "alias": [
              "human",
              "form",
              "wait",
              "hitl",
              "approval"
            ],
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/no-code-ecommerce-workflow-automations/",
                  "icon": "store",
                  "label": "6 e-commerce workflows to power up your Shopify s"
                },
                {
                  "url": "https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/",
                  "icon": "⚙️",
                  "label": "Automate your data processing pipeline in 9 steps"
                },
                {
                  "url": "https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/",
                  "icon": "👥",
                  "label": "How to get started with CRM automation (with 3 no-code workflow ideas"
                },
                {
                  "url": "https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/",
                  "icon": "⚡️",
                  "label": "5 tasks you can automate with the new Notion API "
                },
                {
                  "url": "https://n8n.io/blog/build-your-own-virtual-assistant-with-n8n-a-step-by-step-guide/",
                  "icon": "👦",
                  "label": "Build your own virtual assistant with n8n: A step by step guide"
                },
                {
                  "url": "https://n8n.io/blog/how-to-automatically-give-kudos-to-contributors-with-github-slack-and-n8n/",
                  "icon": "👏",
                  "label": "How to automatically give kudos to contributors with GitHub, Slack, and n8n"
                },
                {
                  "url": "https://n8n.io/blog/automations-for-activists/",
                  "icon": "✨",
                  "label": "How Common Knowledge use workflow automation for activism"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.slack/"
                }
              ],
              "credentialDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/credentials/slack/"
                }
              ]
            },
            "categories": [
              "Communication",
              "HITL"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "HITL": [
                "Human in the Loop"
              ]
            }
          }
        },
        "group": "[\"output\"]",
        "defaults": {
          "name": "Slack"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiB2aWV3Qm94PSIwIDAgMTUwLjg1MiAxNTAuODUyIj48dXNlIHhsaW5rOmhyZWY9IiNhIiB4PSIuOTI2IiB5PSIuOTI2Ii8+PHN5bWJvbCBpZD0iYSIgb3ZlcmZsb3c9InZpc2libGUiPjxnIHN0cm9rZS13aWR0aD0iMS44NTIiPjxwYXRoIGZpbGw9IiNlMDFlNWEiIHN0cm9rZT0iI2UwMWU1YSIgZD0iTTQwLjc0MSA5My41NWMwLTguNzM1IDYuNjA3LTE1Ljc3MiAxNC44MTUtMTUuNzcyczE0LjgxNSA3LjAzNyAxNC44MTUgMTUuNzcydjM4LjgyNGMwIDguNzM3LTYuNjA3IDE1Ljc3NC0xNC44MTUgMTUuNzc0cy0xNC44MTUtNy4wMzctMTQuODE1LTE1Ljc3MnoiLz48cGF0aCBmaWxsPSIjZWNiMjJkIiBzdHJva2U9IiNlY2IyMmQiIGQ9Ik05My41NSAxMDcuNDA4Yy04LjczNSAwLTE1Ljc3Mi02LjYwNy0xNS43NzItMTQuODE1czcuMDM3LTE0LjgxNSAxNS43NzItMTQuODE1aDM4LjgyNmM4LjczNSAwIDE1Ljc3MiA2LjYwNyAxNS43NzIgMTQuODE1cy03LjAzNyAxNC44MTUtMTUuNzcyIDE0LjgxNXoiLz48cGF0aCBmaWxsPSIjMmZiNjdjIiBzdHJva2U9IiMyZmI2N2MiIGQ9Ik03Ny43NzggMTUuNzcyQzc3Ljc3OCA3LjAzNyA4NC4zODUgMCA5Mi41OTMgMHMxNC44MTUgNy4wMzcgMTQuODE1IDE1Ljc3MnYzOC44MjZjMCA4LjczNS02LjYwNyAxNS43NzItMTQuODE1IDE1Ljc3MnMtMTQuODE1LTcuMDM3LTE0LjgxNS0xNS43NzJ6Ii8+PHBhdGggZmlsbD0iIzM2YzVmMSIgc3Ryb2tlPSIjMzZjNWYxIiBkPSJNMTUuNzcyIDcwLjM3MUM3LjAzNyA3MC4zNzEgMCA2My43NjMgMCA1NS41NTZzNy4wMzctMTQuODE1IDE1Ljc3Mi0xNC44MTVoMzguODI2YzguNzM1IDAgMTUuNzcyIDYuNjA3IDE1Ljc3MiAxNC44MTVzLTcuMDM3IDE0LjgxNS0xNS43NzIgMTQuODE1eiIvPjxnIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiPjxwYXRoIGZpbGw9IiNlY2IyMmQiIHN0cm9rZT0iI2VjYjIyZCIgZD0iTTc3Ljc3OCAxMzMuMzMzYzAgOC4yMDggNi42MDcgMTQuODE1IDE0LjgxNSAxNC44MTVzMTQuODE1LTYuNjA3IDE0LjgxNS0xNC44MTUtNi42MDctMTQuODE1LTE0LjgxNS0xNC44MTVINzcuNzc4eiIvPjxwYXRoIGZpbGw9IiMyZmI2N2MiIHN0cm9rZT0iIzJmYjY3YyIgZD0iTTEzMy4zMzQgNzAuMzcxaC0xNC44MTVWNTUuNTU2YzAtOC4yMDcgNi42MDctMTQuODE1IDE0LjgxNS0xNC44MTVzMTQuODE1IDYuNjA3IDE0LjgxNSAxNC44MTUtNi42MDcgMTQuODE1LTE0LjgxNSAxNC44MTV6Ii8+PHBhdGggZmlsbD0iI2UwMWU1YSIgc3Ryb2tlPSIjZTAxZTVhIiBkPSJNMTQuODE1IDc3Ljc3OEgyOS42M3YxNC44MTVjMCA4LjIwNy02LjYwNyAxNC44MTUtMTQuODE1IDE0LjgxNVMwIDEwMC44IDAgOTIuNTkzczYuNjA3LTE0LjgxNSAxNC44MTUtMTQuODE1eiIvPjxwYXRoIGZpbGw9IiMzNmM1ZjEiIHN0cm9rZT0iIzM2YzVmMSIgZD0iTTcwLjM3MSAxNC44MTVWMjkuNjNINTUuNTU2Yy04LjIwNyAwLTE0LjgxNS02LjYwNy0xNC44MTUtMTQuODE1UzQ3LjM0OCAwIDU1LjU1NiAwczE0LjgxNSA2LjYwNyAxNC44MTUgMTQuODE1eiIvPjwvZz48L2c+PC9zeW1ib2w+PC9zdmc+"
        },
        "displayName": "Slack",
        "typeVersion": 2,
        "nodeCategories": [
          {
            "id": 6,
            "name": "Communication"
          },
          {
            "id": 28,
            "name": "HITL"
          }
        ]
      },
      {
        "id": 499,
        "icon": "file:stripe.svg",
        "name": "n8n-nodes-base.stripe",
        "codex": {
          "data": {
            "resources": {
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.stripe/"
                }
              ],
              "credentialDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/credentials/stripe/"
                }
              ]
            },
            "categories": [
              "Finance & Accounting",
              "Sales"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0"
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "Stripe"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjU0IC04MCAzNjAgMzYwIj48cGF0aCBkPSJNNDE0IDExMy40YzAtMjUuNi0xMi40LTQ1LjgtMzYuMS00NS44LTIzLjggMC0zOC4yIDIwLjItMzguMiA0NS42IDAgMzAuMSAxNyA0NS4zIDQxLjQgNDUuMyAxMS45IDAgMjAuOS0yLjcgMjcuNy02LjV2LTIwYy02LjggMy40LTE0LjYgNS41LTI0LjUgNS41LTkuNyAwLTE4LjMtMy40LTE5LjQtMTUuMmg0OC45YzAtMS4zLjItNi41LjItOC45bS00OS40LTkuNWMwLTExLjMgNi45LTE2IDEzLjItMTYgNi4xIDAgMTIuNiA0LjcgMTIuNiAxNnptLTYzLjUtMzYuM2MtOS44IDAtMTYuMSA0LjYtMTkuNiA3LjhsLTEuMy02LjJoLTIydjExNi42bDI1LTUuMy4xLTI4LjNjMy42IDIuNiA4LjkgNi4zIDE3LjcgNi4zIDE3LjkgMCAzNC4yLTE0LjQgMzQuMi00Ni4xLS4xLTI5LTE2LjYtNDQuOC0zNC4xLTQ0LjhtLTYgNjguOWMtNS45IDAtOS40LTIuMS0xMS44LTQuN2wtLjEtMzcuMWMyLjYtMi45IDYuMi00LjkgMTEuOS00LjkgOS4xIDAgMTUuNCAxMC4yIDE1LjQgMjMuMyAwIDEzLjQtNi4yIDIzLjQtMTUuNCAyMy40bS03MS4zLTc0LjggMjUuMS01LjRWMzZsLTI1LjEgNS4zem0wIDcuNmgyNS4xdjg3LjVoLTI1LjF6bS0yNi45IDcuNC0xLjYtNy40aC0yMS42djg3LjVoMjVWOTcuNWM1LjktNy43IDE1LjktNi4zIDE5LTUuMnYtMjNjLTMuMi0xLjItMTQuOS0zLjQtMjAuOCA3LjRtLTUwLTI5LjEtMjQuNCA1LjItLjEgODAuMWMwIDE0LjggMTEuMSAyNS43IDI1LjkgMjUuNyA4LjIgMCAxNC4yLTEuNSAxNy41LTMuM1YxMzVjLTMuMiAxLjMtMTkgNS45LTE5LTguOVY5MC42aDE5VjY5LjNoLTE5ek03OS4zIDk0LjdjMC0zLjkgMy4yLTUuNCA4LjUtNS40IDcuNiAwIDE3LjIgMi4zIDI0LjggNi40VjcyLjJjLTguMy0zLjMtMTYuNS00LjYtMjQuOC00LjZDNjcuNSA2Ny42IDU0IDc4LjIgNTQgOTUuOWMwIDI3LjYgMzggMjMuMiAzOCAzNS4xIDAgNC42LTQgNi4xLTkuNiA2LjEtOC4zIDAtMTguOS0zLjQtMjcuMy04djIzLjhjOS4zIDQgMTguNyA1LjcgMjcuMyA1LjcgMjAuOCAwIDM1LjEtMTAuMyAzNS4xLTI4LjItLjEtMjkuOC0zOC4yLTI0LjUtMzguMi0zNS43IiBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7ZmlsbDojNjM1YmZmIi8+PC9zdmc+"
        },
        "displayName": "Stripe",
        "typeVersion": 1,
        "nodeCategories": [
          {
            "id": 2,
            "name": "Sales"
          },
          {
            "id": 8,
            "name": "Finance & Accounting"
          }
        ]
      },
      {
        "id": 565,
        "icon": "fa:sticky-note",
        "name": "n8n-nodes-base.stickyNote",
        "codex": {
          "data": {
            "alias": [
              "Comments",
              "Notes",
              "Sticky"
            ],
            "categories": [
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Helpers"
              ]
            }
          }
        },
        "group": "[\"input\"]",
        "defaults": {
          "name": "Sticky Note",
          "color": "#FFD233"
        },
        "iconData": {
          "icon": "sticky-note",
          "type": "icon"
        },
        "displayName": "Sticky Note",
        "typeVersion": 1,
        "nodeCategories": [
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 834,
        "icon": "file:code.svg",
        "name": "n8n-nodes-base.code",
        "codex": {
          "data": {
            "alias": [
              "cpde",
              "Javascript",
              "JS",
              "Python",
              "Script",
              "Custom Code",
              "Function"
            ],
            "details": "The Code node allows you to execute JavaScript in your workflow.",
            "resources": {
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.code/"
                }
              ]
            },
            "categories": [
              "Development",
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Helpers",
                "Data Transformation"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "Code"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8xMTcxXzQ0MSkiPgo8cGF0aCBkPSJNMTcwLjI4MyA0OEgxOTYuNUMyMDMuMTI3IDQ4IDIwOC41IDQyLjYyNzQgMjA4LjUgMzZWMTJDMjA4LjUgNS4zNzI1OCAyMDMuMTI3IDAgMTk2LjUgMEgxNzAuMjgzQzEyNi4xIDAgOTAuMjgzIDM1LjgxNzIgOTAuMjgzIDgwVjE3NkM5MC4yODMgMjA2LjkyOCA2NS4yMTA5IDIzMiAzNC4yODMgMjMySDIzQzE2LjM3MjYgMjMyIDExIDIzNy4zNzIgMTEgMjQ0VjI2OEMxMSAyNzQuNjI3IDE2LjM3MjQgMjgwIDIyLjk5OTYgMjgwTDM0LjI4MyAyODBDNjUuMjEwOSAyODAgOTAuMjgzIDMwNS4wNzIgOTAuMjgzIDMzNlY0NDBDOTAuMjgzIDQ3OS43NjQgMTIyLjUxOCA1MTIgMTYyLjI4MyA1MTJIMTk2LjVDMjAzLjEyNyA1MTIgMjA4LjUgNTA2LjYyNyAyMDguNSA1MDBWNDc2QzIwOC41IDQ2OS4zNzMgMjAzLjEyNyA0NjQgMTk2LjUgNDY0SDE2Mi4yODNDMTQ5LjAyOCA0NjQgMTM4LjI4MyA0NTMuMjU1IDEzOC4yODMgNDQwVjMzNkMxMzguMjgzIDMwOS4wMjIgMTI4LjAxMSAyODQuNDQzIDExMS4xNjQgMjY1Ljk2MUMxMDYuMTA5IDI2MC40MTYgMTA2LjEwOSAyNTEuNTg0IDExMS4xNjQgMjQ2LjAzOUMxMjguMDExIDIyNy41NTcgMTM4LjI4MyAyMDIuOTc4IDEzOC4yODMgMTc2VjgwQzEzOC4yODMgNjIuMzI2OSAxNTIuNjEgNDggMTcwLjI4MyA0OFoiIGZpbGw9IiNGRjk5MjIiLz4KPHBhdGggZD0iTTMwNSAzNkMzMDUgNDIuNjI3NCAzMTAuMzczIDQ4IDMxNyA0OEgzNDIuOTc5QzM2MC42NTIgNDggMzc0Ljk3OCA2Mi4zMjY5IDM3NC45NzggODBWMTc2QzM3NC45NzggMjAyLjk3OCAzODUuMjUxIDIyNy41NTcgNDAyLjA5OCAyNDYuMDM5QzQwNy4xNTMgMjUxLjU4NCA0MDcuMTUzIDI2MC40MTYgNDAyLjA5OCAyNjUuOTYxQzM4NS4yNTEgMjg0LjQ0MyAzNzQuOTc4IDMwOS4wMjIgMzc0Ljk3OCAzMzZWNDMyQzM3NC45NzggNDQ5LjY3MyAzNjAuNjUyIDQ2NCAzNDIuOTc5IDQ2NEgzMTdDMzEwLjM3MyA0NjQgMzA1IDQ2OS4zNzMgMzA1IDQ3NlY1MDBDMzA1IDUwNi42MjcgMzEwLjM3MyA1MTIgMzE3IDUxMkgzNDIuOTc5QzM4Ny4xNjEgNTEyIDQyMi45NzggNDc2LjE4MyA0MjIuOTc4IDQzMlYzMzZDNDIyLjk3OCAzMDUuMDcyIDQ0OC4wNTEgMjgwIDQ3OC45NzkgMjgwSDQ5MEM0OTYuNjI3IDI4MCA1MDIgMjc0LjYyOCA1MDIgMjY4VjI0NEM1MDIgMjM3LjM3MyA0OTYuNjI4IDIzMiA0OTAgMjMyTDQ3OC45NzkgMjMyQzQ0OC4wNTEgMjMyIDQyMi45NzggMjA2LjkyOCA0MjIuOTc4IDE3NlY4MEM0MjIuOTc4IDM1LjgxNzIgMzg3LjE2MSAwIDM0Mi45NzkgMEgzMTdDMzEwLjM3MyAwIDMwNSA1LjM3MjU4IDMwNSAxMlYzNloiIGZpbGw9IiNGRjk5MjIiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xMTcxXzQ0MSI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="
        },
        "displayName": "Code",
        "typeVersion": 2,
        "nodeCategories": [
          {
            "id": 5,
            "name": "Development"
          },
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 839,
        "icon": "fa:clock",
        "name": "n8n-nodes-base.scheduleTrigger",
        "codex": {
          "data": {
            "alias": [
              "Time",
              "Scheduler",
              "Polling",
              "Cron",
              "Interval"
            ],
            "resources": {
              "generic": [],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.scheduletrigger/"
                }
              ]
            },
            "categories": [
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0"
          }
        },
        "group": "[\"trigger\",\"schedule\"]",
        "defaults": {
          "name": "Schedule Trigger",
          "color": "#31C49F"
        },
        "iconData": {
          "icon": "clock",
          "type": "icon"
        },
        "displayName": "Schedule Trigger",
        "typeVersion": 1,
        "nodeCategories": [
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      }
    ],
    "categories": [
      {
        "id": 35,
        "name": "Document Extraction"
      }
    ],
    "image": []
  }
}