In This Article

LedgerUp raises $500K in seed funding, led by Y Combinator

Stripe NetSuite Reconciliation: Payouts, Fees, Refunds & Chargebacks

How to match Stripe payouts to NetSuite deposits — with mapping tables, worked examples, and a month-end close checklist.

How to Reconcile Stripe Payouts, Fees, Refunds & Chargebacks in NetSuite (2026 Controller's Guide)

Quick answer: To reconcile Stripe with NetSuite, match Stripe balance transactions (grouped by reporting_category) to NetSuite Customer Payments, Bank Deposits, and Journal Entries, then tie the payout total to your bank statement. The five-step process:

  1. Record payments. Create Customer Payments in NetSuite for each Stripe charge, posting to your Stripe clearing account (or Undeposited Funds).
  2. Record refunds and disputes. Create Credit Memos for refunds and Journal Entries for chargebacks.
  3. Create the Bank Deposit. Select all related items from your clearing account, add fees as Cash Back line items, and confirm the deposit total matches the Stripe payout amount.
  4. Match to bank. When the deposit clears, match it in NetSuite's bank reconciliation.
  5. Reconcile the ending balance. Use Stripe's ending balance reconciliation section to explain any remaining timing differences in your clearing account.

Stripe reconciliation is a three-way match: Stripe balance activity, NetSuite general ledger, and bank statement. If those three don't agree, your close isn't complete.

This guide walks through the exact accounting workflow — payout batching, fee handling, dispute JEs, FX timing differences, month-end controls, and audit prep — for B2B SaaS finance teams running Stripe payments with a NetSuite GL.

How does Stripe represent money movement for reconciliation?

Stripe creates a BalanceTransaction for every dollar that moves in or out of your Stripe balance: charges, refunds, fees, disputes, dispute reversals, payouts, and partial capture reversals. Each balance transaction includes three fields that matter for reconciliation:

  • source — links to the underlying Stripe object (a charge, refund, dispute, etc.)
  • statuspending or available, indicating where the funds are in Stripe's settlement pipeline
  • reporting_category — the accounting classification you should build your NetSuite mapping on

Funds flow through two balance states before they can be paid out: pending (just captured) and available (cleared Stripe's settlement window, typically 2 business days in the US). This timing gap is the single biggest source of reconciliation confusion for teams new to Stripe accounting.

Why is Stripe's "type" field misleading for accounting?

Many finance teams incorrectly build their NetSuite mapping using Stripe's type field. This is a mistake. Stripe's type=adjustment lumps together fundamentally different accounting events:

  • Disputes (should debit a chargeback receivable)
  • Dispute reversals (should reverse the chargeback entry)
  • Failed refunds (should reverse the refund entry)
  • Manual balance corrections (require investigation)

If you map using type, you will misclassify revenue and expenses because all of these events land in the same bucket.

Instead, use reporting_category. It distinguishes dispute, dispute_reversal, partial_capture_reversal, fee, and refund as separate categories — each mapping to a different NetSuite record type and GL treatment. Always map from reporting_category, not type.

What reconciliation method should you use: payout-batch or transaction-level?

Use payout-batch reconciliation if you have automatic payouts enabled (the default and recommended setting). Stripe groups transactions into payout batches and provides a payout reconciliation report showing exactly which balance transactions are included in each payout. One payout in Stripe = one bank deposit = one Bank Deposit record in NetSuite. This is the cleanest model.

Use transaction-level reconciliation if you use manual or instant payouts. Stripe cannot identify which transactions belong to a manual payout, so you must reconcile against your full transaction history. This is significantly more complex and increases the risk of reconciliation drift. If you have any choice in the matter, use automatic payouts.

What Stripe reports should finance teams use for reconciliation?

Report Why it matters Location
Payout reconciliation report Shows which balance transactions are in each payout batch; includes ending balance reconciliation Stripe Dashboard → Reports → Payouts
Balance summary / activity Confirms beginning and ending Stripe balance for the period Stripe Dashboard → Reports → Balance
Fees report Cross-checks fee totals (but lags 96 hours) Stripe Dashboard → Reports → Fees

The payout reconciliation report is your primary working document. It includes a balance summary, a payout-by-payout breakdown, failed payouts, and an ending balance reconciliation section that explains what has not yet settled. This report is only available for accounts with automatic payouts enabled.

Important: The fees report has a 96-hour data lag and excludes certain fee types (Terminal device purchases, Stripe Capital fees, Atlas fees, post-paid invoiced fees). Use balance transactions as your source of truth for fees; use the fees report only as a cross-check.

What NetSuite accounts do I need before mapping Stripe transactions?

Before mapping anything, confirm these are in place:

  • Stripe clearing or staging account (see two models below): holds the Stripe balance equivalent in NetSuite until funds are deposited.
  • Bank Account: the account matching your actual bank where Stripe deposits land.
  • Stripe Processing Fees (expense account): a dedicated GL account, typically under Cost of Revenue or General & Administrative.
  • Chargeback / Dispute expense account: for dispute fees and lost dispute amounts.
  • Period close controls: lock periods after reconciliation to prevent backdated edits from unreconciling matched transactions.

Should I use a Stripe clearing account or Undeposited Funds in NetSuite?

Stripe does not deposit funds the same day they are captured. Funds move through four stages: pending → available → included in payout → deposited to bank. This process takes 2–4 business days. Posting payments directly to your bank account causes your GL cash balance to run ahead of actual bank deposits, so you need a staging layer. There are two standard approaches:

Model A: Dedicated Stripe Clearing Account (recommended for audit clarity). Create a separate Other Current Asset account (e.g., "Stripe Clearing" or "Stripe Settlement") that represents your Stripe balance in NetSuite. Customer Payments post to this account; the Bank Deposit moves funds from Stripe Clearing to Bank. This gives you a discrete GL account whose balance should tie to Stripe's reported balance at any point in time, making reconciliation and audit tie-outs straightforward.

Model B: NetSuite Undeposited Funds only. Use NetSuite's built-in Undeposited Funds account as the staging layer. Customer Payments post to Undeposited Funds; the Bank Deposit clears them to Bank. This is simpler to configure and works well if Stripe is your only payment processor. The tradeoff is that Undeposited Funds comingles Stripe activity with any other payment sources (checks, ACH, other processors), making it harder to isolate the Stripe balance for reconciliation.

Either model follows the same core workflow: payments go to the staging account, the Bank Deposit moves the payout net to the bank. The rest of this guide uses "clearing account" to refer to whichever staging account you choose.

What fields should every NetSuite record carry for Stripe traceability?

Every NetSuite transaction that touches Stripe should include these fields, stored as external IDs or custom fields:

NetSuite record Required Stripe ID Format Example
Customer Payment Stripe charge ID ch_xxx ch_3PqS2e2eZvKYlo2C
Credit Memo / Customer Refund Stripe refund ID re_xxx re_1Nispe2eZvKYlo2C
Journal Entry (dispute) Stripe dispute ID dp_xxx dp_9Xqo4h2eZvKYlo2C
Bank Deposit Stripe payout ID po_xxx po_1OyfPn2eZvKYlo2C
Deposit fee line Balance transaction ID txn_xxx txn_1032HU2eZvKYlo2C

Auditors will sample transactions and trace from the bank statement → Bank Deposit → Customer Payment → Stripe charge. If any link in that chain is missing an ID, you will spend hours reconstructing it manually.

How do Stripe transactions map to NetSuite records?

This mapping table connects each Stripe reporting_category to the corresponding NetSuite transaction type, with the GL accounts and linking fields that need to carry across. "Clearing Account" refers to whichever staging account you use (dedicated Stripe Clearing or Undeposited Funds — see above).

Stripe reporting_category Stripe source object NetSuite record type Debit account Credit account Linking field
charge Charge / PaymentIntent Customer Payment (or Cash Sale) Clearing Account Accounts Receivable ch_xxx
payout Payout Bank Deposit Bank Account Clearing Account po_xxx
fee BalanceTransaction (fee component) Deposit line (Cash Back) or JE Stripe Processing Fees (expense) Clearing Account txn_xxx
refund Refund Credit Memo + Customer Refund Accounts Receivable Clearing Account re_xxx
dispute Dispute Journal Entry (chargeback debit) Chargeback Receivable or AR Clearing Account dp_xxx
dispute_reversal Dispute (won) Journal Entry (reversal) Clearing Account Chargeback Expense dp_xxx
partial_capture_reversal Charge (partial capture) Adjustment JE Clearing Account Clearing Account ch_xxx

How do I record Stripe charges and payments in NetSuite?

When Stripe captures a payment, it creates a charge object and a balance transaction with reporting_category=charge. In NetSuite, record a Customer Payment against the open invoice, debiting your clearing account and crediting Accounts Receivable. For Cash Sale workflows, the Cash Sale itself debits the clearing account and credits Revenue.

Store the Stripe charge ID (ch_xxx) on the NetSuite transaction. This is what lets you trace from the bank statement back through the deposit to the original payment.

How do I record Stripe payouts as bank deposits in NetSuite?

Each automatic payout corresponds to a single bank transfer. Create a Bank Deposit in NetSuite that selects the relevant Customer Payments, refunds, and fee adjustments from your clearing account and moves the net amount to your bank account.

The deposit total should equal the payout amount shown in Stripe. Store the Stripe payout ID (po_xxx) on the Bank Deposit record. When the deposit clears your bank, it will match during bank reconciliation.

How do I record Stripe processing fees in NetSuite?

Stripe deducts processing fees from your balance at the time of each charge. In the payout reconciliation report, fees appear as negative line items within the payout batch.

The cleanest NetSuite treatment is to record fees as "Cash Back" or "Other Deposit" negative line items on the Bank Deposit record, debiting your Stripe Processing Fees expense account. This keeps gross payments − fees = net payout visible on a single record.

When Stripe refunds a fee (for example, when a charge is refunded), a fee refund balance transaction appears with reporting_category=fee. Record the fee refund as a positive adjustment line on the deposit, crediting the expense account.

Note: fee data in the dedicated fees report lags by 96 hours. Rely on the payout reconciliation report for real-time fee amounts.

How do I record Stripe refunds in NetSuite?

A Stripe refund creates a balance transaction with reporting_category=refund and a negative impact on your Stripe balance. In NetSuite:

  1. Create a Credit Memo linked to the original invoice to reverse the revenue side.
  2. Apply a Customer Refund (or Cash Refund) to reverse the cash side. The refund reduces your clearing account balance and reduces the outstanding AR. The exact account credited depends on whether you push refunds through your clearing account or directly through the bank — match whichever pattern your original payment followed.

The refund will appear as a negative item in the next payout batch, reducing the deposit amount. Link the Stripe refund ID (re_xxx) to the NetSuite Credit Memo for traceability. Do not directly adjust revenue without a linked Credit Memo.

What journal entries are required for Stripe chargebacks in NetSuite?

When a cardholder disputes a charge, Stripe immediately debits two amounts from your balance: the disputed payment amount and a dispute fee (typically $15). These are separate balance transactions.

Recording the initial dispute: Create a journal entry debiting Chargeback Receivable for the disputed amount and Dispute Fee Expense for the fee, crediting your clearing account for the total.

If you win the dispute: Stripe credits back the disputed amount (and sometimes the fee). Record a reversal journal entry.

If you lose the dispute: Write off the Chargeback Receivable to Chargeback Expense.

Store the Stripe dispute ID (dp_xxx) on all related journal entries. Failure to record disputes as separate journal entries causes AR overstatement in your clearing account.

What about partial capture reversals and other adjustments?

A partial capture reversal (reporting_category=partial_capture_reversal) is not a refund — it is the release of uncaptured authorization funds. Do not create a Credit Memo for partial capture reversals. Instead, adjust the original payment amount in NetSuite with a journal entry.

Other adjustment categories include Stripe-initiated balance corrections and Connect-related transfers. When you encounter an unfamiliar reporting_category, check Stripe's reporting categories documentation before creating a mapping. Mislabeling an adjustment as a refund will cause both your revenue and refund metrics to be wrong.

Worked example: reconciling a single Stripe payout end-to-end

Stripe's payout reconciliation report shows payout po_abc123 for a net deposit of $4,340.00 on January 17:

Line Type Stripe ID Gross Fee Net
1 charge ch_001 $2,500.00 −$72.50 $2,427.50
2 charge ch_002 $1,800.00 −$52.20 $1,747.80
3 charge ch_003 $900.00 −$26.10 $873.90
4 refund re_004 −$200.00 +$5.80 −$194.20
5 dispute fee dp_005 −$15.00 −$15.00
6 dispute dp_005 −$500.00 −$500.00
Payout total po_abc123 $4,340.00

Step 1: Record payments

Create three Customer Payments in NetSuite for ch_001, ch_002, and ch_003. Each debits the clearing account and credits AR. Store the charge IDs as external references.

Step 2: Record the refund

Create a Credit Memo and Customer Refund for re_004 ($200.00), linked to the original invoice. The refund posts a net −$194.20 to the clearing account after the $5.80 fee refund.

Step 3: Record the dispute

Create a journal entry debiting Chargeback Receivable $500.00 and Dispute Fee Expense $15.00, crediting the clearing account $515.00. Tag with dp_005.

Step 4: Create the Bank Deposit

Create a Bank Deposit in NetSuite selecting the three payments, the refund, and the dispute-related items from the clearing account. Add fee lines as Cash Back items:

  • Processing fees: $72.50 + $52.20 + $26.10 = $150.80
  • Dispute fee: $15.00
  • Fee refund (credit): −$5.80
  • Net fees: $160.00

The deposit total: $5,200.00 gross charges − $200.00 refund − $500.00 dispute − $160.00 net fees = $4,340.00, matching po_abc123.

Step 5: Bank reconciliation

When the $4,340.00 deposit appears on your bank statement, match it to the Bank Deposit in NetSuite's bank reconciliation. Three-way match complete.

Why don't Stripe and NetSuite match at month-end?

Pending vs. available timing

A charge captured on January 14 may not become available until January 16, may not appear in a payout until January 17, and the bank deposit may not clear until January 18. Your NetSuite Customer Payment might be dated January 14, while the Bank Deposit is dated January 17 or 18.

The payout reconciliation report's "ending balance reconciliation" section shows transactions that have occurred but not yet settled into a payout. Use this section at month-end to explain why your Stripe clearing account balance in NetSuite does not equal zero.

FX differences

If you charge in one currency but settle in another (e.g., EUR charges settled in USD), Stripe converts at the time of settlement. The exchange rate Stripe applies may differ from the rate in NetSuite on the transaction date. Record the Customer Payment in the transaction currency and let the Bank Deposit handle the conversion to your base currency. Review FX gains and losses monthly.

Negative balances and reserves

A surge of refunds or disputes can push your Stripe balance negative. When this happens, Stripe may reduce or skip a payout until the balance recovers. In NetSuite, a negative Stripe clearing account balance means you have recorded payments that have not yet (and may not) result in a bank deposit.

If Stripe withholds funds in a reserve, create a journal entry moving the reserved amount from your clearing account to a separate Reserve asset account.

Common Stripe-to-NetSuite reconciliation mismatches: symptoms, causes, and fixes

Symptom Likely cause Fix
Bank deposit doesn't match Stripe payout amount Fee lines missing or miscalculated on the Bank Deposit Re-pull payout reconciliation report; add missing fee or adjustment Cash Back lines
Clearing account balance doesn't zero out at month-end Transactions captured but not yet included in a payout Check Stripe's "ending balance reconciliation" section; the clearing balance should match
Clearing account balance drifts over multiple months Disputes, partial capture reversals, or connector errors not recorded Reconcile the clearing account to Stripe's reported balance; investigate each variance line
NetSuite bank reconciliation has unmatched deposits Payout ID not stored on the Bank Deposit, or deposit date doesn't match bank date Add Stripe payout ID to the deposit; adjust date to match the bank posting date
Stripe Processing Fees GL doesn't match Stripe fee total Fee refunds not recorded, or dispute fees posted to wrong account Sum all reporting_category=fee balance transactions and compare to the GL; reclassify as needed
AR shows phantom receivables that should have been cleared Won disputes never reversed in the GL Review all disputes closed in the period; confirm reversal JEs exist for each won dispute
FX gains/losses appear unexpectedly on deposits Stripe settlement rate differs from NetSuite transaction-date rate Record payments in transaction currency; review FX variances monthly and run currency revaluation

Stripe reconciliation close checklist: weekly, monthly, and audit prep

Weekly

  • Verify all payouts have matching Bank Deposits in NetSuite with correct amounts and payout IDs.
  • Review new disputes and confirm journal entries have been created.
  • Flag any negative Stripe clearing account balances.

Month-end

  • Pull the Stripe payout reconciliation report for the full month.
  • Confirm every payout is recorded as a Bank Deposit in NetSuite.
  • Reconcile the Stripe ending balance: the "ending balance reconciliation" section should equal the balance in your clearing account in NetSuite.
  • Sum all fee-related balance transactions for the month and compare to the total posted to your Stripe Processing Fees expense account.
  • Complete NetSuite bank reconciliation, matching all Stripe deposits on your bank statement to Bank Deposit records.
  • Lock the period to prevent backdated changes.

Audit prep

  • Provide the Stripe balance summary report alongside the GL trial balance for your clearing account and processing fees account. Ending balances should agree, with a schedule explaining timing differences.
  • Confirm every NetSuite transaction touching Stripe carries the Stripe object ID (charge, refund, dispute, or payout). Auditors will sample transactions and trace from the bank statement → Bank Deposit → Customer Payment → Stripe charge.
  • Designate Stripe's payout reconciliation report as the source of truth for payment activity and NetSuite as the source of truth for the GL. Attach the payout report as a PDF or CSV on the corresponding NetSuite Bank Deposit record.

DIY reconciliation vs. connector-style single-deposit-per-payout: which workflow to use?

There are two primary approaches to getting Stripe data into NetSuite, and understanding the difference helps you decide what to build (or buy).

DIY with Stripe reports. You export Stripe's payout reconciliation report, manually (or via script) create Customer Payments, Credit Memos, dispute JEs, and Bank Deposits in NetSuite, and reconcile the totals yourself. This gives you full control over account mapping and timing, and works at any transaction volume — but the manual effort scales linearly and errors compound at month-end.

Connector-style automation (single deposit per payout). A connector or integration layer listens for Stripe payout events and automatically creates a single Bank Deposit in NetSuite for each payout. Fees and fee refunds are recorded as Cash Back and Other Deposit line items on that deposit. Dispute fees and reversals are recorded as additional offset lines. The connector verifies that the deposit total matches the Stripe payout amount and that the transaction date aligns with the bank; if there's a mismatch, it flags an exception rather than silently posting an incorrect entry.

The single-deposit-per-payout model is the same pattern used by Stripe's own NetSuite connector and by most purpose-built integrations. Whether you build this yourself, use a connector, or use a platform like LedgerUp, the underlying mechanics are the same: one payout = one deposit, with fees, refunds, and disputes itemized as line items.

When should you automate Stripe-to-NetSuite reconciliation?

If your reconciliation process includes manual payout batching, hand-keyed journal entries for disputes, or spreadsheet-based fee rollups, you are at elevated risk for:

  • Missed dispute reversals — won disputes that never get reversed in the GL, leaving phantom receivables on your balance sheet.
  • FX misstatements — settlement rate vs. invoice rate differences that compound silently across hundreds of transactions.
  • Clearing account drift — the Stripe clearing account balance creeping away from the actual Stripe balance, with no one investigating until month-end.
  • Audit traceability gaps — transactions missing Stripe IDs that force hours of manual reconstruction during audit sampling.

Consider automation when transaction volume exceeds a few hundred per month, close takes more than a day of dedicated reconciliation work, or any of the risks above are showing up in your process.

Good automation handles four things reliably:

Payout-to-deposit creation. Each Stripe payout automatically generates a NetSuite Bank Deposit with the correct component payments, refunds, and adjustment lines — one deposit per payout.

Fee line itemization. Fees appear as individual lines on the deposit debiting the correct expense account. Automation that lumps fees into a single unexplained adjustment is worse than manual entry.

Dispute handling. New disputes create journal entries automatically with the dispute ID linked. Won and lost outcomes trigger reversal or write-off JEs.

Exception queues. When amounts don't match, a customer record is missing, or a payout contains an unrecognized reporting_category, the system flags the transaction for human review rather than silently creating an incorrect entry.

How LedgerUp automates Stripe + NetSuite reconciliation

For B2B SaaS companies, payment reconciliation is just one piece of the contract-to-cash workflow. LedgerUp automates the full lifecycle — from contract signing through invoicing, collections, payment reconciliation, and revenue recognition — with native Stripe and NetSuite integrations.

LedgerUp handles payout-to-deposit matching, individual fee line itemization, dispute journal entries with automatic reversal on resolution, and FX conversion. The exception queue surfaces unmatched transactions in Slack for real-time resolution rather than month-end firefighting.

Teams typically automate 90–95% of reconciliation workflows and deploy in 1–2 weeks.

FAQ

How long does it take for a Stripe charge to appear as a bank deposit?

Typically 2–4 business days in the US. A charge moves from pending to available after Stripe's settlement window (usually 2 business days), then gets included in the next automatic payout, which takes another 1–2 days to clear your bank.

Should I use a dedicated Stripe clearing account or Undeposited Funds in NetSuite?

A dedicated Stripe Clearing account (Other Current Asset) is recommended if you want a clean audit tie-out — its balance should match Stripe's reported balance at any point. Undeposited Funds works if Stripe is your only payment source, but it comingles Stripe activity with other payment methods. Either way, never post Stripe payments directly to the bank account.

How do I handle Stripe fees on refunded charges?

When a charge is refunded, Stripe also refunds the processing fee. This fee refund appears as a balance transaction with reporting_category=fee. Record it as a positive adjustment line on your Bank Deposit in NetSuite, crediting the Stripe Processing Fees expense account.

What happens if my Stripe balance goes negative?

Stripe may reduce or skip payouts until the balance recovers. In NetSuite, flag negative clearing account balances during weekly reviews. If Stripe withholds funds in a reserve, create a journal entry to move the reserved amount to a separate Reserve asset account.

Why doesn't the Stripe fees report match my balance transactions?

The fees report has a 96-hour lag and excludes certain fee types (Terminal device purchases, Stripe Capital fees, Atlas fees, post-paid invoiced fees). Use balance transactions as your source of truth for fees.

Should I reconcile at payout level or transaction level?

Use payout-level if automatic payouts are enabled. Use transaction-level only if you use manual or instant payouts. Payout-level is significantly simpler and less error-prone.

Why is Stripe's type field wrong for accounting mapping?

Because type=adjustment combines disputes, dispute reversals, failed refunds, and manual corrections into one category. Use reporting_category instead — it separates these into distinct categories that each require different GL treatment.

Should I build my own Stripe-to-NetSuite integration or use a connector?

If you process fewer than a few hundred Stripe transactions per month, DIY with Stripe's payout reconciliation report is manageable. Beyond that, a connector or platform that automates the single-deposit-per-payout pattern saves significant time and reduces the risk of clearing account drift, missed dispute reversals, and fee misstatements.

LedgerUp is an AI-powered contract-to-cash platform that automates billing, invoicing, collections, and payment reconciliation for B2B SaaS companies with complex billing needs.

Book a LedgerUp Demo today

GET STARTED

Smart billing starts here

See how LedgerUp brings your billing and revenue systems into one place so you can remove busywork and focus on growth.
Book a demo

Ready to take manual work out of billing and revenue workflows?

See how LedgerUp brings your billing and revenue systems into one place so you can remove busywork and focus on growth.