AutomationFlowsE-commerce › Customer Refund with Verifiable Decision Receipts

Customer Refund with Verifiable Decision Receipts

Customer Refund with Verifiable Decision Receipts. Uses openAi, n8n-nodes-signatrust, httpRequest. Webhook trigger; 7 nodes.

Webhook trigger★★★★☆ complexityAI-powered7 nodesOpenAIN8N Nodes SignatrustHTTP Request
E-commerce Trigger: Webhook Nodes: 7 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow follows the HTTP Request → OpenAI recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

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

Download .json
{
  "name": "Customer Refund with Verifiable Decision Receipts",
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "refund-request",
        "options": {},
        "responseMode": "responseNode"
      },
      "id": "31775a7b-3676-4c88-a698-e5a502dcb7fd",
      "name": "Shopify Refund Request",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2.1,
      "position": [
        0,
        300
      ]
    },
    {
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o",
          "cachedResultName": "GPT-4O"
        },
        "messages": {
          "values": [
            {
              "role": "system",
              "content": "=You are a customer-refund AI agent. Decide APPROVE_REFUND or DENY based on order history and policy. Return JSON: {\"decision\":\"APPROVE_REFUND|DENY\",\"amount\":0,\"charge_id\":\"...\",\"reason\":\"...\"}."
            },
            {
              "content": "=Decide the refund. Return JSON only.\n\nOrder:\n{{ JSON.stringify($json.body) }}"
            }
          ]
        },
        "jsonOutput": true,
        "options": {}
      },
      "id": "7a2dad1c-4105-4dd5-8d9c-5ac5408a43f4",
      "name": "AI Refund Decision",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "typeVersion": 2.1,
      "position": [
        220,
        300
      ],
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "loose"
          },
          "conditions": [
            {
              "id": "bde5661d-d7b7-4f95-a0a1-77e306a4fa35",
              "leftValue": "={{ $json.message.content.decision }}",
              "rightValue": "APPROVE_REFUND",
              "operator": {
                "type": "string",
                "operation": "equals"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "id": "43f4a0aa-05d7-4eb4-afdf-1dcbc946391a",
      "name": "IF Approve Refund",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        440,
        300
      ]
    },
    {
      "parameters": {
        "operation": "generateReceipt",
        "agentName": "RefundDecisionAgent",
        "workflowName": "={{ $workflow.name }}",
        "action": "Approved customer refund",
        "decision": "={{ JSON.stringify($json.message.content) }}",
        "additionalFields": {
          "modelProvider": "openai",
          "modelUsed": "gpt-4o",
          "decisionType": "refund_approval",
          "riskLevel": "medium",
          "humanReview": false,
          "policies": "refund-policy-v2",
          "permissions": "refund.execute",
          "tags": "refund, payments, cx"
        }
      },
      "id": "17766073-6228-4555-9a6f-220eaf06a84a",
      "name": "Signatrust: Receipt",
      "type": "n8n-nodes-signatrust.signatrust",
      "typeVersion": 1,
      "position": [
        660,
        200
      ],
      "credentials": {
        "signatrustApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://api.stripe.com/v1/refunds",
        "sendBody": true,
        "contentType": "form-urlencoded",
        "bodyParameters": {
          "parameters": [
            {
              "name": "charge",
              "value": "={{ $('AI Refund Decision').item.json.message.content.charge_id }}"
            }
          ]
        },
        "options": {}
      },
      "id": "3410c1fe-a68d-45cc-b1e4-c3394ae34404",
      "name": "Stripe Refund",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        880,
        200
      ],
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={{ { \"status\":\"DENIED\",\"detail\":$('AI Refund Decision').item.json.message.content } }}",
        "options": {}
      },
      "id": "57f09695-73b1-4544-abbc-e4f76aabf1e9",
      "name": "Respond Denied",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.1,
      "position": [
        660,
        440
      ]
    },
    {
      "parameters": {
        "content": "## Customer Refund + Signatrust\nAI approves/denies refunds. Six months later you can **prove exactly why** a refund was issued, by which agent, under which policy \u2014 then the Stripe refund executes.",
        "height": 200,
        "width": 420,
        "color": 5
      },
      "id": "c1c1a89b-1d45-4805-ad00-08deba6cce04",
      "name": "Sticky Note 8308f4",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -40,
        30
      ]
    }
  ],
  "connections": {
    "Shopify Refund Request": {
      "main": [
        [
          {
            "node": "AI Refund Decision",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Refund Decision": {
      "main": [
        [
          {
            "node": "IF Approve Refund",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "IF Approve Refund": {
      "main": [
        [
          {
            "node": "Signatrust: Receipt",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Respond Denied",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Signatrust: Receipt": {
      "main": [
        [
          {
            "node": "Stripe Refund",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "tags": [
    {
      "name": "Customer Refund \u2014 Refund"
    },
    {
      "name": "Customer Refund \u2014 Payments"
    },
    {
      "name": "Signatrust (3)"
    },
    {
      "name": "Customer Refund \u2014 Shopify"
    }
  ],
  "meta": {
    "templateCredsSetupCompleted": false
  },
  "versionId": "f95ab465-d20b-48e1-85d9-ed7136c8a24c"
}

Credentials you'll need

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

Pro

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

About this workflow

Customer Refund with Verifiable Decision Receipts. Uses openAi, n8n-nodes-signatrust, httpRequest. Webhook trigger; 7 nodes.

Source: https://github.com/abokenan444/n8n-signatrust-workflows/blob/main/workflows/03-customer-refund-shopify-stripe.json — original creator credit. Request a take-down →

More E-commerce workflows → · Browse all categories →

Related workflows

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

E-commerce

This workflow automatically checks WooCommerce for failed orders on a schedule, processes each order individually, prevents duplicate entries using Airtable, stores new failed orders centrally, and se

Airtable, OpenAI, Slack +1
E-commerce

WF01 — Payout Reconciler (Stripe + Shopify → Xero). Uses httpRequest, postgres. Webhook trigger; 54 nodes.

HTTP Request, Postgres
E-commerce

This n8n workflow helps Shopify store owners and teams automatically confirm orders via WhatsApp. It checks if the customer's number is valid using Rapiwa API, sends a personalized message, and logs e

HTTP Request, Google Sheets
E-commerce

Stop paying for expensive plugins to recover your valuable revenue from abandoned carts on your WooCommerce store When a product is added to a user's cart on your store, it fetches the cart contents v

WooCommerce, Email Send, HTTP Request
E-commerce

Sends instant WhatsApp order confirmation messages to customers when they place an order on your Shopify store, powered by MoltFlow (https://molt.waiflow.app). Shopify webhook fires on new order creat

HTTP Request