This workflow corresponds to n8n.io template #8403 — 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 →
{
"id": "mbJzXoWPLzePg3yv",
"name": "Automate QuickBooks Sales Receipts from Stripe Payments & Customer Creation",
"tags": [],
"nodes": [
{
"id": "fb397649-1ad0-4463-9fb8-49e108d8bc79",
"name": "QuickBooks - Find Customer",
"type": "n8n-nodes-base.quickbooks",
"position": [
2720,
1040
],
"parameters": {
"limit": 500,
"filters": {
"query": "=WHERE DisplayName = '{{ $json.name }}'\n\n"
},
"operation": "getAll"
},
"typeVersion": 1,
"alwaysOutputData": false
},
{
"id": "73f28e8b-93b2-4558-9ec7-230da270ec68",
"name": "IF - Customer Exists?",
"type": "n8n-nodes-base.if",
"position": [
3712,
1472
],
"parameters": {
"conditions": {
"number": [
{
"value1": "={{ $json.Id ?? \"\" }}",
"operation": "isEmpty"
}
]
}
},
"typeVersion": 1,
"alwaysOutputData": false
},
{
"id": "25aec5a5-126e-4742-ab8a-011c18b26db7",
"name": "Create a customer",
"type": "n8n-nodes-base.quickbooks",
"position": [
4800,
992
],
"parameters": {
"operation": "create",
"displayName": "={{ $('Get a customer').item.json.name }}",
"additionalFields": {
"PrimaryEmailAddr": "={{ $('Get a customer').item.json.email }}"
}
},
"typeVersion": 1
},
{
"id": "6bca213b-7091-4665-bc11-5c903acb155f",
"name": "Create a payment",
"type": "n8n-nodes-base.quickbooks",
"position": [
6880,
992
],
"parameters": {
"TotalAmt": "={{ $('Convert payment Amount').item.json.convertedAmount }}",
"resource": "payment",
"operation": "create",
"CustomerRef": "={{ $json.Id }}",
"additionalFields": {}
},
"typeVersion": 1
},
{
"id": "7bf091c8-9387-4934-bec7-7d2ef106c5ea",
"name": "Get a customer",
"type": "n8n-nodes-base.stripe",
"position": [
1744,
1520
],
"parameters": {
"resource": "customer",
"customerId": "={{ $json.body.data.object.customer }}"
},
"typeVersion": 1
},
{
"id": "5e2a9bfc-45f4-407a-b40e-6244123003eb",
"name": "Merge",
"type": "n8n-nodes-base.merge",
"position": [
5856,
1472
],
"parameters": {},
"typeVersion": 3.2
},
{
"id": "4cc8fdbd-19b2-40d3-8925-1516b66ef8d0",
"name": "Capture Payment",
"type": "n8n-nodes-base.webhook",
"position": [
64,
1488
],
"parameters": {
"path": "3a5c2d05-9c40-43f0-898e-90a5fde7280b",
"options": {},
"httpMethod": "POST"
},
"typeVersion": 2.1
},
{
"id": "77fcc804-50f2-4e82-8a9d-100be12a0fef",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-96,
1120
],
"parameters": {
"color": 3,
"width": 480,
"height": 512,
"content": "### **Step 1 \u2013 Webhook (Capture Payment)**\n\n- This node acts as the **entry point** of the workflow. \n- It listens for the **successful payment intent event** coming from **Stripe**. \n- When a payment is successfully processed on Stripe, the webhook immediately captures the event payload and triggers the workflow execution. \n- The captured data includes essential payment details such as:\n - Customer ID \n - Payment ID \n - Amount paid \n - Payment status \n- This ensures the workflow only runs when a payment has been **successfully completed**. \n"
},
"typeVersion": 1
},
{
"id": "194c40c9-e398-4b78-a537-1c999570304d",
"name": "Convert payment Amount",
"type": "n8n-nodes-base.code",
"position": [
928,
1072
],
"parameters": {
"jsCode": "// n8n Code Node (JavaScript)\n\nreturn items.map(item => {\n const amount = $input.first().json.body.data.object.amount;\n \n // Convert from cents to dollars\n const convertedAmount = amount / 100;\n\n // Add the new value to the output JSON\n item.json.convertedAmount = convertedAmount;\n\n return item;\n});\n"
},
"typeVersion": 2
},
{
"id": "29c99c71-3c5d-4255-bd7a-522874ef43e5",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
736,
752
],
"parameters": {
"width": 480,
"height": 512,
"content": "### **Step 2 \u2013 Code (Parse Payment Amount)**\n\n- This node processes the raw payment data received from **Stripe** via the webhook. \n- Specifically, it **parses the payment amount** (usually provided in cents by Stripe) into a **readable currency format**. \n- Example transformation: \n - Stripe raw value: `7101` \n - Parsed output: `$71.01` \n- This ensures that the amount is standardized and properly formatted before passing it on to **QuickBooks** for further operations. \n"
},
"typeVersion": 1
},
{
"id": "45b854bb-cd87-4cf6-a67d-bc6a21a2e080",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
1536,
1280
],
"parameters": {
"color": 4,
"width": 496,
"height": 432,
"content": "### **Step 3 \u2013 Get Customer (Stripe)**\n\n- This node retrieves **customer details directly from Stripe** using the customer ID obtained from the payment event. \n- Ensures all relevant information such as **customer name, email, and billing details** are available for downstream processing. \n- The fetched data is later used to check if the customer already exists in **QuickBooks** or needs to be created. \n"
},
"typeVersion": 1
},
{
"id": "ae0e4c66-fac8-4514-b816-8de9ed4e4961",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
2576,
768
],
"parameters": {
"color": 5,
"width": 400,
"height": 448,
"content": "### **Step 4 \u2013 Find Customer (QuickBooks)**\n\n- This node checks in **QuickBooks** whether the customer retrieved from Stripe already exists. \n- The lookup is generally performed using the **email address** or other unique identifiers. \n- If the customer **exists**, the workflow proceeds with the existing record. \n- If the customer **does not exist**, the workflow routes to create a new customer in QuickBooks. \n"
},
"typeVersion": 1
},
{
"id": "cfdca3ee-8198-46e5-9729-9c9bcd7f3112",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
3552,
1232
],
"parameters": {
"color": 3,
"width": 432,
"height": 384,
"content": "### **Step 5 \u2013 IF Node: Customer Exists?**\n\n- This conditional node evaluates whether the customer retrieved from QuickBooks already exists. \n- **True Branch:** If the customer **does not exist**, the workflow proceeds to the **Create Customer** node to register a new customer in QuickBooks. \n- **False Branch:** If the customer **already exists**, the workflow skips creation and continues with the existing customer record. \n"
},
"typeVersion": 1
},
{
"id": "e4d83682-634b-43f7-8a10-108f922edb0c",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
4624,
784
],
"parameters": {
"width": 448,
"height": 368,
"content": "### **Step 6 \u2013 Create Customer in QuickBooks**\n\n- This node creates a **new customer record** in QuickBooks using details fetched from Stripe. \n- It ensures that customers who are not already present in QuickBooks are properly registered. \n- Key customer information such as **Name, Email, and Billing Details** is mapped from Stripe to QuickBooks fields for consistency. \n"
},
"typeVersion": 1
},
{
"id": "89751237-b9f3-4ace-adcb-4720aa04d5c6",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
5680,
1232
],
"parameters": {
"color": 6,
"width": 448,
"height": 416,
"content": "### **Step 7 \u2013 Merge Customer Data**\n\n- This is a **Merge node** that combines data streams from the **Create Customer** node and the **If** node. \n- Ensures both scenarios (newly created customer or already existing customer) flow into a **single unified output**. \n- Consolidated data is then passed forward for creating the corresponding **Sales Receipt** in QuickBooks. \n"
},
"typeVersion": 1
},
{
"id": "674159c2-9903-4fb3-a36e-a25d4ea847d0",
"name": "Sticky Note7",
"type": "n8n-nodes-base.stickyNote",
"position": [
6720,
768
],
"parameters": {
"color": 4,
"width": 416,
"height": 384,
"content": "### **Step 8 \u2013 Create Sales Receipt in QuickBooks**\n\n- This is a **Create Sales Receipt** node in QuickBooks. \n- Uses the **customer details** (merged in Step 7) and the **payment information** parsed from Stripe. \n- Automatically generates a **sales receipt** in QuickBooks for the successful payment. \n- Ensures accurate and real-time recording of customer transactions in QuickBooks. \n"
},
"typeVersion": 1
},
{
"id": "2bc405e8-a7de-4e4b-afe4-58a064311f91",
"name": "Sticky Note8",
"type": "n8n-nodes-base.stickyNote",
"position": [
-96,
592
],
"parameters": {
"color": 4,
"width": 560,
"height": 432,
"content": "### **Prerequisites**\n\nBefore running this workflow, ensure the following setup is complete:\n\n- **Stripe Setup:**\n - Add a webhook in your Stripe account with the `payment_intent.succeeded` event enabled. \n - This allows the workflow to automatically trigger when a payment is successfully completed. \n\n- **QuickBooks Setup:**\n - Connect your QuickBooks account in n8n using OAuth2 credentials. \n - Ensure access to customer and sales receipt operations is enabled. \n\n- **n8n Configuration:**\n - Connect your Stripe credentials to the Webhook and Get Customer nodes. \n - Connect your QuickBooks credentials to the Find Customer, Create Customer, and Create Sales Receipt nodes. \n"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "9d1ff60d-2326-486a-968c-b0fee80f6efc",
"connections": {
"Merge": {
"main": [
[
{
"node": "Create a payment",
"type": "main",
"index": 0
}
]
]
},
"Get a customer": {
"main": [
[
{
"node": "QuickBooks - Find Customer",
"type": "main",
"index": 0
}
]
]
},
"Capture Payment": {
"main": [
[
{
"node": "Convert payment Amount",
"type": "main",
"index": 0
}
]
]
},
"Create a customer": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 0
}
]
]
},
"IF - Customer Exists?": {
"main": [
[
{
"node": "Create a customer",
"type": "main",
"index": 0
}
],
[
{
"node": "Merge",
"type": "main",
"index": 1
}
]
]
},
"Convert payment Amount": {
"main": [
[
{
"node": "Get a customer",
"type": "main",
"index": 0
}
]
]
},
"QuickBooks - Find Customer": {
"main": [
[
{
"node": "IF - Customer Exists?",
"type": "main",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow automates the process of recording successful payments from Stripe into QuickBooks by creating corresponding Sales Receipts. It ensures payment data is captured accurately, checks whether the customer exists in QuickBooks, and creates a new customer if necessary…
Source: https://n8n.io/workflows/8403/ — 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.
Http Stripe. Uses httpRequest, stripe, stripeTrigger, quickbooks. Event-driven trigger; 10 nodes.
Streamline your accounting by automatically creating QuickBooks Online customers and sales receipts whenever a successful Stripe payment is processed. Ideal for businesses looking to reduce manual dat
This n8n workflow automates the integration between Xero and FileMaker, allowing for seamless data transfer between the two platforms. By listening for webhooks from Xero (e.g., new invoices, payments
This template sets up a weekly ETL (Extract, Transform, Load) pipeline that pulls financial data from QuickBooks Online into Google BigQuery. It not only transfers data, but also cleans, classifies, a
Template & Design Service. Webhook trigger; 4 nodes.