AutomationFlowsSlack & Telegram › Stripe Payment to HubSpot & Email

Stripe Payment to HubSpot & Email

Original n8n title: Payment Processing Workflow

Payment Processing Workflow. Uses postgres, hubspot, emailSend, slack. Webhook trigger; 11 nodes.

Webhook trigger★★★★☆ complexity11 nodesPostgresHubSpotEmail SendSlack
Slack & Telegram Trigger: Webhook Nodes: 11 Complexity: ★★★★☆ Added:

This workflow follows the Emailsend → Postgres 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": "Payment Processing Workflow",
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "stripe-webhook",
        "options": {
          "rawBody": true
        }
      },
      "id": "stripe-webhook",
      "name": "Stripe Webhook",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 1,
      "position": [
        250,
        300
      ]
    },
    {
      "parameters": {
        "functionCode": "// Verify Stripe webhook signature\nconst stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);\nconst endpointSecret = process.env.STRIPE_WEBHOOK_SECRET;\n\nconst sig = items[0].headers['stripe-signature'];\nconst rawBody = items[0].json.body;\n\ntry {\n  const event = stripe.webhooks.constructEvent(rawBody, sig, endpointSecret);\n  \n  // Process different event types\n  const eventData = {\n    type: event.type,\n    id: event.id,\n    created: new Date(event.created * 1000).toISOString(),\n    data: event.data.object\n  };\n  \n  // Extract relevant information based on event type\n  switch(event.type) {\n    case 'payment_intent.succeeded':\n      eventData.amount = event.data.object.amount / 100;\n      eventData.currency = event.data.object.currency;\n      eventData.customerId = event.data.object.customer;\n      eventData.status = 'succeeded';\n      break;\n    case 'customer.subscription.created':\n    case 'customer.subscription.updated':\n      eventData.subscriptionId = event.data.object.id;\n      eventData.customerId = event.data.object.customer;\n      eventData.status = event.data.object.status;\n      eventData.currentPeriodEnd = new Date(event.data.object.current_period_end * 1000).toISOString();\n      break;\n    case 'invoice.payment_failed':\n      eventData.customerId = event.data.object.customer;\n      eventData.attemptCount = event.data.object.attempt_count;\n      eventData.status = 'failed';\n      break;\n  }\n  \n  return [{json: eventData}];\n} catch (err) {\n  throw new Error(`Webhook signature verification failed: ${err.message}`);\n}"
      },
      "id": "verify-stripe",
      "name": "Verify & Parse Stripe Event",
      "type": "n8n-nodes-base.function",
      "typeVersion": 1,
      "position": [
        450,
        300
      ]
    },
    {
      "parameters": {
        "conditions": {
          "string": [
            {
              "value1": "={{$json[\"type\"]}}",
              "operation": "contains",
              "value2": "payment_intent"
            }
          ]
        }
      },
      "id": "is-payment",
      "name": "Is Payment?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 1,
      "position": [
        650,
        200
      ]
    },
    {
      "parameters": {
        "conditions": {
          "string": [
            {
              "value1": "={{$json[\"type\"]}}",
              "operation": "contains",
              "value2": "subscription"
            }
          ]
        }
      },
      "id": "is-subscription",
      "name": "Is Subscription?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 1,
      "position": [
        650,
        400
      ]
    },
    {
      "parameters": {
        "operation": "update",
        "table": "users",
        "updateKey": "stripe_customer_id",
        "columns": "subscription_status,subscription_end_date",
        "additionalFields": {
          "values": "={{$json[\"status\"]}},={{$json[\"currentPeriodEnd\"]}}"
        }
      },
      "id": "update-user-subscription",
      "name": "Update User Subscription",
      "type": "n8n-nodes-base.postgres",
      "typeVersion": 1,
      "position": [
        850,
        400
      ]
    },
    {
      "parameters": {
        "operation": "insert",
        "table": "payments",
        "columns": "stripe_payment_id,customer_id,amount,currency,status,created_at",
        "additionalFields": {
          "values": "={{$json[\"id\"]}},={{$json[\"customerId\"]}},={{$json[\"amount\"]}},={{$json[\"currency\"]}},={{$json[\"status\"]}},={{$json[\"created\"]}}"
        }
      },
      "id": "log-payment",
      "name": "Log Payment",
      "type": "n8n-nodes-base.postgres",
      "typeVersion": 1,
      "position": [
        850,
        200
      ]
    },
    {
      "parameters": {
        "resource": "contact",
        "operation": "update",
        "email": "={{$json[\"customerEmail\"]}}",
        "additionalFields": {
          "properties": [
            {
              "property": "lifecyclestage",
              "value": "customer"
            },
            {
              "property": "last_payment_date",
              "value": "={{$json[\"created\"]}}"
            },
            {
              "property": "subscription_status",
              "value": "={{$json[\"status\"]}}"
            }
          ]
        }
      },
      "id": "update-hubspot",
      "name": "Update HubSpot Contact",
      "type": "n8n-nodes-base.hubspot",
      "typeVersion": 2,
      "position": [
        1050,
        300
      ]
    },
    {
      "parameters": {
        "fromEmail": "billing@mundotango.life",
        "toEmail": "={{$json[\"customerEmail\"]}}",
        "subject": "Payment Confirmation - Mundo Tango",
        "html": "<h2>Payment Received</h2>\n<p>Thank you for your payment!</p>\n<p><strong>Amount:</strong> ${{$json[\"amount\"]}} {{$json[\"currency\"].toUpperCase()}}</p>\n<p><strong>Date:</strong> {{$json[\"created\"]}}</p>\n<p><strong>Payment ID:</strong> {{$json[\"id\"]}}</p>\n<p>Your subscription is active until: {{$json[\"currentPeriodEnd\"]}}</p>\n<p>If you have any questions, please contact our support team.</p>\n<p>Best regards,<br>The Mundo Tango Team</p>"
      },
      "id": "send-receipt",
      "name": "Send Receipt Email",
      "type": "n8n-nodes-base.emailSend",
      "typeVersion": 2,
      "position": [
        1250,
        200
      ]
    },
    {
      "parameters": {
        "channel": "#payments",
        "text": "\ud83d\udcb0 *New Payment Received*\n\n*Amount:* ${{$json[\"amount\"]}} {{$json[\"currency\"].toUpperCase()}}\n*Customer:* {{$json[\"customerId\"]}}\n*Type:* {{$json[\"type\"]}}\n*Status:* {{$json[\"status\"]}}\n*Time:* {{$json[\"created\"]}}",
        "attachments": [
          {
            "color": "#00ff00",
            "fields": [
              {
                "title": "Payment ID",
                "value": "{{$json[\"id\"]}}",
                "short": true
              },
              {
                "title": "Next Billing",
                "value": "{{$json[\"currentPeriodEnd\"]}}",
                "short": true
              }
            ]
          }
        ]
      },
      "id": "slack-payment-notification",
      "name": "Notify Finance Team",
      "type": "n8n-nodes-base.slack",
      "typeVersion": 1,
      "position": [
        1250,
        300
      ]
    },
    {
      "parameters": {
        "conditions": {
          "string": [
            {
              "value1": "={{$json[\"type\"]}}",
              "operation": "equals",
              "value2": "invoice.payment_failed"
            }
          ]
        }
      },
      "id": "check-failed-payment",
      "name": "Payment Failed?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 1,
      "position": [
        650,
        500
      ]
    },
    {
      "parameters": {
        "fromEmail": "billing@mundotango.life",
        "toEmail": "={{$json[\"customerEmail\"]}}",
        "subject": "\u26a0\ufe0f Payment Failed - Action Required",
        "html": "<h2>Payment Failed</h2>\n<p>We were unable to process your payment.</p>\n<p>This was attempt #{{$json[\"attemptCount\"]}} to charge your card.</p>\n<p>Please update your payment method to avoid service interruption:</p>\n<p><a href=\"https://mundotango.life/billing\">Update Payment Method</a></p>\n<p>If you need assistance, please contact our support team.</p>\n<p>Best regards,<br>The Mundo Tango Team</p>"
      },
      "id": "failed-payment-email",
      "name": "Send Failed Payment Email",
      "type": "n8n-nodes-base.emailSend",
      "typeVersion": 2,
      "position": [
        850,
        500
      ]
    }
  ],
  "connections": {
    "Stripe Webhook": {
      "main": [
        [
          {
            "node": "Verify & Parse Stripe Event",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Verify & Parse Stripe Event": {
      "main": [
        [
          {
            "node": "Is Payment?",
            "type": "main",
            "index": 0
          },
          {
            "node": "Is Subscription?",
            "type": "main",
            "index": 0
          },
          {
            "node": "Payment Failed?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Is Payment?": {
      "main": [
        [
          {
            "node": "Log Payment",
            "type": "main",
            "index": 0
          }
        ],
        []
      ]
    },
    "Is Subscription?": {
      "main": [
        [
          {
            "node": "Update User Subscription",
            "type": "main",
            "index": 0
          }
        ],
        []
      ]
    },
    "Log Payment": {
      "main": [
        [
          {
            "node": "Send Receipt Email",
            "type": "main",
            "index": 0
          },
          {
            "node": "Update HubSpot Contact",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update User Subscription": {
      "main": [
        [
          {
            "node": "Update HubSpot Contact",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update HubSpot Contact": {
      "main": [
        [
          {
            "node": "Notify Finance Team",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Payment Failed?": {
      "main": [
        [
          {
            "node": "Send Failed Payment Email",
            "type": "main",
            "index": 0
          }
        ],
        []
      ]
    }
  },
  "active": false,
  "settings": {},
  "versionId": "1",
  "id": "payment-processing",
  "tags": [
    "payments",
    "stripe",
    "billing"
  ]
}
Pro

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

About this workflow

Payment Processing Workflow. Uses postgres, hubspot, emailSend, slack. Webhook trigger; 11 nodes.

Source: https://github.com/MundoTango/Mundo_Tango_App_emergent/blob/d86f02127e80dc4754f64e8202dee82bb82866c0/n8n-workflows/payment-processing.json — original creator credit. Request a take-down →

More Slack & Telegram workflows → · Browse all categories →

Related workflows

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

Slack & Telegram

This workflow automates end-to-end research analysis by coordinating multiple AI models—including NVIDIA NIM (Llama), OpenAI GPT-4, and Claude to analyze uploaded documents, extract insights, and gene

HTTP Request, Postgres, Slack +1
Slack & Telegram

This n8n workflow automates task creation and scheduled reminders for users via a Telegram bot, ensuring timely notifications across multiple channels like email and Slack. It streamlines task managem

Postgres, Email Send, Slack +1
Slack & Telegram

Advanced Workflow with Branching and Error Handling. Uses emailSend, httpRequest, postgres, slack. Webhook trigger; 12 nodes.

Email Send, HTTP Request, Postgres +1
Slack & Telegram

This smart onboarding automation handles new customer signups by:

HubSpot, Telegram, Email Send
Slack & Telegram

QA Platform — Jira Story to Test Workflow. Uses jiraTrigger, postgres, httpRequest, slack. Webhook trigger; 20 nodes.

Jira Trigger, Postgres, HTTP Request +1