AutomationFlowsGeneral › Govern Enterprise Marketplace Support Actions with Osuite Approvals

Govern Enterprise Marketplace Support Actions with Osuite Approvals

ByOnd Holdings Inc. @jw-ond on n8n.io

This workflow runs on demand to preflight a high-value marketplace support action and send it to OSuite for governance review, then blocks, waits for approval, or proceeds to draft a safe internal refund-risk recommendation and records the final outcome in OSuite. Starts…

Event trigger★★★★☆ complexity22 nodesN8N Nodes Osuite
General Trigger: Event Nodes: 22 Complexity: ★★★★☆ Added:

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

The workflow JSON

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

Download .json
{
  "name": "OSuite enterprise action governance for marketplace operations",
  "tags": [
    {
      "name": "osuite"
    },
    {
      "name": "agent-governance"
    },
    {
      "name": "marketplace-operations"
    },
    {
      "name": "enterprise-workflow"
    }
  ],
  "nodes": [
    {
      "id": "c40a681b-a5a1-4c75-b291-1a9063fa42a2",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1888,
        -240
      ],
      "parameters": {
        "width": 480,
        "height": 784,
        "content": "## OSuite enterprise action governance for marketplace operations\n\n### How it works\n\nThis workflow governs an enterprise marketplace operations support action through OSuite approval controls. It starts from a manual intake, validates the request locally, runs OSuite exposure and planned-work checks, and then branches based on whether the action is blocked or approved. Approved actions generate a safe internal recommendation and record the final outcome, while failed, blocked, or pending actions stop with structured status information.\n\n### Setup steps\n\n- Configure the OSuite credentials used by all OSuite nodes.\n- Review the initial Set node values for case_id, action_title, requester, and business_goal so they match the intended support action.\n- Verify the local preflight code enforces the required intake rules for your organization.\n- Confirm the OSuite approval, blocking, replay URL, and final outcome fields match your OSuite tenant schema.\n\n### Customization\n\nCustomize the intake fields, preflight validation rules, approval packet contents, and final recommendation text to match the marketplace operation being governed."
      },
      "typeVersion": 1
    },
    {
      "id": "89b04689-bfee-44b0-85e7-41e5ef5de55e",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1328,
        -80
      ],
      "parameters": {
        "color": 7,
        "width": 496,
        "height": 320,
        "content": "## Start action intake\n\nStarts the workflow manually and creates the initial enterprise support action payload with the case, requester, title, and business goal."
      },
      "typeVersion": 1
    },
    {
      "id": "3d7fc384-9dab-46ff-8ba8-f4f72d35fe08",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -704,
        -48
      ],
      "parameters": {
        "color": 7,
        "width": 816,
        "height": 512,
        "content": "## Validate intake request\n\nRuns a local preflight check, decides whether the request is usable, and stops with intake-fix guidance if required fields or validation checks fail."
      },
      "typeVersion": 1
    },
    {
      "id": "17abc47f-b88f-4b3e-8cce-5d605ab455af",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        144,
        -240
      ],
      "parameters": {
        "color": 7,
        "width": 496,
        "height": 480,
        "content": "## Review OSuite exposure\n\nSends usable requests through OSuite runtime exposure and planned-work review checks before an operator approval packet is assembled."
      },
      "typeVersion": 1
    },
    {
      "id": "114633ad-261a-46b9-b3b2-a9939ef6d727",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        672,
        -208
      ],
      "parameters": {
        "color": 7,
        "width": 832,
        "height": 544,
        "content": "## Gate blocked actions\n\nBuilds the approval packet, checks whether OSuite has blocked the proposed action, stops blocked actions with a reason, or continues to check approval status."
      },
      "typeVersion": 1
    },
    {
      "id": "23d19ad2-a0ef-494e-8fff-627b96cb434d",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1536,
        -80
      ],
      "parameters": {
        "color": 7,
        "width": 512,
        "height": 576,
        "content": "## Handle approval outcome\n\nEvaluates whether OSuite approval has been granted, either producing a safe internal recommendation draft or stopping while the action waits for approval."
      },
      "typeVersion": 1
    },
    {
      "id": "afb8e2d1-a142-4995-a313-6726ed8ff2f1",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2160,
        -128
      ],
      "parameters": {
        "color": 7,
        "width": 240,
        "height": 368,
        "content": "## Record final outcome\n\nRecords the completed approved recommendation outcome back into OSuite for governance and audit tracking."
      },
      "typeVersion": 1
    },
    {
      "id": "manual-trigger",
      "name": "Start Manual Process",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -1280,
        80
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "prepare-enterprise-action",
      "name": "Set Enterprise Action Data",
      "type": "n8n-nodes-base.set",
      "position": [
        -980,
        80
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "case-id",
              "name": "case_id",
              "type": "string",
              "value": "DEMO-CASE-1042"
            },
            {
              "id": "action-title",
              "name": "action_title",
              "type": "string",
              "value": "High-value refund recommendation"
            },
            {
              "id": "requester",
              "name": "requester",
              "type": "string",
              "value": "marketplace-support-ops"
            },
            {
              "id": "business-goal",
              "name": "business_goal",
              "type": "string",
              "value": "Review a high-value refund request and prepare an internal recommendation before customer-facing or ledger action."
            },
            {
              "id": "proposed-action",
              "name": "proposed_action",
              "type": "string",
              "value": "Read synthetic support/order context, draft a refund-risk recommendation, and prepare an internal Slack approval summary."
            },
            {
              "id": "action-kind",
              "name": "action_kind",
              "type": "string",
              "value": "data_access"
            },
            {
              "id": "systems-touched",
              "name": "systems_touched",
              "type": "string",
              "value": "support workspace, order context, Slack"
            },
            {
              "id": "data-classification",
              "name": "data_classification",
              "type": "string",
              "value": "customer support context, order metadata, refund-risk notes"
            },
            {
              "id": "destination-boundary",
              "name": "destination_boundary",
              "type": "string",
              "value": "internal Slack approval channel"
            },
            {
              "id": "expected-side-effects",
              "name": "expected_side_effects",
              "type": "string",
              "value": "draft internal recommendation only; no refund issued"
            },
            {
              "id": "customer-impact",
              "name": "customer_impact",
              "type": "string",
              "value": "may influence refund handling for a high-value support case"
            },
            {
              "id": "policy-posture",
              "name": "policy_posture",
              "type": "string",
              "value": "strict"
            },
            {
              "id": "approval-channel",
              "name": "approval_channel",
              "type": "string",
              "value": "support-risk-approvals"
            },
            {
              "id": "risk-level",
              "name": "risk_level",
              "type": "number",
              "value": 72
            },
            {
              "id": "reversible",
              "name": "reversible",
              "type": "boolean",
              "value": false
            },
            {
              "id": "decision-context",
              "name": "decision_context",
              "type": "string",
              "value": "Synthetic demo action. OSuite should bind approval to this exact action before any external message, refund update, or production side effect occurs."
            },
            {
              "id": "demo-data-only",
              "name": "demo_data_only",
              "type": "boolean",
              "value": true
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "local-enterprise-preflight",
      "name": "Execute Preflight Checks",
      "type": "n8n-nodes-base.code",
      "position": [
        -660,
        80
      ],
      "parameters": {
        "jsCode": "const input = $input.first().json;\nconst s = (value) => String(value ?? '').trim();\nconst lower = (value) => s(value).toLowerCase();\n\nconst title = s(input.action_title);\nconst goal = s(input.business_goal);\nconst action = s(input.proposed_action);\nconst systems = s(input.systems_touched);\nconst dataClass = s(input.data_classification) || 'unspecified';\nconst destination = s(input.destination_boundary) || 'unspecified';\nconst sideEffects = s(input.expected_side_effects) || 'unspecified';\nconst impact = s(input.customer_impact) || 'unspecified';\nconst posture = lower(input.policy_posture) || 'standard';\nconst reversibleText = lower(input.reversible) || 'unknown';\nlet risk = Number(input.risk_level ?? 0);\nif (!Number.isFinite(risk)) risk = 0;\nrisk = Math.max(0, Math.min(100, Math.round(risk)));\n\nconst combined = [action, systems, dataClass, destination, sideEffects, impact].join(' ').toLowerCase();\nconst writeWords = ['send', 'publish', 'update', 'refund', 'delete', 'export', 'sync', 'write', 'notify', 'post', 'create'];\nconst dataWords = ['customer', 'personal', 'pii', 'account', 'payment', 'support', 'ticket', 'order', 'email'];\nconst externalWords = ['external', 'public', 'customer', 'vendor', 'partner', 'slack', 'email', 'webhook', 'api'];\n\nconst hasSideEffect = writeWords.some((word) => combined.includes(word)) || sideEffects !== 'unspecified';\nconst touchesSensitiveData = dataWords.some((word) => combined.includes(word));\nconst crossesBoundary = externalWords.some((word) => destination.toLowerCase().includes(word));\nconst reversible = ['true', 'yes', 'y', '1'].includes(reversibleText);\n\nconst blockers = [];\nconst warnings = [];\nif (!title) blockers.push('missing action title');\nif (!goal) blockers.push('missing business goal');\nif (!action) blockers.push('missing proposed action');\nif (!systems) blockers.push('missing systems touched');\nif (dataClass === 'unspecified') warnings.push('data classification was not provided');\nif (destination === 'unspecified') warnings.push('destination/boundary was not provided');\n\nlet exposureLevel = 'low';\nif (risk >= 70 || (touchesSensitiveData && hasSideEffect && !reversible)) exposureLevel = 'high';\nelse if (risk >= 40 || touchesSensitiveData || hasSideEffect || crossesBoundary) exposureLevel = 'medium';\n\nlet recommendedControl = 'log_only';\nif (blockers.length) recommendedControl = 'fix_intake';\nelse if (exposureLevel === 'high' || ['strict', 'regulated', 'approval-first'].includes(posture)) recommendedControl = 'require_approval';\nelse if (exposureLevel === 'medium') recommendedControl = 'review_or_approve';\n\nconst blastRadius = [];\nif (touchesSensitiveData) blastRadius.push('customer/support data');\nif (hasSideEffect) blastRadius.push('operational side effects');\nif (crossesBoundary) blastRadius.push('external or cross-system boundary');\nif (!blastRadius.length) blastRadius.push('read-only or internal analysis');\n\nconst usable = blockers.length === 0;\nconst preflightEnvelope = {\n  requester: s(input.requester) || 'unspecified',\n  policy_posture: posture,\n  approval_channel: s(input.approval_channel) || 'unspecified',\n  data_classification: dataClass,\n  destination_boundary: destination,\n  expected_side_effects: sideEffects,\n  customer_impact: impact,\n  normalized_risk: risk,\n  reversible,\n  touches_sensitive_data: touchesSensitiveData,\n  has_side_effect: hasSideEffect,\n  crosses_boundary: crossesBoundary,\n  exposure_level: exposureLevel,\n  recommended_control: recommendedControl,\n  blast_radius: blastRadius,\n  warnings,\n  blockers,\n};\nconst preflightSummary = `usable=${usable}; normalized_risk=${risk}; exposure_level=${exposureLevel}; recommended_control=${recommendedControl}; data_classification=${dataClass}; destination_boundary=${destination}; side_effects=${sideEffects}; blast_radius=${blastRadius.join(', ')}; warnings=${warnings.join('; ') || 'none'}; blockers=${blockers.join('; ') || 'none'}`;\n\nreturn [{\n  json: {\n    ...input,\n    usable,\n    normalized_risk: risk,\n    exposure_level: exposureLevel,\n    recommended_control: recommendedControl,\n    blast_radius: blastRadius.join(', '),\n    warnings: warnings.join('; ') || 'none',\n    blockers: blockers.join('; ') || 'none',\n    preflight_summary: preflightSummary,\n    preflight_envelope: preflightEnvelope,\n    preflight_envelope_json: JSON.stringify(preflightEnvelope, null, 2),\n  },\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "request-usable-gate",
      "name": "If Request Is Usable",
      "type": "n8n-nodes-base.if",
      "position": [
        -360,
        80
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "request-usable-gate-condition",
              "operator": {
                "type": "boolean",
                "operation": "equals"
              },
              "leftValue": "={{ $json.usable }}",
              "rightValue": true
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "stop-fix-intake",
      "name": "Prepare Fix Intake Data",
      "type": "n8n-nodes-base.set",
      "position": [
        -40,
        300
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "fix-status",
              "name": "status",
              "type": "string",
              "value": "needs_intake_fix"
            },
            {
              "id": "fix-blockers",
              "name": "blockers",
              "type": "string",
              "value": "={{ $('Execute Preflight Checks').item.json.blockers }}"
            },
            {
              "id": "fix-warnings",
              "name": "warnings",
              "type": "string",
              "value": "={{ $('Execute Preflight Checks').item.json.warnings }}"
            },
            {
              "id": "fix-message",
              "name": "message",
              "type": "string",
              "value": "Add action title, business goal, proposed action, systems touched, data classification, destination/boundary, expected side effects, and reversibility before OSuite review."
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "runtime-exposure-snapshot",
      "name": "Capture Runtime Exposure Snapshot",
      "type": "n8n-nodes-osuite.osuite",
      "position": [
        192,
        -80
      ],
      "parameters": {
        "operation": "summarizeRuntimeExposure"
      },
      "typeVersion": 1
    },
    {
      "id": "osuite-review-planned-work",
      "name": "Analyze Planned Work",
      "type": "n8n-nodes-osuite.osuite",
      "position": [
        480,
        80
      ],
      "parameters": {
        "goal": "={{ $('Set Enterprise Action Data').item.json.business_goal }}",
        "advanced": {
          "nodeId": "osuite-review-planned-work",
          "agentId": "n8n-marketplace-support-guardrail",
          "agentName": "n8n marketplace support guardrail",
          "workflowId": "osuite-enterprise-action-governance-template"
        },
        "operation": "reviewPlannedWork",
        "riskLevel": "={{ $('Execute Preflight Checks').item.json.normalized_risk }}",
        "actionKind": "={{ $('Set Enterprise Action Data').item.json.action_kind }}",
        "reversible": "={{ $('Set Enterprise Action Data').item.json.reversible }}",
        "toolInputJson": "={{ JSON.stringify({ scenario: 'enterprise_marketplace_support_action_governance', case_id: $('Set Enterprise Action Data').item.json.case_id, action_title: $('Set Enterprise Action Data').item.json.action_title, requester: $('Set Enterprise Action Data').item.json.requester, business_goal: $('Set Enterprise Action Data').item.json.business_goal, proposed_action: $('Set Enterprise Action Data').item.json.proposed_action, action_kind: $('Set Enterprise Action Data').item.json.action_kind, systems_touched: $('Set Enterprise Action Data').item.json.systems_touched, data_classification: $('Set Enterprise Action Data').item.json.data_classification, destination_boundary: $('Set Enterprise Action Data').item.json.destination_boundary, expected_side_effects: $('Set Enterprise Action Data').item.json.expected_side_effects, customer_impact: $('Set Enterprise Action Data').item.json.customer_impact, policy_posture: $('Set Enterprise Action Data').item.json.policy_posture, approval_channel: $('Set Enterprise Action Data').item.json.approval_channel, local_preflight: $('Execute Preflight Checks').item.json.preflight_envelope, runtime_exposure: $('Capture Runtime Exposure Snapshot').item.json, demo_data_only: true }, null, 2) }}",
        "proposedAction": "={{ $('Set Enterprise Action Data').item.json.proposed_action }}",
        "systemsTouched": "={{ $('Set Enterprise Action Data').item.json.systems_touched }}",
        "decisionContext": "={{ $('Execute Preflight Checks').item.json.preflight_summary + '\\n\\nOperator context: ' + $('Set Enterprise Action Data').item.json.decision_context }}"
      },
      "typeVersion": 1
    },
    {
      "id": "build-approval-packet",
      "name": "Build Approval Packet",
      "type": "n8n-nodes-base.set",
      "position": [
        720,
        80
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "packet-status",
              "name": "status",
              "type": "string",
              "value": "reviewed_by_osuite"
            },
            {
              "id": "packet-action-id",
              "name": "action_id",
              "type": "string",
              "value": "={{ $('Analyze Planned Work').item.json.action_id }}"
            },
            {
              "id": "packet-blocked",
              "name": "blocked",
              "type": "boolean",
              "value": "={{ $('Analyze Planned Work').item.json.blocked }}"
            },
            {
              "id": "packet-approval-required",
              "name": "approval_required",
              "type": "boolean",
              "value": "={{ $('Analyze Planned Work').item.json.approval_required }}"
            },
            {
              "id": "packet-replay-url",
              "name": "replay_url",
              "type": "string",
              "value": "={{ $('Analyze Planned Work').item.json.replay_url }}"
            },
            {
              "id": "packet-risk-score",
              "name": "risk_score",
              "type": "string",
              "value": "={{ $('Analyze Planned Work').item.json.risk_score }}"
            },
            {
              "id": "packet-policy-reason",
              "name": "policy_reason",
              "type": "string",
              "value": "={{ $('Analyze Planned Work').item.json.policy_reason }}"
            },
            {
              "id": "packet-summary",
              "name": "approval_packet",
              "type": "string",
              "value": "={{ 'Preflight: ' + $('Execute Preflight Checks').item.json.preflight_summary + '\\nOSuite action: ' + $('Analyze Planned Work').item.json.action_id + '\\nReplay: ' + $('Analyze Planned Work').item.json.replay_url + '\\nOperator checklist: confirm goal, destination, side effects, and approve this exact action only.' }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "blocked-gate",
      "name": "Check OSuite Block Status",
      "type": "n8n-nodes-base.if",
      "position": [
        1040,
        80
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "blocked-gate-condition",
              "operator": {
                "type": "boolean",
                "operation": "equals"
              },
              "leftValue": "={{ $json.blocked }}",
              "rightValue": true
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "stop-blocked",
      "name": "Log OSuite Block Details",
      "type": "n8n-nodes-base.set",
      "position": [
        1360,
        -80
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "blocked-status",
              "name": "status",
              "type": "string",
              "value": "blocked_by_osuite"
            },
            {
              "id": "blocked-action-id",
              "name": "action_id",
              "type": "string",
              "value": "={{ $('Build Approval Packet').item.json.action_id }}"
            },
            {
              "id": "blocked-packet",
              "name": "approval_packet",
              "type": "string",
              "value": "={{ $('Build Approval Packet').item.json.approval_packet }}"
            },
            {
              "id": "blocked-reason",
              "name": "reason",
              "type": "string",
              "value": "OSuite blocked this planned enterprise action before execution."
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "osuite-check-if-approved",
      "name": "Verify OSuite Approval",
      "type": "n8n-nodes-osuite.osuite",
      "position": [
        1360,
        160
      ],
      "parameters": {
        "actionId": "={{ $('Build Approval Packet').item.json.action_id }}",
        "operation": "checkIfApproved"
      },
      "typeVersion": 1
    },
    {
      "id": "approved-gate",
      "name": "Check OSuite Approval Status",
      "type": "n8n-nodes-base.if",
      "position": [
        1584,
        160
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "approved-gate-condition",
              "operator": {
                "type": "boolean",
                "operation": "equals"
              },
              "leftValue": "={{ $json.approved }}",
              "rightValue": true
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "stop-waiting",
      "name": "Log Approval Wait Details",
      "type": "n8n-nodes-base.set",
      "position": [
        1904,
        336
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "waiting-status",
              "name": "status",
              "type": "string",
              "value": "waiting_for_osuite_approval"
            },
            {
              "id": "waiting-action-id",
              "name": "action_id",
              "type": "string",
              "value": "={{ $('Build Approval Packet').item.json.action_id }}"
            },
            {
              "id": "waiting-replay-url",
              "name": "replay_url",
              "type": "string",
              "value": "={{ $('Build Approval Packet').item.json.replay_url }}"
            },
            {
              "id": "waiting-packet",
              "name": "approval_packet",
              "type": "string",
              "value": "={{ $('Build Approval Packet').item.json.approval_packet }}"
            },
            {
              "id": "waiting-message",
              "name": "message",
              "type": "string",
              "value": "Approve this exact action in OSuite Studio, then run Check If Approved again."
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "safe-internal-recommendation",
      "name": "Draft Internal Recommendation",
      "type": "n8n-nodes-base.set",
      "position": [
        1904,
        80
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "action-performed",
              "name": "action_performed",
              "type": "string",
              "value": "Prepared internal refund-risk recommendation"
            },
            {
              "id": "recommendation",
              "name": "recommendation",
              "type": "string",
              "value": "={{ 'Recommend manual review before any refund. Evidence boundary: synthetic support/order context only. Customer-facing message: not generated. Refund action: not executed. Approval action ID: ' + $('Build Approval Packet').item.json.action_id }}"
            },
            {
              "id": "destination",
              "name": "destination",
              "type": "string",
              "value": "demo-internal-approval-channel"
            },
            {
              "id": "records-processed",
              "name": "records_processed",
              "type": "number",
              "value": 1
            },
            {
              "id": "status",
              "name": "status",
              "type": "string",
              "value": "completed"
            },
            {
              "id": "external-side-effects",
              "name": "external_side_effects",
              "type": "string",
              "value": "none in template; internal draft only"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "osuite-record-final-outcome",
      "name": "Record Final Outcome in OSuite",
      "type": "n8n-nodes-osuite.osuite",
      "position": [
        2200,
        80
      ],
      "parameters": {
        "outcome": "completed",
        "summary": "={{ 'n8n generated a safe internal recommendation after OSuite approval was verified. Preflight: ' + $('Execute Preflight Checks').item.json.preflight_summary + '\\nApproval packet: ' + $('Build Approval Packet').item.json.approval_packet + '\\nRecommendation: ' + $('Draft Internal Recommendation').item.json.recommendation }}",
        "actionId": "={{ $('Build Approval Packet').item.json.action_id }}",
        "operation": "recordFinalOutcome",
        "sideEffects": "internal recommendation drafted only; no external side effects; no production mutations",
        "artifactsCreated": "n8n execution record, OSuite replay record, operator approval packet"
      },
      "typeVersion": 1
    }
  ],
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "osuite-enterprise-action-governance-v2-annotated",
  "connections": {
    "Analyze Planned Work": {
      "main": [
        [
          {
            "node": "Build Approval Packet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If Request Is Usable": {
      "main": [
        [
          {
            "node": "Capture Runtime Exposure Snapshot",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Prepare Fix Intake Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Start Manual Process": {
      "main": [
        [
          {
            "node": "Set Enterprise Action Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build Approval Packet": {
      "main": [
        [
          {
            "node": "Check OSuite Block Status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Verify OSuite Approval": {
      "main": [
        [
          {
            "node": "Check OSuite Approval Status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Execute Preflight Checks": {
      "main": [
        [
          {
            "node": "If Request Is Usable",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check OSuite Block Status": {
      "main": [
        [
          {
            "node": "Log OSuite Block Details",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Verify OSuite Approval",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Enterprise Action Data": {
      "main": [
        [
          {
            "node": "Execute Preflight Checks",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check OSuite Approval Status": {
      "main": [
        [
          {
            "node": "Draft Internal Recommendation",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Log Approval Wait Details",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Draft Internal Recommendation": {
      "main": [
        [
          {
            "node": "Record Final Outcome in OSuite",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Capture Runtime Exposure Snapshot": {
      "main": [
        [
          {
            "node": "Analyze Planned Work",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Pro

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

About this workflow

This workflow runs on demand to preflight a high-value marketplace support action and send it to OSuite for governance review, then blocks, waits for approval, or proceeds to draft a safe internal refund-risk recommendation and records the final outcome in OSuite. Starts…

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

More General workflows → · Browse all categories →

Related workflows

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

General

Reagendamiento. Uses executeWorkflowTrigger, redis, n8n-nodes-evolution-api, dataTable. Event-driven trigger; 73 nodes.

Execute Workflow Trigger, Redis, N8N Nodes Evolution Api +2
General

Blotato. Uses googleSheets, @blotato/n8n-nodes-blotato. Event-driven trigger; 65 nodes.

Google Sheets, @Blotato/N8N Nodes Blotato
General

This template is a hands-on, practical exam designed to help you master n8n Expressions—the key to accessing and manipulating data in your workflows.

Stop And Error
General

This template is a hands-on, practical exam designed to test your understanding of the fundamental JSON data types. It's the perfect way to solidify your knowledge after learning the basics.

Stop And Error
General

Agendamiento. Uses n8n-nodes-evolution-api, redis, dataTable, executeWorkflowTrigger. Event-driven trigger; 60 nodes.

N8N Nodes Evolution Api, Redis, Data Table +2