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

How to Auto-create invoices from payments with Pipedream

Automatically create QuickBooks invoices with customer details whenever a Stripe payment succeeds.

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

Best for

SaaS companies and e-commerce businesses that need real-time invoice generation for completed payments.

Not ideal for

Businesses that batch process payments daily or need complex invoice approval workflows before creation.

Sync type

real-time

Use case type

notification

Real-World Example

πŸ’‘

A 25-person subscription software company processes 200+ payments monthly through Stripe. Their accounting team spent 3 hours weekly manually creating QuickBooks invoices after payments cleared, often missing invoices for days. Now invoices generate within 30 seconds of payment completion.

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 Pipedream

Copy the pre-built Pipedream blueprint and paste it straight into Pipedream. 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.

Stripe account with webhook creation permissions
QuickBooks Online account with invoice creation access
Admin access to both Stripe and QuickBooks for OAuth authorization
Understanding of your Stripe payment flow and required invoice fields

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Customer NameCustomerRef.Name
Invoice AmountLine.Amount
Payment DescriptionLine.Description
Payment DateTxnDate
Payment StatusBalance
3 optional fieldsβ–Έ show
Payment MethodPaymentMethodRef.Name
Billing AddressBillAddr
Invoice ReferenceDocNumber

Step-by-Step Setup

1

Dashboard > New Workflow

Create new workflow in Pipedream

Navigate to pipedream.com and click 'New Workflow' in your dashboard. You'll see a blank workflow canvas with a placeholder trigger step. This is where you'll configure the Stripe webhook that fires when payments succeed.

  1. 1Click the green 'New Workflow' button
  2. 2Name your workflow 'Stripe to QuickBooks Invoices'
  3. 3Click 'Create Workflow' to proceed
βœ“ What you should see: You should see a workflow canvas with one empty trigger step waiting for configuration.
2

Trigger Step > Select App > Stripe

Set up Stripe webhook trigger

Click the trigger step and select Stripe from the app list. Choose 'New Payment Intent Succeeded' as your event type. Pipedream automatically generates a webhook URL that you'll register with Stripe to receive payment notifications.

  1. 1Click 'Select App' in the trigger step
  2. 2Search for and select 'Stripe'
  3. 3Choose 'New Payment Intent Succeeded' from the event list
  4. 4Copy the generated webhook URL
βœ“ What you should see: You should see a unique webhook URL displayed that ends with '.m.pipedream.net'.
⚠
Common mistake β€” Don't test the trigger yet - Stripe needs to be configured first or you'll get timeout errors.
Pipedream
+
click +
search apps
QuickBooks
QU
QuickBooks
Set up Stripe webhook trigger
QuickBooks
QU
module added
3

Stripe Dashboard > Developers > Webhooks

Register webhook in Stripe dashboard

Open your Stripe dashboard and navigate to Developers > Webhooks. Add the Pipedream webhook URL you copied and select 'payment_intent.succeeded' as the event type. This tells Stripe where to send payment notifications.

  1. 1Click 'Add endpoint' in Stripe webhooks
  2. 2Paste your Pipedream webhook URL
  3. 3Select 'payment_intent.succeeded' from events
  4. 4Click 'Add endpoint' to save
βœ“ What you should see: Stripe shows your new webhook endpoint with 'Enabled' status and the payment_intent.succeeded event listed.
⚠
Common mistake β€” Make sure you select the test mode webhook endpoint if you're testing with Stripe test data.
4

Add Step > QuickBooks Online > Create Invoice

Connect QuickBooks account

Add a new step below your trigger and select QuickBooks Online from the app list. Choose 'Create Invoice' as the action. You'll need to authenticate with your QuickBooks account and grant Pipedream permission to create invoices.

  1. 1Click the '+' button below your trigger step
  2. 2Select 'QuickBooks Online' from the app directory
  3. 3Choose 'Create Invoice' action
  4. 4Click 'Connect Account' and authorize Pipedream
βœ“ What you should see: You should see 'Connected' next to your QuickBooks account with a list of invoice fields to configure.
⚠
Common mistake β€” QuickBooks authorization expires every 180 days and requires manual reconnection.
Pipedream settings
Connection
Choose a connection…Add
click Add
QuickBooks
Log in to authorize
Authorize Pipedream
popup window
βœ“
Connected
green checkmark
5

Create Invoice Step > Customer Field

Map customer information

Configure the invoice customer field by mapping Stripe payment data to QuickBooks. You'll need to handle customer lookup or creation since Stripe customer IDs don't exist in QuickBooks. Set up the billing address using Stripe's payment method billing details.

  1. 1Click the Customer field dropdown
  2. 2Select 'Use an expression' from the menu
  3. 3Enter steps.trigger.event.charges.data[0].billing_details.name
  4. 4Map billing address from steps.trigger.event.charges.data[0].billing_details.address
βœ“ What you should see: Customer field shows the dynamic reference to Stripe billing name, and address fields populate with billing details.
⚠
Common mistake β€” If Stripe customer doesn't exist in QuickBooks, you'll need a separate customer creation step first.
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
6

Create Invoice Step > Line Items

Configure invoice amount and description

Set the invoice line item amount using Stripe's payment amount. Stripe amounts come in cents, so divide by 100 for dollar amounts. Add the payment description from Stripe metadata or use the payment intent description field.

  1. 1Click 'Add Line Item' in the invoice configuration
  2. 2Set Amount to steps.trigger.event.amount_received / 100
  3. 3Set Description to steps.trigger.event.description
  4. 4Select appropriate Income Account from dropdown
βœ“ What you should see: Line item shows the dynamic amount calculation and description mapping from Stripe payment data.
⚠
Common mistake β€” Stripe amounts are always in cents - forgetting to divide by 100 creates invoices 100x too large.

Add this code step before QuickBooks invoice creation to handle customer lookup and creation automatically. Paste this in a Node.js code step between your trigger and QuickBooks action.

JavaScript β€” Code Stepexport default defineComponent({
β–Έ Show code
export default defineComponent({
  async run({ steps, $ }) {
    const customerName = steps.trigger.event.charges.data[0].billing_details.name;

... expand to see full code

export default defineComponent({
  async run({ steps, $ }) {
    const customerName = steps.trigger.event.charges.data[0].billing_details.name;
    const customerEmail = steps.trigger.event.charges.data[0].billing_details.email;
    
    // Check if customer exists in QuickBooks
    try {
      const existingCustomer = await $.send.http({
        method: 'GET',
        url: `https://sandbox-quickbooks.api.intuit.com/v3/company/${steps.quickbooks_auth.company_id}/customers`,
        headers: {
          'Authorization': `Bearer ${steps.quickbooks_auth.oauth_access_token}`,
          'Accept': 'application/json'
        },
        params: {
          query: `SELECT * FROM Customer WHERE Name = '${customerName}'`
        }
      });
      
      if (existingCustomer.QueryResponse?.Customer?.length > 0) {
        return { customerId: existingCustomer.QueryResponse.Customer[0].Id, action: 'found' };
      }
      
      // Create new customer if not found
      const newCustomer = await $.send.http({
        method: 'POST',
        url: `https://sandbox-quickbooks.api.intuit.com/v3/company/${steps.quickbooks_auth.company_id}/customer`,
        headers: {
          'Authorization': `Bearer ${steps.quickbooks_auth.oauth_access_token}`,
          'Content-Type': 'application/json'
        },
        data: {
          Name: customerName,
          CompanyName: customerName,
          PrimaryEmailAddr: { Address: customerEmail }
        }
      });
      
      return { customerId: newCustomer.Customer.Id, action: 'created' };
    } catch (error) {
      $.export('error', error.message);
      throw new Error(`Customer lookup/creation failed: ${error.message}`);
    }
  }
});
7

Create Invoice Step > Payment Details

Set payment method and status

Configure the invoice to reflect that payment was already received through Stripe. Set the payment method based on Stripe's payment method type and mark the invoice as paid. This prevents double-charging customers.

  1. 1Set Payment Method to steps.trigger.event.charges.data[0].payment_method_details.type
  2. 2Set Invoice Status to 'Paid'
  3. 3Set Payment Date to steps.trigger.event.created
  4. 4Enable 'Mark as Paid' checkbox
βœ“ What you should see: Invoice configuration shows payment method mapping and paid status settings.
8

Add Step > Code > Node.js

Add duplicate prevention

Insert a code step before QuickBooks to check if an invoice already exists for this Stripe payment ID. This prevents creating duplicate invoices if Stripe sends the webhook multiple times. Use Pipedream's built-in deduplication or custom logic.

  1. 1Click '+' above the QuickBooks step
  2. 2Select 'Code' then 'Run Node.js Code'
  3. 3Add duplicate check logic using payment intent ID
  4. 4Return early if duplicate found
βœ“ What you should see: Code step appears between trigger and QuickBooks action with duplicate prevention logic.
⚠
Common mistake β€” Without duplicate prevention, webhook retries create multiple invoices for the same payment.
9

Workflow > Test > View Logs

Test the complete workflow

Make a test payment in Stripe to trigger your workflow. Watch the workflow execution in Pipedream's logs to see each step process. Verify that a corresponding invoice appears in QuickBooks with correct customer, amount, and paid status.

  1. 1Create a test payment in Stripe dashboard
  2. 2Monitor workflow execution in Pipedream logs
  3. 3Check QuickBooks for new invoice creation
  4. 4Verify all mapped fields are correct
βœ“ What you should see: Workflow logs show successful execution and QuickBooks displays a new paid invoice matching your Stripe test payment.
⚠
Common mistake β€” Test payments in Stripe test mode only create test invoices in QuickBooks sandbox environment.
Pipedream
β–Ά Deploy & test
executed
βœ“
QuickBooks
βœ“
Stripe
Stripe
πŸ”” notification
received

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 Pipedream for this if you need real-time invoice generation and want to add custom logic without leaving the platform. Pipedream's instant webhook processing means invoices appear in QuickBooks within 30 seconds of payment completion. The Node.js code steps let you handle customer lookup, duplicate prevention, and error handling without external tools. Choose Make instead if you prefer a visual interface and don't need custom code logic.

Cost

This costs 1 credit per payment processed. At 200 payments monthly, you'll use 200 credits ($10/month on the Basic plan). Zapier charges $0.10 per task after the free tier, making this same volume $20/month. Make's operations pricing works out to about $12/month for the same usage. Pipedream wins on cost for moderate payment volumes.

Tradeoffs

Make handles QuickBooks authentication better with automatic token refresh, while Pipedream requires manual reconnection every 180 days. Zapier offers more pre-built QuickBooks templates but lacks the custom logic capabilities. n8n provides similar Node.js flexibility for free but requires self-hosting and manual webhook management. Power Automate integrates well with Microsoft accounting tools but has weaker Stripe webhook reliability. Pipedream's instant webhook processing and built-in code environment still make it the best choice for payment-to-invoice automation.

You'll hit QuickBooks' 500 requests per minute rate limit if processing payment bursts during sales events. Stripe sometimes sends duplicate webhook events, especially during network issues, creating multiple invoices without proper deduplication. Customer names from Stripe billing often don't match QuickBooks customer records exactly, causing lookup failures that need fuzzy matching logic.

Ideas for what to build next

  • β†’
    Add invoice PDF email delivery β€” Send invoice PDFs to customers automatically using QuickBooks' send invoice API and email templates.
  • β†’
    Handle partial refunds and disputes β€” Create credit memos in QuickBooks when Stripe processes refunds or chargebacks for existing invoices.
  • β†’
    Sync subscription renewals β€” Extend workflow to handle Stripe subscription billing cycles and create recurring invoices automatically.

Related guides

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