This workflow corresponds to n8n.io template #1468 — we link there as the canonical source.
This workflow follows the HubSpot → Slack 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 →
{
"id": 100,
"name": "On new Stripe Invoice Payment update Hubspot and notify the team in Slack",
"nodes": [
{
"name": "When Invoice Paid",
"type": "n8n-nodes-base.stripeTrigger",
"position": [
400,
460
],
"parameters": {
"events": [
"invoice.payment_succeeded"
]
},
"credentials": {
"stripeApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"name": "Update Deal to Paid",
"type": "n8n-nodes-base.hubspot",
"position": [
1240,
500
],
"parameters": {
"dealId": "={{$json[\"id\"]}}",
"operation": "update",
"updateFields": {
"customPropertiesUi": {
"customPropertiesValues": [
{
"value": "Yes",
"property": "paid"
}
]
}
},
"authentication": "oAuth2"
},
"credentials": {
"hubspotOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"name": "Find Deal based on PO Number",
"type": "n8n-nodes-base.hubspot",
"position": [
820,
480
],
"parameters": {
"operation": "search",
"filterGroupsUi": {
"filterGroupsValues": [
{
"filtersUi": {
"filterValues": [
{
"value": "={{$json[\"data\"][\"object\"][\"custom_fields\"][0][\"value\"]}}",
"propertyName": "po_number"
}
]
}
}
]
},
"additionalFields": {}
},
"credentials": {
"hubspotApi": {
"name": "<your credential>"
}
},
"typeVersion": 1,
"alwaysOutputData": true
},
{
"name": "If no PO Number",
"type": "n8n-nodes-base.if",
"position": [
600,
460
],
"parameters": {
"conditions": {
"string": [
{
"value1": "={{$json[\"data\"][\"object\"][\"custom_fields\"]}}",
"operation": "isEmpty"
}
]
}
},
"typeVersion": 1
},
{
"name": "If no deal found for PO",
"type": "n8n-nodes-base.if",
"position": [
1020,
480
],
"parameters": {
"conditions": {
"string": [
{
"value1": "={{$json[\"id\"]}}",
"operation": "isEmpty"
}
]
}
},
"typeVersion": 1
},
{
"name": "Send invoice paid message",
"type": "n8n-nodes-base.slack",
"position": [
1420,
500
],
"parameters": {
"text": ":sparkles: An invoice has been paid :sparkles:",
"channel": "team-accounts",
"blocksUi": {
"blocksValues": []
},
"attachments": [
{
"color": "#00FF04",
"fields": {
"item": [
{
"short": true,
"title": "Amount",
"value": "={{$node[\"When Invoice Paid\"].json[\"data\"][\"object\"][\"amount_paid\"]/100}}"
},
{
"short": true,
"title": "Currency",
"value": "={{$node[\"When Invoice Paid\"].json[\"data\"][\"object\"][\"currency\"]}}"
},
{
"short": false,
"title": "Customer Name",
"value": "={{$node[\"When Invoice Paid\"].json[\"data\"][\"object\"][\"customer_name\"]}}"
},
{
"short": false,
"title": "Customer Email",
"value": "={{$node[\"When Invoice Paid\"].json[\"data\"][\"object\"][\"customer_email\"]}}"
},
{
"short": true,
"title": "PO Number",
"value": "={{$node[\"When Invoice Paid\"].json[\"data\"][\"object\"][\"custom_fields\"][0][\"value\"]}}"
},
{
"short": true,
"title": "",
"value": "="
}
]
},
"footer": "=*Transaction ID:* {{$node[\"When Invoice Paid\"].json[\"id\"]}}"
}
],
"otherOptions": {}
},
"credentials": {
"slackApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"name": "Send no PO Message",
"type": "n8n-nodes-base.slack",
"position": [
800,
240
],
"parameters": {
"text": ":x: Stripe Payment with no PO Number :x:",
"channel": "team-accounts",
"blocksUi": {
"blocksValues": []
},
"attachments": [
{
"color": "#FF3C00",
"fields": {
"item": [
{
"short": true,
"title": "Amount",
"value": "={{$json[\"data\"][\"object\"][\"amount_paid\"] / 100}}"
},
{
"short": true,
"title": "Currency",
"value": "={{$json[\"data\"][\"object\"][\"currency\"]}}"
},
{
"short": false,
"title": "Customer Name",
"value": "={{$json[\"data\"][\"object\"][\"customer_name\"]}}"
},
{
"short": false,
"title": "Customer Email",
"value": "={{$json[\"data\"][\"object\"][\"customer_email\"]}}"
}
]
},
"footer": "=*Transaction ID:* {{$json[\"id\"]}}"
}
],
"otherOptions": {}
},
"credentials": {
"slackApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"name": "Send Deal not found message",
"type": "n8n-nodes-base.slack",
"position": [
1180,
240
],
"parameters": {
"text": ":x: Unable to find Deal for the below payment :x:",
"channel": "team-accounts",
"blocksUi": {
"blocksValues": []
},
"attachments": [
{
"color": "#FF3C00",
"fields": {
"item": [
{
"short": true,
"title": "Amount",
"value": "={{$node[\"When Invoice Paid\"].json[\"data\"][\"object\"][\"amount_paid\"]/100}}"
},
{
"short": true,
"title": "Currency",
"value": "={{$node[\"When Invoice Paid\"].json[\"data\"][\"object\"][\"currency\"]}}"
},
{
"short": false,
"title": "Customer Name",
"value": "={{$node[\"When Invoice Paid\"].json[\"data\"][\"object\"][\"customer_name\"]}}"
},
{
"short": false,
"title": "Customer Email",
"value": "={{$node[\"When Invoice Paid\"].json[\"data\"][\"object\"][\"customer_email\"]}}"
},
{
"short": true,
"title": "PO Number",
"value": "={{$node[\"When Invoice Paid\"].json[\"data\"][\"object\"][\"custom_fields\"][0][\"value\"]}}"
}
]
},
"footer": "=*Transaction ID:* {{$node[\"When Invoice Paid\"].json[\"id\"]}}"
}
],
"otherOptions": {}
},
"credentials": {
"slackApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
}
],
"active": false,
"settings": {},
"connections": {
"If no PO Number": {
"main": [
[
{
"node": "Send no PO Message",
"type": "main",
"index": 0
}
],
[
{
"node": "Find Deal based on PO Number",
"type": "main",
"index": 0
}
]
]
},
"When Invoice Paid": {
"main": [
[
{
"node": "If no PO Number",
"type": "main",
"index": 0
}
]
]
},
"Update Deal to Paid": {
"main": [
[
{
"node": "Send invoice paid message",
"type": "main",
"index": 0
}
]
]
},
"If no deal found for PO": {
"main": [
[
{
"node": "Send Deal not found message",
"type": "main",
"index": 0
}
],
[
{
"node": "Update Deal to Paid",
"type": "main",
"index": 0
}
]
]
},
"Find Deal based on PO Number": {
"main": [
[
{
"node": "If no deal found for PO",
"type": "main",
"index": 0
}
]
]
}
}
}
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.
hubspotApihubspotOAuth2ApislackApistripeApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow automatically posts a message in Slack when a new invoice is uploaded in Stripe, and it updates the fields in the HubSpot CRM. A Slack account and credentials A HubSpot account and credentials A Stripe account and credentials Stripe Trigger node triggers the…
Source: https://n8n.io/workflows/1468/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
How It Works Trigger: Watches for new emails in Gmail with PDF/image attachments. OCR: Sends the attachment to OCR.space API (https://ocr.space/OCRAPI) to extract invoice text. Parsing: Extracts key f
Automated Stripe Payment to QuickBooks Sales Receipt
This workflow automatically generates and delivers professional invoice PDFs whenever a Stripe checkout session completes. It fetches the line items from Stripe, formats them into a clean invoice with
This workflow is a sophisticated, end-to-end solution that automates the entire billing lifecycle, from invoice creation to intelligent payment reminders and status tracking. It's designed to give you
This is the ultimate sales-to-cash automation. When a deal in Airtable is marked "Approved for Invoicing," this workflow intelligently syncs customer data across QuickBooks and Stripe (creating them i