Intermediate~20 min setupFinance & FinanceVerified April 2026
QuickBooks logo
Stripe logo

How to Record Stripe Refunds in QuickBooks with N8n

Automatically create QuickBooks credit memos when Stripe processes refunds to keep your books accurate.

Steps and UI details are based on platform versions at time of writing β€” check each platform for the latest interface.

Best for

E-commerce businesses that need custom refund processing logic or complex GL account mapping.

Not ideal for

Simple stores that just want basic refund recording without customization.

Sync type

real-time

Use case type

sync

Real-World Example

πŸ’‘

A 25-person Shopify Plus store uses this to automatically record refunds in QuickBooks with proper GL account coding by product category. Before automation, their bookkeeper spent 3 hours weekly manually creating credit memos and often missed refunds during busy periods, causing month-end reconciliation headaches. Now refunds appear in QuickBooks within 2 minutes with correct coding.

What Will This Cost?

Drag the slider to your expected monthly volume.

/mo
505005K50K

Each platform counts differently β€” Zapier: 1 task per trigger. Make: 1 operation per module per record. n8n: 1 execution per run.

Prices shown for annual billing. Based on published pricing as of April 2026.

Estimated ROI

1000

min saved/mo

$583

labor value/mo

Free

no platform cost

Based on ~2 min manual effort per operation at $35/hr fully loaded labor cost.

Implementation

Skip the setup

Import this workflow directly into n8n

Copy the pre-built n8n blueprint and paste it straight into n8n. All modules, filters, and field mappings are already configured β€” you just need to connect your accounts.

Before You Start

Make sure you have everything ready.

QuickBooks Online Plus or Advanced subscription (Simple Start doesn't support API)
Stripe account with webhook permissions and API access
Self-hosted N8n instance or N8n Cloud account
Existing customers in QuickBooks that match your Stripe customers

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Customer ReferenceCustomerRef
Total AmountTotalAmt
Line Item AmountLine.Amount
3 optional fieldsβ–Έ show
Transaction DateTxnDate
Reference NumberDocNumber
Memo FieldPrivateNote

Step-by-Step Setup

1

Editor > + > Stripe Trigger > Webhook

Set up Stripe webhook trigger

Configure N8n to listen for Stripe refund events. You'll create a webhook that fires whenever charge.dispute.created or invoice.payment_failed events occur.

  1. 1Click the + button in N8n editor
  2. 2Search for 'Stripe Trigger' and select it
  3. 3Choose 'Webhook' as the trigger type
  4. 4Select 'charge.refunded' from the event dropdown
βœ“ What you should see: You should see a webhook URL generated by N8n starting with your instance domain.
⚠
Common mistake β€” Don't select 'charge.dispute.created' β€” that's for chargebacks, not refunds
n8n
+
click +
search apps
QuickBooks
QU
QuickBooks
Set up Stripe webhook trigger
QuickBooks
QU
module added
2

Stripe Node > Credential > Create New

Connect your Stripe account

Add your Stripe API credentials so N8n can receive webhook data. You'll need your secret key from the Stripe dashboard.

  1. 1Click 'Create New' next to Credential for Stripe
  2. 2Paste your Stripe secret key (starts with sk_live_ or sk_test_)
  3. 3Click 'Save' to store the credential
  4. 4Test the connection using the 'Test' button
βœ“ What you should see: Green checkmark appears next to the credential name indicating successful connection.
n8n settings
Connection
Choose a connection…Add
click Add
QuickBooks
Log in to authorize
Authorize n8n
popup window
βœ“
Connected
green checkmark
3

Stripe Dashboard > Developers > Webhooks > Add endpoint

Configure webhook in Stripe dashboard

Register N8n's webhook URL in your Stripe account so refund events get sent to your workflow. This creates the connection from Stripe to N8n.

  1. 1Copy the webhook URL from your N8n Stripe trigger node
  2. 2Go to Stripe Dashboard > Developers > Webhooks
  3. 3Click 'Add endpoint' and paste the N8n webhook URL
  4. 4Select 'charge.refunded' from the events list
  5. 5Click 'Add endpoint' to save
βœ“ What you should see: Stripe shows your new endpoint with status 'Enabled' and event 'charge.refunded' listed.
⚠
Common mistake β€” Make sure you're in the same environment (test/live) as your API key
4

Editor > + > Set Node > Add Value

Add data extraction node

Extract the refund details from Stripe's webhook payload. You'll pull out customer info, refund amount, and original charge details needed for QuickBooks.

  1. 1Add a 'Set' node after the Stripe trigger
  2. 2Click 'Add Value' and set name to 'refund_amount'
  3. 3Set the value to {{ $json.data.object.amount_refunded }}
  4. 4Add another value called 'customer_email' with {{ $json.data.object.billing_details.email }}
βœ“ What you should see: The Set node shows your mapped fields with sample data when you test the trigger.
5

Editor > + > QuickBooks > Credit Memo > Create New Credential

Connect QuickBooks Online account

Set up OAuth connection to your QuickBooks company file. This allows N8n to create credit memos in your accounting system.

  1. 1Add a 'QuickBooks' node and select 'Credit Memo' operation
  2. 2Click 'Create New' credential for QuickBooks
  3. 3Click 'Connect my account' and authorize with QuickBooks
  4. 4Select your company from the dropdown
βœ“ What you should see: QuickBooks credential shows 'Connected' status with your company name displayed.
⚠
Common mistake β€” You need QuickBooks Online Plus or Advanced β€” Simple Start doesn't support API access
6

QuickBooks Node > Get All > Customer > Filters

Map customer data to QuickBooks

Configure the customer lookup so N8n can find the right QuickBooks customer for this refund. This prevents creating duplicate customers.

  1. 1In the QuickBooks node, set operation to 'Get All' and resource to 'Customer'
  2. 2Add a filter where PrimaryEmailAddr equals {{ $node['Set'].json['customer_email'] }}
  3. 3Set the limit to 1 since emails should be unique
  4. 4Test this step to verify customer lookup works
βœ“ What you should see: Node returns a single customer record matching the email from Stripe.
⚠
Common mistake β€” If no customer is found, you'll need an IF node to handle new customer creation
QuickBooks fields
DocNumber
CustomerRef.name
TotalAmt
Balance
DueDate
available as variables:
1.props.DocNumber
1.props.CustomerRef.name
1.props.TotalAmt
1.props.Balance
1.props.DueDate
7

Editor > + > QuickBooks > Credit Memo > Create

Create credit memo in QuickBooks

Build the actual credit memo record with line items, amounts, and references. This creates the accounting entry that balances against the original sale.

  1. 1Add another QuickBooks node and select 'Credit Memo' resource
  2. 2Set operation to 'Create'
  3. 3Map CustomerRef to {{ $node['QuickBooks'].json['Id'] }}
  4. 4Set TotalAmt to {{ $node['Set'].json['refund_amount'] / 100 }}
βœ“ What you should see: Credit memo is created in QuickBooks with correct customer and amount.
⚠
Common mistake β€” Stripe amounts are in cents β€” divide by 100 for QuickBooks dollar amounts
8

QuickBooks Node > Credit Memo > Line Items

Add line item details

Configure the credit memo line items with product details and amounts. This provides the detailed breakdown of what's being refunded.

  1. 1In the same QuickBooks node, expand 'Line' section
  2. 2Set Amount to {{ $node['Set'].json['refund_amount'] / 100 }}
  3. 3Add Description: 'Stripe refund for charge {{ $node['Stripe Trigger'].json['data']['object']['id'] }}'
  4. 4Select your refund item from the dropdown
βœ“ What you should see: Line item appears in the credit memo with proper amount and description.
9

QuickBooks Node > Settings > Continue On Fail

Configure error handling

Set up retry logic and error notifications so failed refunds don't get lost. This ensures your books stay accurate even when QuickBooks is temporarily down.

  1. 1Click on the QuickBooks node settings (gear icon)
  2. 2Set 'On Error' to 'Continue'
  3. 3Add an IF node after QuickBooks to check for errors
  4. 4Connect error path to email/Slack notification
βœ“ What you should see: Workflow continues even if QuickBooks fails, and you get notified of errors.
⚠
Common mistake β€” Don't use 'Stop and Error' β€” you'll lose the refund data if QuickBooks times out
10

N8n > Executions > Latest Run

Test with real refund

Process a test refund through Stripe to verify the complete workflow. This confirms both the webhook delivery and QuickBooks integration work correctly.

  1. 1Go to Stripe Dashboard and find a test charge
  2. 2Click 'Refund' and process a partial refund
  3. 3Check N8n execution log within 30 seconds
  4. 4Verify credit memo appears in QuickBooks
βœ“ What you should see: N8n shows successful execution and QuickBooks displays the new credit memo.
⚠
Common mistake β€” Use test mode first β€” production refunds are permanent and affect real money

Drop this into an n8n Code node.

JavaScript β€” Code Node// Convert Stripe cents to dollars and round to 2 decimals
β–Έ Show code
// Convert Stripe cents to dollars and round to 2 decimals
const dollarAmount = Math.round($json.amount_refunded) / 100;
return { amount: dollarAmount.toFixed(2) };

... expand to see full code

// Convert Stripe cents to dollars and round to 2 decimals
const dollarAmount = Math.round($json.amount_refunded) / 100;
return { amount: dollarAmount.toFixed(2) };
n8n
β–Ά Run once
executed
βœ“
QuickBooks
βœ“
Stripe
Stripe
πŸ”” notification
received

Scaling Beyond 200+ refunds/day+ Records

If your volume exceeds 200+ refunds/day records, apply these adjustments.

1

Batch processing setup

Group refunds by hour using a Schedule trigger and process in batches. QuickBooks API handles bulk operations better than individual calls and you'll avoid rate limiting.

2

Queue failed refunds

Add a database or Google Sheets node to store failed refunds for retry processing. High volume means more API failures, and you can't afford to lose refund records.

Going live

Production Checklist

Before you turn this on for real, confirm each item.

Troubleshooting

Common errors and how to fix them.

Frequently Asked Questions

Common questions about this workflow.

Analysis

VerdictWhy n8n for this workflow

Use N8n for this if you need custom refund logic or handle complex product catalogs. N8n's code nodes let you transform Stripe's payment data to match your QuickBooks chart of accounts perfectly. You can add conditional logic for partial refunds, different GL accounts by product type, or custom approval workflows. Pick Zapier instead if you just want basic refund recording with zero customization β€” their pre-built QuickBooks templates work in 5 minutes.

Cost

This workflow runs once per refund event. At 50 refunds per month, that's 50 executions total. N8n Cloud's Starter plan ($20/month) includes 5,000 executions, so you're covered until you hit 5,000+ refunds monthly. Zapier charges $29.99 for their Professional plan to get QuickBooks access, and Make costs $10.59 but limits you to 10,000 operations. N8n wins on cost until you're processing thousands of refunds.

Tradeoffs

Zapier handles the QuickBooks OAuth refresh automatically β€” N8n sometimes requires manual re-authorization after 6 months. Make has better built-in error handling with automatic retries and detailed logs. But N8n's JavaScript code nodes let you handle Stripe's complex refund objects (partial refunds, disputes, metadata) way better than the other platforms. You can parse custom fields and build sophisticated GL account routing that's impossible with point-and-click tools.

QuickBooks API often returns cryptic errors like 'Invalid Reference' when customers don't exist in both systems. Their sandbox environment behaves differently than production β€” test transactions work fine, but real refunds sometimes fail on tax calculations. Stripe webhooks can arrive out of order during high volume, so a refund webhook might arrive before the original charge webhook. Add timestamp checks to avoid processing refunds for charges that aren't in QuickBooks yet.

Ideas for what to build next

  • β†’
    Add invoice payment matching β€” Connect successful payments to QuickBooks invoices automatically, so refunds can reference the original invoice for better tracking.
  • β†’
    Set up dispute handling workflow β€” Create a separate workflow for Stripe chargebacks that creates different GL entries and sends alerts to your finance team.
  • β†’
    Build refund analytics dashboard β€” Send refund data to Google Sheets or a database to track refund patterns, reasons, and trends for business insights.

Related guides

Was this guide helpful?
← QuickBooks + Stripe overviewn8n profile β†’