{
  "name": "SP Claims AR Payments Bot - Template",
  "nodes": [
    {
      "parameters": {},
      "type": "n8n-nodes-base.manualTrigger",
      "typeVersion": 1,
      "position": [
        -16,
        -160
      ],
      "id": "8989eb04-9216-4535-b357-1709a049d1b0",
      "name": "When clicking ‘Execute workflow’"
    },
    {
      "parameters": {
        "url": "https://claimworks.servicepower.com:8443/services/claim/v1/retrieval ",
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n  \"manufacturerName\": \"{{ $('Extract Email').item.json.manufacturerName }}\",\n  \"serviceCenterNumber\": \"{{ $('Extract Email').item.json.serviceCenterNumber }}\",\n  \"claimNumber\":\"{{ $('Append or update row in sheet').item.json['OUR INVOICE'] }}\",\n  \"claimBatchNumber\":\"\",\n    \"serialNumber\": \"\",\n\n  \"authentication\": \n  {\n    \"userId\": \"{{ $json.userId }}\",\n    \"password\": \"{{ $json.password }}\"\n  }\n}",
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        1616,
        112
      ],
      "id": "a5b42499-cd5e-4f6d-95d0-452e8c87daa5",
      "name": "HTTP Request"
    },
    {
      "parameters": {
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        },
        "simple": false,
        "filters": {
          "q": "subject: Concern Regarding Old A/Rs"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.gmailTrigger",
      "typeVersion": 1.3,
      "position": [
        -16,
        112
      ],
      "id": "7c741007-1489-45cd-a9af-754fd705553a",
      "name": "Gmail Trigger"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=You are a data extraction specialist. Your task is to parse accounts receivable line items from email text into structured JSON.\n\nExtract each line item with the following fields:\n- po_number: The purchase order number (YOUR P.O. column)\n- invoice_number: The vendor's invoice number (OUR INVOICE column)\n- billed_date: Date in YYYY-MM-DD format\n- amount: Billed amount as a decimal number (no $ or commas)\n- paid_to_date: Amount paid as a decimal number (no $ or commas)\n- balance_due: Balance due as a decimal number (no $ or commas)\n\nRules:\n1. Some rows may have empty PO numbers (they appear as just spaces before the invoice number)\n2. For empty PO numbers, use null\n3. Convert dates from MM/DD/YY to YYYY-MM-DD format\n4. Remove all $ signs and commas from amounts\n5. Return ONLY valid JSON with no markdown, no explanation\n\nOutput format:\n{\n  \"line_items\": [\n    {\n      \"po_number\": \"8809252501\",\n      \"invoice_number\": \"96532\",\n      \"billed_date\": \"2025-05-02\",\n      \"amount\": 240.61,\n      \"paid_to_date\": 0.00,\n      \"balance_due\": 240.61\n    }\n  ]\n}\n```\n\n### **User Prompt (Dynamic):**\n```\nParse the following accounts receivable table data:\n\n{{ $json.tableSection }}\n\nExpected number of line items: {{ $json.totalItems }}\nTotal balance due: ${{ $json.totalValue }}\n\nExtract all line items and return as JSON.",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 3,
      "position": [
        608,
        112
      ],
      "id": "99a86479-a4eb-4c56-ae0a-3e9e706a2877",
      "name": "AI Agent"
    },
    {
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1-mini"
        },
        "builtInTools": {},
        "options": {
          "temperature": 0.1
        }
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "typeVersion": 1.3,
      "position": [
        480,
        320
      ],
      "id": "44ccbf39-1a4f-4ff4-b6d6-1fdfd038df5a",
      "name": "OpenAI Chat Model"
    },
    {
      "parameters": {
        "jsCode": "// Get the AI response from current input\nconst aiOutput = $input.item.json.output;\n\n// Parse JSON\nlet cleanJson = aiOutput.trim();\ncleanJson = cleanJson.replace(/```json\\n?/g, '').replace(/```\\n?/g, '');\nconst parsed = JSON.parse(cleanJson);\n\n// Get line items array\nconst lineItems = parsed.line_items || [];\n\n// Return clean array with only the 6 fields needed for Google Sheets\nreturn lineItems.map(item => ({ \n  json: {\n    po_number: item.po_number || '',  // Empty string instead of null for Sheets\n    invoice_number: item.invoice_number,\n    billed_date: item.billed_date,\n    amount: parseFloat(item.amount),\n    paid_to_date: parseFloat(item.paid_to_date),\n    balance_due: parseFloat(item.balance_due)\n  }\n}));"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        960,
        112
      ],
      "id": "69661142-bc6c-4fdd-8bb8-2a59fa81e6fc",
      "name": "Code in JavaScript1"
    },
    {
      "parameters": {
        "operation": "appendOrUpdate",
        "documentId": {
          "__rl": true,
          "value": "YOUR_ID",
          "mode": "list"
        },
        "sheetName": {
          "__rl": true,
          "value": "gid=0",
          "mode": "list"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "OUR INVOICE": "={{ $json.invoice_number }}",
            "YOUR P.O.": "={{ $json.po_number }}",
            "BILLED DATE": "={{ $json.billed_date }}",
            "AMOUNT": "={{ $json.amount }}",
            "PdToDt": "={{ $json.paid_to_date }}",
            "BALANCE DUE": "={{ $json.balance_due }}"
          },
          "matchingColumns": [
            "OUR INVOICE"
          ],
          "schema": [
            {
              "id": "YOUR P.O.",
              "displayName": "YOUR P.O.",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "OUR INVOICE",
              "displayName": "OUR INVOICE",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "BILLED DATE",
              "displayName": "BILLED DATE",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "AMOUNT",
              "displayName": "AMOUNT",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "PdToDt",
              "displayName": "PdToDt",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "BALANCE DUE",
              "displayName": "BALANCE DUE",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "SP STATUS",
              "displayName": "SP STATUS",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "PAYMENT METHOD",
              "displayName": "PAYMENT METHOD",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "PAID LABOR",
              "displayName": "PAID LABOR",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "PAYMENT REFERENCE",
              "displayName": "PAYMENT REFERENCE",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            }
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {}
      },
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.7,
      "position": [
        1168,
        112
      ],
      "id": "1e319448-e47e-4472-9609-d6fc04ba3f5e",
      "name": "Append or update row in sheet"
    },
    {
      "parameters": {
        "operation": "update",
        "documentId": {
          "__rl": true,
          "value": "YOUR_ID",
          "mode": "list"
        },
        "sheetName": {
          "__rl": true,
          "value": "gid=0",
          "mode": "list"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "OUR INVOICE": "={{ $json.claims[0].claimNumber }}",
            "SP STATUS": "={{ $json.claims[0].claimStatusDescription }}",
            "PAYMENT METHOD": "={{ $json.claims[0].paymentMethod }}",
            "PAYMENT REFERENCE": "={{ $json.claims[0].paymentTransactionNumber }}",
            "PAID LABOR": "={{ $json.claims[0].paidLaborAmount }}"
          },
          "matchingColumns": [
            "OUR INVOICE"
          ],
          "schema": [
            {
              "id": "YOUR P.O.",
              "displayName": "YOUR P.O.",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "OUR INVOICE",
              "displayName": "OUR INVOICE",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "BILLED DATE",
              "displayName": "BILLED DATE",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "AMOUNT",
              "displayName": "AMOUNT",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "PdToDt",
              "displayName": "PdToDt",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "BALANCE DUE",
              "displayName": "BALANCE DUE",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "SP STATUS",
              "displayName": "SP STATUS",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "PAYMENT METHOD",
              "displayName": "PAYMENT METHOD",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "PAID LABOR",
              "displayName": "PAID LABOR",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "PAYMENT REFERENCE",
              "displayName": "PAYMENT REFERENCE",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "row_number",
              "displayName": "row_number",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "number",
              "canBeUsedToMatch": true,
              "readOnly": true,
              "removed": true
            }
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {}
      },
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.7,
      "position": [
        1824,
        112
      ],
      "id": "aa1ac152-624f-4974-b457-354243e1fbc2",
      "name": "Update row in sheet"
    },
    {
      "parameters": {
        "jsCode": "// Get the email data from Gmail trigger\nconst email = $('Gmail Trigger').item.json;\n\n// Function to decode HTML entities and strip tags\nfunction cleanHtml(html) {\n  if (!html) return '';\n  \n  // Remove HTML tags\n  let text = html\n    .replace(/<br\\s*\\/?>/gi, '\\n')  // Convert <br> to newline first\n    .replace(/<[^>]*>/g, ' ');       // Then strip other tags\n  \n  // Decode HTML entities\n  text = text\n    .replace(/&nbsp;/g, ' ')\n    .replace(/&amp;/g, '&')\n    .replace(/&lt;/g, '<')\n    .replace(/&gt;/g, '>')\n    .replace(/&quot;/g, '\"')\n    .replace(/&#39;/g, \"'\")\n    .replace(/&apos;/g, \"'\");\n  \n  // Clean up whitespace\n  text = text\n    .replace(/\\s+/g, ' ')\n    .replace(/\\n\\s*\\n/g, '\\n')\n    .trim();\n  \n  return text;\n}\n\n// Extract metadata from email object\nconst sender = email.from?.text || email.from?.value?.[0]?.address || '';\nconst senderName = email.from?.value?.[0]?.name || '';\nconst senderEmail = email.from?.value?.[0]?.address || '';\nconst subject = email.subject || '';\nconst dateReceived = email.date || '';\nconst messageId = email.messageId || '';\n\n// Get email body (prefer HTML, fallback to text)\nlet emailBody = '';\nif (email.html) {\n  emailBody = cleanHtml(email.html);\n} else if (email.text) {\n  // The text field contains RTF, we need to strip RTF codes\n  emailBody = email.text\n    .replace(/\\{\\\\rtf1.*?\\}/g, '') // Remove RTF control groups\n    .replace(/\\\\par\\s*/g, '\\n')    // Convert \\par to newlines\n    .replace(/\\\\[a-z]+\\d*\\s*/g, '') // Remove other RTF commands\n    .replace(/\\{|\\}/g, '')          // Remove braces\n    .trim();\n}\n\n// If HTML exists, use that as primary source\nconst primaryBody = email.html ? cleanHtml(email.html) : emailBody;\n\n// Extract email date from body (appears at top of message)\nconst emailDateMatch = primaryBody.match(/([A-Z][a-z]+\\s+\\d{1,2},\\s+\\d{4})/);\nconst emailDate = emailDateMatch ? emailDateMatch[1] : null;\n\n// Extract customer/manufacturer name\n// Pattern: After \"Claims Department\" and before \"Dear Sir or Madam\"\nconst customerMatch = primaryBody.match(/Claims\\s+Department\\s+([^\\n]+)\\s+Dear\\s+Sir/i);\nconst customerName = customerMatch ? customerMatch[1].trim() : null;\n\n// Manufacturer mapping table with serviceCenterNumber\nconst manufacturerMap = {\n  'FRIGIDAIRE': { \n    name: 'ELECTROLUX', \n    serviceCenter: '$input.first().json.FRIGIDAIRE' \n  },\n  'ELECTROLUX': { \n    name: 'ELECTROLUX', \n    serviceCenter: '$input.first().json.FRIGIDAIRE' \n  },\n  'GE': { \n    name: 'GE_APPLIANCES', \n    serviceCenter: '$input.first().json.GE' \n  },\n  'GE APPLIANCES': { \n    name: 'GE_APPLIANCES', \n    serviceCenter: '$input.first().json.GE' \n  },\n  'LGE': { \n    name: 'LG', \n    serviceCenter: '$input.first().json.LGE' \n  },\n  'BOSCH': { \n    name: 'BSH', \n    serviceCenter: '$input.first().json.BOSCH' \n  },\n  'BSH': { \n    name: 'BSH', \n    serviceCenter: '$input.first().json.BOSCH' \n  },\n  'SPEED QUEEN': { \n    name: 'ALLIANCE_LAUNDRY', \n    serviceCenter: '$input.first().json[\"SPEED QUEEN\"]' \n  },\n  'ALLIANCE': { \n    name: 'ALLIANCE_LAUNDRY', \n    serviceCenter: '$input.first().json[\"SPEED QUEEN\"]' \n  },\n  \n  'SQUARE TRADE': { \n    name: 'SQUARE_TRADE', \n    serviceCenter: '$input.first().json[\"SQUARE TRADE\"]' \n  },\n  'SQUARETRADE': { \n    name: 'SQUARE_TRADE', \n    serviceCenter: '$input.first().json[\"SQUARE TRADE\"]' \n  },\n  'ASSURANT': { \n    name: 'ASSURANT_SOLUTIONS', \n    serviceCenter: '$input.first().json.ASSURANT' \n  },\n  'ASSURANT SOLUTIONS': { \n    name: 'ASSURANT_SOLUTIONS', \n    serviceCenter: '$input.first().json.ASSURANT' \n  }\n};\n\n// Map customer to manufacturer name and service center\nconst normalizedCustomer = (customerName || '').toUpperCase().trim();\nconst manufacturerData = manufacturerMap[normalizedCustomer];\nconst manufacturerName = manufacturerData ? manufacturerData.name : normalizedCustomer || 'UNKNOWN';\nconst serviceCenterNumber = manufacturerData ? manufacturerData.serviceCenter : null;\nconst manufacturerMappingFound = manufacturerMap.hasOwnProperty(normalizedCustomer);\n\n// Extract key summary numbers from body\nconst itemsMatch = primaryBody.match(/(\\d+)\\s+items?\\s+outstanding/i);\nconst totalValueMatch = primaryBody.match(/total\\s+value\\s+of\\s+\\$?([\\d,]+\\.?\\d*)/i);\nconst paidToDateMatch = primaryBody.match(/less\\s+\\$?([\\d,]+\\.?\\d*)\\s+paid\\s+to\\s+date/i);\nconst daysOverdueMatch = primaryBody.match(/more\\s+than\\s+(\\d+)\\s+days?\\s+past\\s+due/i);\n\n// Extract the table section\n// Look for \"LIST OF PAST DUE ITEMS\" header\nconst listHeaderMatch = primaryBody.match(/LIST\\s+OF\\s+PAST\\s+DUE\\s+ITEMS([\\s\\S]*)/i);\nlet tableSection = '';\n\nif (listHeaderMatch) {\n  tableSection = listHeaderMatch[1].trim();\n  \n  // Find column headers and extract everything after them\n  const headerMatch = tableSection.match(/YOUR\\s+P\\.O\\..+?BALANCE\\s+DUE\\s+([\\s\\S]*)/i);\n  if (headerMatch) {\n    tableSection = headerMatch[1].trim();\n    \n    // Remove \"Thanking you\" footer if present\n    tableSection = tableSection.replace(/Thanking\\s+you\\s+in\\s+advance.*/is, '').trim();\n  }\n}\n\n// Calculate totals from extracted values\nconst totalItems = itemsMatch ? parseInt(itemsMatch[1]) : 0;\nconst totalValue = totalValueMatch ? parseFloat(totalValueMatch[1].replace(/,/g, '')) : 0;\nconst paidToDate = paidToDateMatch ? parseFloat(paidToDateMatch[1].replace(/,/g, '')) : 0;\nconst daysOverdue = daysOverdueMatch ? parseInt(daysOverdueMatch[1]) : 0;\n\nreturn {\n  json: {\n    // Email metadata\n    messageId: messageId,\n    sender: sender,\n    senderName: senderName,\n    senderEmail: senderEmail,\n    vendorName: senderName || senderEmail.split('@')[0],\n    subject: subject,\n    dateReceived: dateReceived,\n    emailDate: emailDate,\n    \n    // Customer and Manufacturer\n    customerName: customerName,\n    manufacturerName: manufacturerName,\n    serviceCenterNumber: serviceCenterNumber,\n    manufacturerMappingFound: manufacturerMappingFound,\n    \n    // Summary information\n    totalItems: totalItems,\n    totalValue: totalValue,\n    paidToDate: paidToDate,\n    balanceOutstanding: totalValue - paidToDate,\n    daysOverdue: daysOverdue,\n    \n    // Table data for AI parsing\n    tableSection: tableSection,\n    fullBody: primaryBody,\n    \n    // Validation flags\n    hasTableData: tableSection.length > 50,\n    hasValidMetadata: totalItems > 0 && totalValue > 0,\n    hasCustomer: customerName !== null,\n    hasServiceCenter: serviceCenterNumber !== null,\n    \n    // For debugging\n    rawHtml: email.html || null,\n    rawText: email.text || null\n  }\n};"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        432,
        112
      ],
      "id": "5e9ca69d-5ef3-4183-b3e3-9cbf242bec9b",
      "name": "Extract Email"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "073e50f0-5c61-455c-8a1f-2931ee163dc3",
              "name": "userId",
              "value": "Your Service Power userId",
              "type": "string"
            },
            {
              "id": "d4767d23-334c-4af3-ae28-964357e6ecd0",
              "name": "password",
              "value": "Your Service Power password",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1392,
        112
      ],
      "id": "e0cc7faa-be5e-46d2-a2c1-5cc0adfe1343",
      "name": "Service Power Credentials"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "377b8926-8a51-4909-98e9-e92263feb448",
              "name": "LGE",
              "value": "",
              "type": "string"
            },
            {
              "id": "089931e1-2e0e-449c-ad7f-29a854a40d49",
              "name": "FRIGIDAIRE",
              "value": "",
              "type": "string"
            },
            {
              "id": "49dda6f6-ae43-4f03-8713-6050af48a955",
              "name": "GE",
              "value": "",
              "type": "string"
            },
            {
              "id": "9ad532c5-f9fe-4437-a943-ec40baaba186",
              "name": "BOSCH",
              "value": "",
              "type": "string"
            },
            {
              "id": "2f698693-97cf-4c84-b237-94a5b385f3c9",
              "name": "SPEED QUEEN",
              "value": "",
              "type": "string"
            },
            {
              "id": "ba8bf128-4bac-43b8-bd3d-6407b18dc997",
              "name": "SQUARE TRADE",
              "value": "",
              "type": "string"
            },
            {
              "id": "b73df34c-004c-46f2-b52a-b565672767da",
              "name": "ASSURANT",
              "value": "",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        240,
        112
      ],
      "id": "934100d3-cd38-4a5b-8fa8-3fa29e8a3fc5",
      "name": "Set Manufacturer Service Accounts"
    }
  ],
  "pinData": {},
  "connections": {
    "When clicking ‘Execute workflow’": {
      "main": [
        [
          {
            "node": "Extract Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Gmail Trigger": {
      "main": [
        [
          {
            "node": "Set Manufacturer Service Accounts",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent": {
      "main": [
        [
          {
            "node": "Code in JavaScript1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code in JavaScript1": {
      "main": [
        [
          {
            "node": "Append or update row in sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Append or update row in sheet": {
      "main": [
        [
          {
            "node": "Service Power Credentials",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request": {
      "main": [
        [
          {
            "node": "Update row in sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Email": {
      "main": [
        [
          {
            "node": "AI Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Service Power Credentials": {
      "main": [
        [
          {
            "node": "HTTP Request",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Manufacturer Service Accounts": {
      "main": [
        [
          {
            "node": "Extract Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1",
    "availableInMCP": false
  },
  "meta": {
    "templateCredsSetupCompleted": false
  }
}