{
  "name": "QBR Auto-Prep Generator",
  "nodes": [
    {
      "id": "sticky-overview", "name": "Overview", "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [-240, -500],
      "parameters": { "content": "## QBR Auto-Prep Generator\nVersion 1.0.0 — Revenue Operations\n\nAutomatically prepares Quarterly Business Review decks for a target account. Set the account domain in the 'Set Account Config' node. The workflow pulls CRM data from HubSpot, fetches usage metrics, NPS scores, and support tickets, then uses AI to generate the QBR narrative, creates a Google Slides deck, logs the output to a tracker sheet, and emails the Account Manager.\n\nFlow: Schedule => Set Account Config (Code) => Get HubSpot Account => Safe Extract (Code) => Get Usage Metrics => Get NPS Scores => Aggregate NPS (Code) => Get Support Tickets => Aggregate Support (Code) => Build Context (Code) => Generate QBR Narrative (AI Agent) => Create Slides => Log Tracker => Email Account Manager", "height": 260, "width": 720, "color": 7 }
    },
    {
      "id": "sticky-prereqs", "name": "Prerequisites", "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [-240, -220],
      "parameters": { "content": "## Prerequisites\n- HubSpot account with Companies API access (HubSpot Private App token)\n- Usage metrics API or Google Sheets with usage data (HTTP Request or Sheets node)\n- NPS survey tool (e.g. Delighted, Typeform) with API or Google Sheets export\n- Support ticket system (Zendesk/Freshdesk) with API or Google Sheets export\n- Google Slides API enabled (Google Drive OAuth2 credential)\n- Google Sheets for QBR tracker log\n- Gmail for Account Manager notifications\n- OpenAI API key (GPT-4o)", "height": 220, "width": 440, "color": 5 }
    },
    {
      "id": "sticky-setup", "name": "Setup Required", "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [220, -220],
      "parameters": { "content": "## Setup Required\n1. Set Account Config — update company_domain and account_manager_email in the Code node\n2. Get HubSpot Account — connect HubSpot API credential\n3. Get Usage Metrics — connect HTTP Request or Google Sheets credential, update endpoint URL\n4. Get NPS Scores — connect HTTP Request or Google Sheets credential\n5. Get Support Tickets — connect HTTP Request or Google Sheets credential\n6. Generate QBR Narrative — connect OpenAI credential\n7. Create Slides — connect Google Drive OAuth2 credential, update YOUR_TEMPLATE_PRESENTATION_ID\n8. Log Tracker — connect Google Sheets credential, replace YOUR_QBR_TRACKER_SHEET_ID\n9. Email Account Manager — connect Gmail OAuth2 credential", "height": 220, "width": 440, "color": 3 }
    },
    {
      "id": "sticky-howitworks", "name": "How It Works", "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [-240, 0],
      "parameters": { "content": "## How It Works\n1. Runs on a schedule (monthly, first Monday at 08:00 UTC) or trigger manually\n2. Set Account Config Code node defines which account to prep — change domain per run\n3. HubSpot Company API searched by domain; Safe Extract Code consolidates to 1 item\n4. Usage metrics, NPS responses, and support tickets fetched from respective APIs\n5. Aggregate Code nodes consolidate multi-row results into single structured summaries\n6. Build Context Code node assembles all data into a single rich context object\n7. AI Agent generates QBR narrative: executive summary, wins, risks, upsell opportunities\n8. Google Slides API called to create a new presentation from template with filled content\n9. QBR logged to tracker sheet; Account Manager notified by email with the Slides link", "height": 220, "width": 520, "color": 4 }
    },

    {
      "id": "schedule-trigger", "name": "Monthly QBR Schedule", "type": "n8n-nodes-base.scheduleTrigger", "typeVersion": 1.2, "position": [0, 100],
      "parameters": { "rule": { "interval": [{ "field": "cronExpression", "expression": "0 8 1 * *" }] } }
    },

    {
      "id": "sni-config", "name": "Config note", "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [265, -35],
      "parameters": { "content": "Set the target account domain and AM email here before each QBR cycle", "height": 60, "width": 265 }
    },
    {
      "id": "set-config", "name": "Set Account Config", "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [260, 100],
      "parameters": {
        "mode": "runOnceForAllItems",
        "jsCode": "// Configure the target account for this QBR run\nconst config = {\n  company_domain: 'acme.com',              // Change this to the target account domain\n  company_name:   'Acme Corporation',       // Display name for the QBR deck\n  account_manager_email: 'am@yourcompany.com', // Who receives the completed QBR\n  quarter: 'Q1 2026',                       // Current quarter label\n  qbr_date: DateTime.now().toISODate(),     // Today's date\n  lookback_days: 90                         // Data window for this QBR\n};\nreturn [{ json: config }];"
      }
    },

    {
      "id": "sni-hubspot", "name": "HubSpot note", "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [525, -35],
      "parameters": { "content": "Searches HubSpot Companies API for the account by domain", "height": 60, "width": 255 }
    },
    {
      "id": "get-hubspot", "name": "Get HubSpot Account", "type": "n8n-nodes-base.hubspot", "typeVersion": 2.1, "position": [520, 100],
      "parameters": {
        "resource": "company",
        "operation": "getAll",
        "returnAll": false,
        "limit": 1,
        "additionalFields": {
          "filterGroups": {
            "filterGroupsValues": [{
              "filters": {
                "filtersValues": [{ "propertyName": "domain", "operator": "EQ", "value": "={{ $json.company_domain }}" }]
              }
            }]
          },
          "properties": "name,domain,industry,annualrevenue,numberofemployees,hs_lastmodifieddate,hubspot_owner_id"
        }
      },
      "credentials": { "hubspotApi": { "id": "hubspot-cred", "name": "HubSpot API" } },
      "retryOnFail": true, "maxTries": 3, "waitBetweenTries": 2000, "onError": "continueErrorOutput"
    },

    {
      "id": "sni-safe-extract", "name": "Safe Extract note", "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [785, -35],
      "parameters": { "content": "Consolidates HubSpot results (may return multiple items) into a single context item", "height": 60, "width": 270 }
    },
    {
      "id": "safe-extract", "name": "Safe HubSpot Extract", "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [780, 100],
      "parameters": {
        "mode": "runOnceForAllItems",
        "jsCode": "const rows = $input.all();\nconst cfg = $('Set Account Config').first().json;\nconst company = rows.length > 0 && !rows[0].json.error ? rows[0].json : {};\nreturn [{ json: {\n  ...cfg,\n  hubspot_id:      company.id || null,\n  company_name:    company.properties?.name || cfg.company_name,\n  industry:        company.properties?.industry || 'Unknown',\n  annual_revenue:  company.properties?.annualrevenue || null,\n  employee_count:  company.properties?.numberofemployees || null,\n  hubspot_found:   !!company.id\n}}];"
      }
    },

    {
      "id": "sni-usage", "name": "Usage note", "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [1045, -35],
      "parameters": { "content": "Fetches product usage metrics for the account (update URL to your analytics API)", "height": 60, "width": 265 }
    },
    {
      "id": "get-usage", "name": "Get Usage Metrics", "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [1040, 100],
      "parameters": {
        "method": "GET",
        "url": "=https://your-analytics-api.example.com/v1/accounts/{{ $json.company_domain }}/usage",
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            { "name": "days", "value": "={{ $json.lookback_days }}" }
          ]
        },
        "options": { "response": { "response": { "neverError": true } } }
      },
      "retryOnFail": true, "maxTries": 3, "waitBetweenTries": 2000, "onError": "continueErrorOutput"
    },

    {
      "id": "sni-nps", "name": "NPS note", "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [1305, -35],
      "parameters": { "content": "Fetches NPS survey responses for this account from last 90 days", "height": 60, "width": 255 }
    },
    {
      "id": "get-nps", "name": "Get NPS Scores", "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [1300, 100],
      "parameters": {
        "method": "GET",
        "url": "=https://your-nps-tool-api.example.com/v1/responses",
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            { "name": "email_domain", "value": "={{ $json.company_domain }}" },
            { "name": "since", "value": "={{ DateTime.now().minus({ days: $json.lookback_days }).toISODate() }}" }
          ]
        },
        "options": { "response": { "response": { "neverError": true } } }
      },
      "retryOnFail": true, "maxTries": 3, "waitBetweenTries": 2000, "onError": "continueErrorOutput"
    },

    {
      "id": "sni-agg-nps", "name": "Aggregate NPS note", "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [1565, -35],
      "parameters": { "content": "Aggregates NPS responses into a single summary (avg score, promoters, detractors)", "height": 60, "width": 265 }
    },
    {
      "id": "aggregate-nps", "name": "Aggregate NPS", "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [1560, 100],
      "parameters": {
        "mode": "runOnceForAllItems",
        "jsCode": "const rows = $input.all();\nconst ctx = $('Safe HubSpot Extract').first().json;\nconst usageData = $('Get Usage Metrics').first().json;\nconst responses = Array.isArray(rows[0]?.json) ? rows[0].json : rows.map(r => r.json).filter(r => !r.error);\nconst scores = responses.map(r => Number(r.score || r.nps_score || 0)).filter(s => !isNaN(s));\nconst avg_nps = scores.length > 0 ? Math.round(scores.reduce((a,b) => a+b, 0) / scores.length) : null;\nconst promoters  = scores.filter(s => s >= 9).length;\nconst passives   = scores.filter(s => s >= 7 && s < 9).length;\nconst detractors = scores.filter(s => s < 7).length;\nreturn [{ json: {\n  ...ctx,\n  usage: usageData,\n  nps_avg_score:    avg_nps,\n  nps_response_count: scores.length,\n  nps_promoters:    promoters,\n  nps_passives:     passives,\n  nps_detractors:   detractors\n}}];"
      }
    },

    {
      "id": "sni-support", "name": "Support note", "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [1825, -35],
      "parameters": { "content": "Fetches open and closed support tickets for this account this quarter", "height": 60, "width": 255 }
    },
    {
      "id": "get-support", "name": "Get Support Tickets", "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [1820, 100],
      "parameters": {
        "method": "GET",
        "url": "=https://your-support-api.example.com/v2/tickets",
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            { "name": "company_domain", "value": "={{ $json.company_domain }}" },
            { "name": "created_since",  "value": "={{ DateTime.now().minus({ days: $json.lookback_days }).toISODate() }}" }
          ]
        },
        "options": { "response": { "response": { "neverError": true } } }
      },
      "retryOnFail": true, "maxTries": 3, "waitBetweenTries": 2000, "onError": "continueErrorOutput"
    },

    {
      "id": "sni-agg-support", "name": "Aggregate Support note", "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [2085, -35],
      "parameters": { "content": "Aggregates ticket data: total, open, resolved, avg time to resolve", "height": 60, "width": 260 }
    },
    {
      "id": "aggregate-support", "name": "Aggregate Support", "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [2080, 100],
      "parameters": {
        "mode": "runOnceForAllItems",
        "jsCode": "const rows = $input.all();\nconst ctx = $('Aggregate NPS').first().json;\nconst tickets = Array.isArray(rows[0]?.json?.tickets) ? rows[0].json.tickets : rows.map(r => r.json).filter(r => !r.error);\nconst open     = tickets.filter(t => t.status === 'open' || t.status === 'pending').length;\nconst resolved = tickets.filter(t => t.status === 'resolved' || t.status === 'closed').length;\nconst critical = tickets.filter(t => t.priority === 'critical' || t.priority === 'urgent').length;\nconst resolveTimes = tickets\n  .filter(t => t.resolved_at && t.created_at)\n  .map(t => (new Date(t.resolved_at) - new Date(t.created_at)) / (1000*60*60));\nconst avg_resolve_hrs = resolveTimes.length > 0\n  ? Math.round(resolveTimes.reduce((a,b)=>a+b,0)/resolveTimes.length)\n  : null;\nreturn [{ json: {\n  ...ctx,\n  tickets_total:       tickets.length,\n  tickets_open:        open,\n  tickets_resolved:    resolved,\n  tickets_critical:    critical,\n  avg_resolve_hrs:     avg_resolve_hrs,\n  top_issues:          tickets.slice(0, 3).map(t => t.subject || t.title || '')\n}}];"
      }
    },

    {
      "id": "sni-build-context", "name": "Build Context note", "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [2345, -35],
      "parameters": { "content": "Assembles all data into a single rich context object for the AI agent", "height": 60, "width": 260 }
    },
    {
      "id": "build-context", "name": "Build QBR Context", "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [2340, 100],
      "parameters": {
        "mode": "runOnceForAllItems",
        "jsCode": "const d = $input.first().json;\nconst usageStr = d.usage && !d.usage.error\n  ? JSON.stringify(d.usage, null, 2)\n  : 'Usage data unavailable — configure Get Usage Metrics node';\nreturn [{ json: {\n  ...d,\n  context_for_ai: [\n    `Account: ${d.company_name} (${d.company_domain})`,\n    `Quarter: ${d.quarter}`,\n    `Industry: ${d.industry}`,\n    `HubSpot ID: ${d.hubspot_id || 'not found'}`,\n    ``,\n    `=== Usage Metrics ===`,\n    usageStr,\n    ``,\n    `=== NPS ===`,\n    `Average NPS Score: ${d.nps_avg_score ?? 'N/A'} (${d.nps_response_count} responses)`,\n    `Promoters: ${d.nps_promoters}  |  Passives: ${d.nps_passives}  |  Detractors: ${d.nps_detractors}`,\n    ``,\n    `=== Support ===`,\n    `Total Tickets: ${d.tickets_total}  |  Open: ${d.tickets_open}  |  Resolved: ${d.tickets_resolved}`,\n    `Critical/Urgent: ${d.tickets_critical}  |  Avg Resolve Time: ${d.avg_resolve_hrs ? d.avg_resolve_hrs + 'h' : 'N/A'}`,\n    `Top Issues: ${(d.top_issues || []).join('; ') || 'none'}`\n  ].join('\\n')\n}}];"
      }
    },

    {
      "id": "sni-generate", "name": "Generate note", "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [2605, -35],
      "parameters": { "content": "AI Agent generates the full QBR narrative with executive summary, wins, risks, upsell angles", "height": 60, "width": 270 }
    },
    {
      "id": "generate-agent", "name": "Generate QBR Narrative", "type": "@n8n/n8n-nodes-langchain.agent", "typeVersion": 1.8, "position": [2600, 100],
      "parameters": {
        "agentType": "toolsAgent",
        "promptType": "define",
        "text": "=Generate a comprehensive Quarterly Business Review document for the following account.\n\n{{ $json.context_for_ai }}\n\nCreate:\n1. Executive Summary (3-4 sentences)\n2. Quarter Highlights / Wins\n3. Health Indicators (NPS, usage trends, support)\n4. Risks and Issues requiring attention\n5. Recommendations and Upsell Opportunities\n6. Proposed Goals for next quarter\n\nBe specific, data-driven, and professional. Tailor tone to a customer-facing executive presentation.",
        "hasOutputParser": true,
        "options": {
          "systemMessage": "You are a senior Customer Success Manager preparing a Quarterly Business Review for an enterprise customer. Use the provided data to craft an insightful, actionable narrative. Be honest about risks. Quantify achievements where data is available. Identify upsell opportunities naturally — do not be pushy. Format the output clearly with section titles. The QBR will be presented to C-level executives at the customer account.",
          "returnIntermediateSteps": false
        }
      }
    },
    {
      "id": "generate-openai", "name": "OpenAI — Generate", "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi", "typeVersion": 1.2, "position": [2600, 300],
      "parameters": { "model": { "__rl": true, "value": "gpt-4o", "mode": "list" }, "options": { "temperature": 0.4 } },
      "credentials": { "openAiApi": { "id": "openai-cred", "name": "OpenAI API" } }
    },
    {
      "id": "generate-parser", "name": "QBR Narrative Schema", "type": "@n8n/n8n-nodes-langchain.outputParserStructured", "typeVersion": 1.2, "position": [2800, 300],
      "parameters": {
        "schemaType": "manual",
        "inputSchema": "{\"type\":\"object\",\"properties\":{\"executive_summary\":{\"type\":\"string\"},\"quarter_highlights\":{\"type\":\"string\"},\"health_indicators\":{\"type\":\"string\"},\"risks_and_issues\":{\"type\":\"string\"},\"recommendations\":{\"type\":\"string\"},\"next_quarter_goals\":{\"type\":\"string\"},\"overall_health_score\":{\"type\":\"integer\",\"minimum\":1,\"maximum\":10}},\"required\":[\"executive_summary\",\"quarter_highlights\",\"health_indicators\",\"risks_and_issues\",\"recommendations\",\"next_quarter_goals\",\"overall_health_score\"]}"
      }
    },

    {
      "id": "sni-slides", "name": "Slides note", "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [2865, -35],
      "parameters": { "content": "Creates a new Google Slides presentation by copying a template and filling placeholders", "height": 60, "width": 275 }
    },
    {
      "id": "create-slides", "name": "Create Google Slides", "type": "n8n-nodes-base.googleSlides", "typeVersion": 2, "position": [2860, 100],
      "parameters": {
        "operation": "create",
        "title": "={{ $('Build QBR Context').first().json.company_name }} — QBR {{ $('Build QBR Context').first().json.quarter }}",
        "options": {}
      },
      "credentials": { "googleSlidesOAuth2Api": { "id": "gslides-cred", "name": "Google Slides OAuth2" } },
      "retryOnFail": true, "maxTries": 3, "waitBetweenTries": 2000, "onError": "continueErrorOutput"
    },

    {
      "id": "sni-log-tracker", "name": "Log Tracker note", "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [3125, -35],
      "parameters": { "content": "Logs QBR completion record to tracker sheet for pipeline visibility", "height": 60, "width": 255 }
    },
    {
      "id": "log-tracker", "name": "Log QBR Tracker", "type": "n8n-nodes-base.googleSheets", "typeVersion": 4.5, "position": [3120, 100],
      "parameters": {
        "operation": "appendOrUpdate",
        "documentId": { "__rl": true, "value": "YOUR_QBR_TRACKER_SHEET_ID", "mode": "id" },
        "sheetName": { "__rl": true, "value": "QBR Log", "mode": "name" },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "Timestamp":        "={{ DateTime.now().toISO() }}",
            "Company":          "={{ $('Build QBR Context').first().json.company_name }}",
            "Domain":           "={{ $('Build QBR Context').first().json.company_domain }}",
            "Quarter":          "={{ $('Build QBR Context').first().json.quarter }}",
            "NPS Score":        "={{ $('Build QBR Context').first().json.nps_avg_score }}",
            "Tickets Total":    "={{ $('Build QBR Context').first().json.tickets_total }}",
            "Health Score":     "={{ $('Generate QBR Narrative').first().json.output.overall_health_score }}",
            "Slides URL":       "={{ $json.webViewLink || $json.spreadsheetUrl || 'created' }}",
            "Status":           "completed"
          }
        }
      },
      "credentials": { "googleSheetsOAuth2Api": { "id": "gsheets-cred", "name": "Google Sheets OAuth2" } },
      "retryOnFail": true, "maxTries": 3, "waitBetweenTries": 2000, "onError": "continueErrorOutput"
    },

    {
      "id": "sni-email-am", "name": "Email AM note", "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [3385, -35],
      "parameters": { "content": "Emails Account Manager with QBR summary and Google Slides link", "height": 60, "width": 255 }
    },
    {
      "id": "email-am", "name": "Email Account Manager", "type": "n8n-nodes-base.gmail", "typeVersion": 2.1, "position": [3380, 100],
      "parameters": {
        "sendTo": "={{ $('Build QBR Context').first().json.account_manager_email }}",
        "subject": "=QBR Ready — {{ $('Build QBR Context').first().json.company_name }} {{ $('Build QBR Context').first().json.quarter }}",
        "emailType": "html",
        "message": "=<h2>QBR Prepared — {{ $('Build QBR Context').first().json.company_name }}</h2><p>Your {{ $('Build QBR Context').first().json.quarter }} QBR has been automatically prepared and is ready for review.</p><h3>Executive Summary</h3><p>{{ $('Generate QBR Narrative').first().json.output.executive_summary }}</p><h3>Quarter Highlights</h3><p>{{ $('Generate QBR Narrative').first().json.output.quarter_highlights }}</p><h3>Risks and Issues</h3><p>{{ $('Generate QBR Narrative').first().json.output.risks_and_issues }}</p><h3>Recommendations</h3><p>{{ $('Generate QBR Narrative').first().json.output.recommendations }}</p><p><strong>Overall Health Score: {{ $('Generate QBR Narrative').first().json.output.overall_health_score }}/10</strong></p><p><a href='{{ $('Create Google Slides').first().json.webViewLink || \"#\" }}'>Open Google Slides Deck</a></p><p><em>This QBR was auto-generated by SmartFlow. Please review and customise before presenting to the customer.</em></p>",
        "options": {}
      },
      "credentials": { "gmailOAuth2": { "id": "gmail-cred", "name": "Gmail OAuth2" } },
      "retryOnFail": true, "maxTries": 3, "waitBetweenTries": 2000, "onError": "continueErrorOutput"
    }
  ],
  "connections": {
    "Monthly QBR Schedule":    { "main": [[{ "node": "Set Account Config",      "type": "main", "index": 0 }]] },
    "Set Account Config":      { "main": [[{ "node": "Get HubSpot Account",     "type": "main", "index": 0 }]] },
    "Get HubSpot Account":     { "main": [[{ "node": "Safe HubSpot Extract",    "type": "main", "index": 0 }]] },
    "Safe HubSpot Extract":    { "main": [[{ "node": "Get Usage Metrics",       "type": "main", "index": 0 }]] },
    "Get Usage Metrics":       { "main": [[{ "node": "Get NPS Scores",          "type": "main", "index": 0 }]] },
    "Get NPS Scores":          { "main": [[{ "node": "Aggregate NPS",           "type": "main", "index": 0 }]] },
    "Aggregate NPS":           { "main": [[{ "node": "Get Support Tickets",     "type": "main", "index": 0 }]] },
    "Get Support Tickets":     { "main": [[{ "node": "Aggregate Support",       "type": "main", "index": 0 }]] },
    "Aggregate Support":       { "main": [[{ "node": "Build QBR Context",       "type": "main", "index": 0 }]] },
    "Build QBR Context":       { "main": [[{ "node": "Generate QBR Narrative",  "type": "main", "index": 0 }]] },
    "OpenAI — Generate":       { "ai_languageModel": [[{ "node": "Generate QBR Narrative", "type": "ai_languageModel", "index": 0 }]] },
    "QBR Narrative Schema":    { "ai_outputParser":  [[{ "node": "Generate QBR Narrative", "type": "ai_outputParser",  "index": 0 }]] },
    "Generate QBR Narrative":  { "main": [[{ "node": "Create Google Slides",    "type": "main", "index": 0 }]] },
    "Create Google Slides":    { "main": [[{ "node": "Log QBR Tracker",         "type": "main", "index": 0 }]] },
    "Log QBR Tracker":         { "main": [[{ "node": "Email Account Manager",   "type": "main", "index": 0 }]] }
  },
  "pinData": {},
  "settings": { "executionOrder": "v1", "saveManualExecutions": true, "callerPolicy": "workflowsFromSameOwner" },
  "staticData": null,
  "tags": ["Revenue Operations", "HubSpot", "Google Slides", "AI", "QBR", "Customer Success"],
  "triggerCount": 1,
  "active": false
}
