Skip to main content

Plaid vs. Stripe: which side of reconciliation are you actually looking at?

Plaid is the bank side: read-only transaction data from the account the money actually lands in. Stripe is the processor side: the system that generated the payment. They aren't two views of the same event that should match directly — both reconcile against a common bank statement line, and disagreeing is normal until that line is found.

Zuny FesterBy Zuny Fester, Head of Operations and Marketing
Reviewed by Zuny Fester
Published Last reviewed Editorial policy

Part of the finance integrations guide.

Plaid's roleRead-only aggregator of bank account transaction and balance data
Stripe's rolePayment processor — issues charges, invoices, and payouts
What Plaid showsWhat actually posted to the bank account, via /transactions/sync
What Stripe showsWhat was charged and why, netted into a payout on its own schedule
Where they meetThe single bank deposit line a Stripe payout settles as — not each other's records directly

Two different kinds of system, not two competing sources of truth

Loopfour's Plaid integration is read-only: it uses /transactions/sync to report what a connected bank account's data actually shows, with no ability to initiate a payment. Loopfour's Stripe integration is the opposite kind of system — it can create invoices, run subscriptions, and process charges, but has no independent view of the bank account those payments eventually settle into. Neither is more authoritative than the other about the same fact; they're authoritative about different facts. Plaid knows what happened at the bank. Stripe knows what happened at the payment processor. A transaction that's real doesn't appear identically in both — it appears as a Stripe charge/payout record on one side, and as a bank deposit line on the other.

Why they shouldn't be expected to match each other directly

A Stripe payout typically nets many individual charges, fees, and refunds into a single bank deposit, on a schedule that runs a few business days behind the underlying charges. Plaid's feed for that same bank account shows exactly one deposit line for the whole netted amount — it has no visibility into the individual charges that made it up, because those never touched the bank directly. Trying to match Stripe's per-charge records against Plaid's per-deposit-line records one-to-one will fail by design, because they're not describing the same unit of activity.

What actually reconciles

The real reconciliation is three-way, even when only two integrations are involved: Stripe's payout record (the netted total and its constituent charges/fees), Plaid's bank deposit line (the amount and date that actually posted), and the accounting system's own record of what was expected. Stripe tells you what the deposit should unpack into. Plaid confirms the deposit itself happened, for the amount and on the date Stripe's payout record says it should have. Neither one, on its own, proves the other is right or wrong — together, they confirm the same money moved through both systems as expected.

Next step

Map the finance workflow with the most exposure and prove the automation path.

Bring the invoice, contract, payment reconciliation, or customer finance workflow you have to defend at audit. Loopfour can map the trigger, controls, integrations, and approval loop.

Book a workflow review

Field mapping

What each side actually knows about the same $4,850 deposit

QuestionStripe's answerPlaid's answer
What made up this amount?12 charges, 2 refunds, processing fees — itemizedNo visibility — sees one deposit line
Did it actually land in the bank?Reports payout as 'paid' on Stripe's sideConfirms the posted transaction, amount, and date
What happens if the bank rejects or delays it?Stripe's payout status may lag behind actual bank stateThe authoritative record of what actually posted

Frequently Asked Questions

Neither is automatically right — they're describing different things. Plaid is authoritative about what posted to the bank; Stripe is authoritative about what the payout should unpack into. A real discrepancy shows up as the bank deposit (Plaid) not matching the payout total Stripe says should have arrived, not as their individual records failing to line up one-to-one.

You can, but you'd be trusting Stripe's record of its own side rather than confirming the money actually landed — Stripe's payout status can occasionally lag or misreport actual bank-side state, which is exactly what a bank feed is positioned to catch independently.

Yes — Airwallex is a payment processor like Stripe, not a bank-data aggregator like Plaid, and the same three-way reconciliation logic (processor record, bank record, accounting record) applies.

Sources

Related

Integration

Why don't my Stripe payouts tie to the NetSuite bank deposit?

A Stripe payout rarely equals one NetSuite deposit line: Stripe nets many charges, fees, and refunds into one transfer settled days later. Check, in order: the payout isn't unbundled into individual charges, the deposit date doesn't match the transaction date, fees are netted not booked separately, a partial capture created a variance, or the payout is still in Undeposited Funds.

Read more

Topic

Integrations

Every finance automation vendor publishes an integrations page: a grid of logos, a claim of "seamless" connectivity, and not much else. That page answers a marketing question — does this vendor touch…

Read more

Diagnostic

What breaks when a reconciled Plaid transaction changes to modified or removed?

Plaid transaction data isn't immutable. A pending transaction can be removed from the feed entirely and replaced by a different transaction once it posts, and a bank can remove a transaction outright. If a payment was already matched to the old transaction, that match is orphaned the moment the removal comes through, and the replacement has to be found and re-matched — it doesn't update in place.

Read more

How-to

How do I set up Plaid /transactions/sync for bank feed reconciliation?

Call /transactions/sync with a null cursor the first time for an Item, store the next_cursor it returns, and pass that cursor back on every later call to fetch only what changed. Loop while has_more is true, and process the added, modified, and removed arrays as three distinct kinds of change — not as one undifferentiated transaction list.

Read more