A Stripe payout that does not match your sales records is usually being compared at the wrong level. The payout is a net settlement batch. Your sales report is often a gross activity report. Before changing a formula or searching individual orders, prove that the payout, period, and records belong to the same comparison.
Start with the payout event itself. Record its payout ID, amount, currency, status, expected arrival date, and the bank deposit it produced. Then open the transaction detail for that specific payout. Do not begin with the total sales figure for the day or month.
This first distinction narrows the failure quickly:
| Symptom | Likely class | First check | Carry or correct |
|---|---|---|---|
| Payout equals the bank deposit but not sales | Fees, refunds, disputes, or net-versus-gross treatment | Payout transaction detail | Explain or correct the books |
| Payout is lower than expected and recent sales are absent | Timing or cutoff | Transaction availability and payout status | Carry to a later payout |
| One order cannot be found in the payout | Reference mismatch or wrong batch | Charge or payment ID | Correct the match or inspect another payout |
| Payout contains the right activity but the total is still wrong | Duplicate, adjustment, or currency issue | Transaction types and currency | Correct or escalate |
| Sales report and payout cover different dates | Scope or filter error | Report range and timezone | Rerun with aligned scope |
| Current export differs from an earlier export | Edited or changed source file | Row count, dates, totals, and duplicate keys | Re-export and rebuild the baseline |
The correct investigation order is not “check every transaction.” It is to eliminate whole classes of causes before moving to row-level work.
1. Confirm the payout and bank deposit are the same event
The first number to prove is the net Stripe payout against the cash that reached the bank. This establishes whether Stripe-to-bank is correct before sales records enter the comparison.
Capture these fields:
| Stripe payout field | Bank field | Expected relationship |
|---|---|---|
| Payout amount | Deposit amount | Same, unless the bank applies a separate charge or conversion |
| Arrival date | Posting date | Same or within the bank's processing window |
| Payout ID or descriptor | Bank reference or description | Enough detail to connect the events |
| Currency | Account currency | Same, unless conversion occurred |
| Status | Posted or pending state | A paid payout should correspond to a posted deposit |
If the payout and bank deposit agree, the cash event is sound. The remaining mismatch sits between the sales records and the contents of the payout.
If they do not agree, stop comparing sales. Check whether two payouts were grouped into one bank deposit, one payout was split, the bank converted the currency, or the deposit is still pending. The full Stripe payout-to-bank matching workflow covers that separate layer.
Do not force gross sales to equal the bank line. Gross sales are upstream of fees, refunds, disputes, reserves, and settlement timing.
2. Open the transaction detail for the exact payout ID
Once the bank event is confirmed, use the payout ID as the comparison boundary. A date range is weaker evidence because activity created on one day can become available and settle on another.
The payout detail should identify every balance transaction included in the batch. Depending on the account activity, that can include:
- Charges
- Refunds
- Disputes
- Processing fees
- Adjustments
- Transfers
- Reserve movements
Add the net effect of those rows. It should equal the payout amount.
For example:
| Activity | Gross effect | Fee | Net effect |
|---|---|---|---|
| Charges | $12,400 | -$372 | $12,028 |
| Refunds | -$650 | $0 | -$650 |
| Dispute | -$180 | $0 | -$180 |
| Adjustment | $25 | $0 | $25 |
| Payout total | $11,223 |
A sales report showing $12,400 is not evidence that the $11,223 payout is wrong. It shows that the report contains gross charges while the payout contains the net effect of all eligible activity.
This is the first place to look when a Stripe payout doesn't match sales records. If the batch arithmetic works, Stripe has already explained the payout total. Your next task is to prove which parts of that explanation are present in the sales records or ledger.
3. Search by transaction ID before amount or date
Use the strongest identifier available. For Stripe activity, that is normally a charge ID, payment intent ID, balance transaction ID, refund ID, or another unique reference carried into your order or ledger export.
Search in this order:
- Exact unique transaction reference
- Exact amount and exact date
- Exact amount across nearby dates
- Surrounding orders or sequence gaps
- Split totals, duplicate rows, and excluded records
- Wrong report, period, account, or file version
Normalize the reference before declaring it missing. Remove leading or trailing spaces. Confirm that the sales export did not truncate the ID, convert a long value, prepend an apostrophe, or store one identifier while Stripe exposes another.
In a working helper column before the search:
=TRIM(SUBSTITUTE(UPPER(A2),CHAR(160)," "))Column A is the reference column — charge ID, payment intent ID, or balance transaction ID. TRIM removes standard spaces; CHAR(160) covers the non-breaking space some exports add. UPPER removes case differences. If the export adds a prefix like pi_ or an apostrophe, strip it with a nested SUBSTITUTE before comparing.
One Shopify order number, for example, is not automatically the same as a Stripe charge ID. If the sales system stores an order ID and Stripe stores a payment reference, you need the field that connects them. Matching unrelated identifiers produces a list of false exceptions.
When the exact ID exists in both files, compare the amount, currency, and transaction type. When it exists only in Stripe, determine whether the sales export excluded that row. When it exists only in sales, find whether it settled in a different payout.
4. Separate fees, refunds, disputes, and adjustments
Most payout-versus-sales differences are not one missing sale. They are a collection of transaction types that the sales total does not include.
Build a bridge from gross sales to net payout:
| Bridge item | Treatment |
|---|---|
| Gross charges included in the payout | Starting point |
| Processing fees | Subtract |
| Refunds | Subtract |
| Disputes or chargebacks | Subtract |
| Positive adjustments | Add |
| Negative adjustments or reserve movements | Subtract |
| Net payout | Expected result |
Keep each category separate. A single “difference” line hides whether the amount is expected or requires correction.
Refunds need particular care. A refund processed this week may relate to a sale from last month. It can reduce the current payout without reducing the current-period sales report. Disputes can arrive even later. That is a timing relationship between two business events, not evidence that the payout omitted sales.
Fees also create a predictable gap. If sales records show gross revenue while the books record only net cash, both revenue and fee expense can be misstated even though the bank deposit is correct.
5. Check settlement timing, cutoff, and transaction status
Stripe does not pay out every sale according to the sale date. A charge moves through creation, payment, availability, payout creation, and bank posting. Those dates can cross reporting periods.
For every sale that appears missing, compare:
| Field | What it proves |
|---|---|
| Charge creation date | When the customer payment was created |
| Payment status | Whether the payment completed |
| Available date | When the balance became eligible for payout |
| Payout ID | Which settlement batch received it |
| Payout arrival date | When cash was expected at the bank |
A completed sale outside the payout is often in a later batch because it was not yet available at the cutoff. A pending or failed payment should not be treated as payout activity. A payout date also should not be used as the sales date.
Timing items are carried. They remain on the open list until the later payout settles them. They are not corrected with a journal entry merely to make the current payout equal the current sales report.
Errors are handled differently. A missing ledger entry, duplicate sale, wrong amount, wrong currency, or misposted account needs correction or escalation now.
6. Test grouped amounts, duplicates, scope, and file integrity
If the mismatch survives the first five checks, widen the investigation carefully. Do not abandon the payout boundary.
First test whether one side is grouped differently. One payout row can represent many charges. One order can also be split across several payments, partially refunded, or settled in more than one currency. Search for combinations of rows that equal the unexplained amount.
Then check duplicates. Compare the count of unique references with the total row count. A duplicate can make the sales file higher than Stripe even when every legitimate sale is present.
Finally, verify the comparison baseline:
| Integrity check | Stripe payout file | Sales records |
|---|---|---|
| Row count | Confirm | Confirm |
| Unique reference count | Confirm | Confirm |
| Blank reference count | Confirm | Confirm |
| Duplicate reference count | Confirm | Confirm |
| Earliest and latest date | Confirm | Confirm |
| Gross or net total | Confirm | Confirm |
| Currency and account | Confirm | Confirm |
Check filters and export settings. Confirm that both files cover the intended account, currency, payment status, and period. If either file was opened, edited, re-saved, or re-exported during the investigation, obtain a fresh export and repeat the integrity checks. Repairing an uncertain source file in place leaves you with a result you cannot defend.
Turn the mismatch into a reconciliation result
The investigation is complete when every difference has a status and an action. “Stripe does not match sales” is not a usable result.
Your report should separate:
| Status | Meaning | Action |
|---|---|---|
| Matched | Transaction and amount agree | None |
| Fee or adjustment | Expected bridge from gross to net | Record or explain |
| Timing | Valid activity belongs to another payout or period | Carry forward |
| Missing from sales records | Stripe activity has no corresponding sale or ledger row | Investigate and correct |
| Missing from payout | Sale is valid but has not settled in this batch | Locate later payout |
| Duplicate | Same business event appears more than once | Remove or reverse the duplicate |
| Unresolved | Evidence is insufficient | Escalate with IDs, dates, and amounts |
Keep the payout summary, gross-to-net bridge, matched rows, and exception list together. That gives the reviewer a direct line from the bank deposit back to the underlying sales activity. If the mismatch also affects the close, use the same evidence to work through the month-end books-versus-bank checks without combining timing items and posting errors.
The clean stopping point is a payout that agrees to the bank, a batch that adds to the payout, and a sales bridge in which every remaining difference is classified as timing, an expected deduction, or a specific error requiring action.
