Stripe marketplace payout files do not behave like a normal Stripe payout export because the cash movement belongs to the platform while the activity belongs to multiple connected accounts. One bank deposit can be tied to dozens of sellers, fees, refunds, reversals, transfers, and timing differences.

That is where the account ledger spreadsheet starts to drift.

The payout file says money moved out of Stripe. The ledger says which seller or internal account should receive credit. Those two files answer different questions, so a row-by-row comparison will produce false mismatches even when both files are correct.

The reconciliation has to prove three things:

  • Which connected account created each payout movement
  • Which ledger account owns that movement internally
  • Which differences are expected because of fees, refunds, reserves, or timing

Matching Stripe marketplace payout files against account ledger spreadsheets is not a search for one shared ID. It is a layered match from payout to connected account to ledger account, with exceptions separated before the final report is trusted.

Start by Separating the Payout File From the Ledger File

A Stripe marketplace payout file usually contains movement data. It tells you what Stripe paid out, reversed, adjusted, or held. An internal account ledger usually contains ownership data. It tells you which seller, vendor, sub-account, wallet, or internal balance should receive the money.

Those files overlap, but they are not substitutes for each other.

Stripe payout file fieldInternal ledger fieldWhat it proves
payout_idPayout batch referenceWhich payout batch the row belongs to
connected_account_idSeller account ID / vendor IDWhich account owns the activity
balance_transaction_idTransaction referenceWhich Stripe movement created the row
amountGross or payable amountThe value before or after deductions
feePlatform fee / processor feeThe deduction applied to the movement
netNet settlementThe cash effect after fees
available_onExpected settlement dateWhen cash became available
typeLedger transaction typeWhether the row is a charge, refund, transfer, fee, adjustment, or reserve

The first mistake is treating amount in both files as the same kind of amount. It might not be.

In the Stripe file, amount may describe the gross charge, the transfer to a connected account, a negative refund, or a payout movement. In the ledger, the amount may describe seller payable, platform revenue, net cash, or internal balance change. The numbers can be related without being equal.

Before matching anything, label the amount basis in both files: gross charge, platform fee, processor fee, connected account transfer, payout net, refund, reversal, reserve, or hold. If the amount basis is unclear, the match will look wrong later. You will compare a seller payable amount to a net payout amount and call the difference unexplained, even though the difference is the platform fee or processor fee.

Build the Match Around the Connected Account

The connected account is the control point. The bank line can confirm that Stripe paid money out, but it cannot prove which sellers were included in that payout or whether each seller's ledger balance is correct.

Use this order of matching evidence:

Match layerStripe sideLedger sidePurpose
Payout batchpayout_id or payout dateBatch ID or settlement runGroups rows into the same cash movement
Connected accountconnected_account_idSeller/vendor/account IDAssigns each row to the right owner
Transaction referencebalance_transaction_id, charge ID, transfer IDPayment, order, or ledger referenceProves row-level identity
Amount basisGross, fee, net, transferPayable, fee, revenue, cashPrevents wrong amount comparisons
Date windowcreated, available_on, payout dateTransaction date, ledger date, settlement dateSeparates timing differences from missing rows

Do not start with the payout amount. It is too aggregated.

Start with the connected account. Then group the Stripe rows for that account. Then compare those rows to the account ledger. After each account ties out, roll the results back up to the payout batch.

That order keeps the reconciliation readable. If the platform payout is short by 3,842.18, you want to know that connected account acct_72K has two missing refund rows, connected account acct_91P has a reserve hold, and the remaining payout batch is clean.

For a standard payout-to-bank workflow, the adjacent problem is matching a Stripe payout CSV to your bank statement. Marketplace payout work adds another layer because the payout has to tie back to account ownership, not only to cash received.

Normalize the Two Files Without Rewriting the Source

Do not edit the source exports. Make working columns beside them.

The working columns should make the two files comparable while preserving the raw values that came from Stripe and from the internal ledger.

Working columnStripe sourceLedger sourceWhy it matters
normalized_account_idconnected_account_idSeller ID, vendor ID, wallet IDAligns account naming
normalized_referenceCharge, transfer, or balance transaction IDOrder ID, payment ref, ledger refCreates row-level match candidates
signed_amountAmount, fee, net with sign preservedDebit or credit amount with sign alignedPrevents debit-credit reversals
amount_basisType and reporting categoryLedger account or transaction typeStops gross-to-net confusion
settlement_windowCreated, available, payout datePosting or settlement dateControls timing differences
currencyCurrency columnLedger currencyBlocks cross-currency false matches

For normalized_reference, the core formula is:

Formula
=TRIM(SUBSTITUTE(UPPER(A2),CHAR(160)," "))

Column A is the reference field — balance transaction ID, charge ID, transfer ID, or internal ledger reference. TRIM removes standard spaces; CHAR(160) covers the non-breaking space some systems export. If the ledger stores only a fragment of the Stripe reference, extract with MID or RIGHT before normalizing.

The most important helper is amount_basis.

Without it, a lookup can return a match that is mathematically close but conceptually wrong. A 100.00 transfer to a seller and a 100.00 gross customer charge are not the same record. Exact values do not prove identity when the transaction types differ.

The same rule applies to signs. Stripe may export refunds, reversals, and fees as negative values. The ledger may store the same economic movement as a debit in one column or a positive number in an expense column. Normalize the sign for comparison, but keep the raw sign visible in the report.

Match Each Connected Account Before You Match the Whole Payout

The clean workflow is account first, payout second.

Suppose the Stripe payout file contains this:

Payout IDConnected accountTypeReferenceGrossFeeNet
po_8841acct_ATransfertr_1001500.00-20.00480.00
po_8841acct_ARefundre_1008-75.000.00-75.00
po_8841acct_BTransfertr_1002900.00-36.00864.00
po_8841acct_CReserve holdadj_4421-120.000.00-120.00

The internal ledger might show this:

Ledger accountReferenceAccount movementPlatform feeSettlement status
Seller Atr_1001480.0020.00Settled
Seller Are_1008-75.000.00Refunded
Seller Btr_1002864.0036.00Settled
Seller Cadj_44210.000.00Held

If you compare the payout total first, the reserve hold looks like a missing payment. If you compare each connected account first, Seller C is not missing. The ledger has classified the row as held instead of settled.

That distinction changes the final answer.

The report should not say:

Seller C is short by 120.00.

It should say:

Seller C has a 120.00 reserve hold in Stripe that is not payable in the current ledger settlement.

That is a usable reconciliation note. It tells the operator what happened and what to do next.

Use a Candidate Match, Then a Confirmed Match

Marketplace files often do not give you one perfect key across every file. The same activity may appear as a charge ID in one export, a transfer ID in another, and an order reference in the ledger.

Use candidate matching first.

Candidate ruleWhen to use itRisk
Exact reference matchSame charge, transfer, or balance transaction ID appears in both filesLow
Connected account + reference fragmentLedger stores only part of the Stripe referenceMedium
Connected account + amount + date windowReference is missing but amount and timing alignMedium
Connected account + order ID + amountLedger tracks the order instead of Stripe movementMedium
Amount-only matchNo reliable reference existsHigh

Candidate matches are not final. They are a shortlist.

A confirmed match should pass these checks:

  1. The connected account agrees.
  2. The transaction type or amount basis agrees.
  3. The signed amount agrees after fee treatment is understood.
  4. The date sits inside the expected settlement window.
  5. The currency agrees.
  6. The row has not already been matched to another ledger entry.

This last check matters. Marketplace exports can contain repeated values. If the matching process allows one Stripe row to match two ledger rows, the reconciliation will balance on paper while hiding a duplicate.

Separate Fees, Refunds, Holds, and Timing Differences

The exception list should not be one bucket called "unmatched."

That bucket is too vague to close. It mixes real errors with expected marketplace behavior.

Use exception categories that describe the actual cause:

Exception categoryMeaningAction
Missing in ledgerStripe row exists but no ledger row existsAdd or investigate the ledger entry
Missing in Stripe fileLedger row exists but no Stripe row existsCheck date filters, export scope, or manual entry
Account mismatchReference exists but connected account differsReview seller mapping
Amount basis mismatchSame activity, different amount type comparedReclassify gross, fee, net, or payable amount
Fee differencePlatform or processor fee does not agreeCheck fee posting rules
Refund or reversal timingNegative movement relates to an earlier transactionLink to original activity
Reserve or holdStripe delayed payout rather than paying sellerCarry forward to next settlement
Date differenceSame row, different posting or payout dateMark as timing, not missing
Duplicate ledger entryOne Stripe row matches multiple ledger rowsRemove or reverse the duplicate

Refunds and reversals deserve their own treatment. A refund might belong to a charge from a prior period, but appear in the current payout. If the ledger only contains current-period orders, the refund will look unmatched. The answer is not to force the refund into the current sales list. The answer is to identify the original charge, record the refund against the right account, and show that the current payout was reduced by that refund.

Subscriptions add a related timing problem when invoices, payments, and payout settlement fall into different periods. If recurring invoices are part of the marketplace flow, the same date discipline used for Stripe subscription invoice reconciliation applies here: invoice date, payment date, available date, and payout date are separate fields.

Tie Out the Payout Batch Only After Account-Level Matching

Once each connected account is matched, roll the results into a payout summary.

The summary should answer four questions:

  1. Does the Stripe payout total agree to the bank deposit or cash movement?
  2. Does each connected account's Stripe activity agree to the internal ledger?
  3. Are fees, refunds, holds, and timing differences separated from true errors?
  4. Is the remaining unexplained difference zero?

A useful payout summary looks like this:

CategoryCountAmount
Matched connected account transfers8248,210.00
Matched platform fees82-1,928.40
Matched refunds and reversals9-1,144.20
Reserve holds carried forward3-640.00
Missing ledger entries2-318.75
Duplicate ledger entries1120.00
Unexplained difference after review00.00

The exact labels depend on your marketplace, but the structure should not change. Matched activity, expected differences, and true exceptions belong in separate lines.

The final report should also include an account-level exceptions table:

Connected accountIssueAmountEvidenceAction
acct_AMissing ledger refund-75.00Stripe refund re_1008Record refund against Seller A
acct_CReserve hold-120.00Stripe adjustment adj_4421Carry forward until released
acct_DDuplicate ledger transfer120.00Two ledger rows match tr_4410Reverse duplicate

That table is the part the operator can use. It points to rows, accounts, evidence, and actions. A highlighted spreadsheet without this structure still leaves the question open.

What a Correct Marketplace Reconciliation Proves

A finished marketplace payout reconciliation does not prove that every number in every file is identical. It proves that every difference has a correct label.

The platform payout may differ from gross marketplace sales because seller transfers, fees, refunds, disputes, reserves, and payout timing all sit between the sale and the cash movement. The connected account ledger may differ from the payout file because some rows are not payable yet, belong to prior-period transactions, or were posted under a different reference.

The correct output should say:

  • This payout batch ties to cash.
  • These connected accounts matched cleanly.
  • These rows are expected timing, reserve, refund, or fee differences.
  • These rows require ledger correction.
  • The remaining unexplained difference is zero, or it is isolated to specific rows.

That is the standard to use before closing the reconciliation.

Checklist Before You Close the File

Before the payout report is handed off, confirm the batch is identified, connected account IDs are mapped to ledger accounts, amount basis is labeled in both files, gross and net rows are not mixed, refunds and holds are separated, duplicate matches are removed, and true missing ledger rows are listed with references.

The key is the order. Account-level matching comes before payout-level comfort. If the payout total agrees but connected account balances do not, the reconciliation is not finished. If every connected account ties out but the payout batch does not agree to cash, the final cash movement still needs review.

A marketplace payout file carries too much information for one lookup formula. Treat it as a controlled reconciliation: identify the batch, map the connected accounts, match the rows, classify the expected differences, and then roll the result into a report that explains the payout instead of hiding it.