§00Payments reconciliation
Every payment matched. Every payout explained.
Stripe pays out net of fees, refunds and disputes. Your ERP needs each payment against its invoice and each deposit explained to the cent. PartnerMCP builds the matching — and holds what it can’t match for a person instead of guessing.
Explained
- Payments12 charges
- 48,210.00
- Stripe feesBalanceTransaction.fee
- −1,412.33
- Refunds1 refund
- −640.00
- Dispute1 dispute
- −395.00
- Net payout = bank deposit
- 45,762.67
Matched to invoices · 4 of 12
- pi_…4821 → IN-24817exact reference4,800.00
- pi_…4822 → IN-24822customer + amount1,250.00
- pi_…4830 → IN-24829held · partial · 620 of 1,240620.00
- pi_…4833 → —held · no open invoice2,100.00
Payment events don’t balance the books on their own.
Closing invoices and explaining deposits are two different jobs, on two different clocks. PartnerMCP does both.
Invoice clock
Did the customer pay?
- payment_intent.succeededStripe says the customer paid
- receiptposted against the open invoice
- invoice closedin the ERP
Bank clock
What reached the bank?
- BalanceTransactionfee · net · available_on
- payout.paidnet of fees, refunds and disputes
- deposit matchedto the cent, line by line
One charge, two clocks. Payment events can close an invoice; only the payout’s balance transactions explain the deposit — so PartnerMCP reads both.
Rules you can read. A person when it isn’t sure.
Matching is written into the integration as explicit rules, in order — and anything that doesn’t meet them waits for review.
01Exact reference
The invoice reference travels with the payment — a Stripe invoice, or the number your checkout passed along. An exact match posts the receipt.
02Customer and amount
No reference? The same customer, the same amount and one open invoice in the window: a match, with its confidence and reason recorded.
03Everything else waits
Partial and over-payments, one payment for several invoices, no open invoice at all: held for a person, with the likely candidates ranked. It never guesses with money.
- Payment succeeded — Stripe: Trigger · webhooks
- Invoice match — PartnerMCP: Invoice ⇄ AINVOICES
- Amounts & fees — PartnerMCP: currency · fees · partials
- Post receipt — Priority ERP: TINVOICES
- Close invoice — Priority ERP: AINVOICES
- Reconcile payouts — PartnerMCP: payouts · fees · refunds
- Exceptions — PartnerMCP: unmatched → review queue
- Mark reconciled — Stripe: PaymentIntent
Every Stripe event, handled.
What PartnerMCP does when each event arrives — and what it does when one arrives twice, late, or not at all.
- payment_intent.succeeded
- Match the payment to its open invoice and post the receipt.
- invoice.paid
- Close the matching invoice in the ERP.
- charge.refunded
- Record the refund against the original invoice — held for review if that invoice is already closed.
- charge.dispute.created
- Hold the receipt and flag the customer for finance.
- payout.paid
- Reconcile the payout: every balance transaction to its receipt, fee or refund, until the total equals the deposit.
Delivery, the way Stripe really sends it
- Stripe retries a delivery for up to three days in live mode and doesn't guarantee order, so the same event can arrive twice or late. PartnerMCP de-duplicates on the event ID and checks for a receipt it already posted.
- Every delivery is verified against its
Stripe-Signatureheader before it is trusted. - Anything a delivery missed is caught by listing recent objects with Stripe's cursor pagination.
On the ERP side
Priority ERP
Receipts applied to open sales invoices (
AINVOICES). The receipts form,TINVOICES, comes from real installations rather than Priority's published docs — verified on your tenant first.Oracle NetSuite
A
customerPaymentapplied to the openinvoice, through SuiteTalk REST — within the account's shared concurrency.
Questions
Does PartnerMCP move money?
No. In this flow it reads payments and payouts from Stripe and posts accounting records in your ERP. It doesn ’t issue refunds or payouts — and where Stripe’s own MCP server is involved, Stripe requires a person to confirm refunds and outbound payments anyway.
What happens to a payment it can’t match?
It waits in a review queue with the likely invoices ranked and the reason it wasn’t matched. A person decides; the decision is recorded with the payment.
How are fees and refunds posted?
Each balance transaction carries its fee and net amount, so fees and refunds are posted as their own lines, to the accounts your finance team chooses when the integration is set up.
Which ERPs does this work with?
Any ERP with an API. The worked examples are Priority ERP receipts and NetSuite customer payments; the same rules apply to SAP, Dynamics 365 and others.
Is this only for Stripe?
Stripe is the worked example. The same approach — events to close invoices, settlement data to explain deposits — applies to other payment providers with an API, such as PayPal.
§05Build
Every payout, explained in your ERP.
Describe how payments should land in your ERP. PartnerMCP shows the matching rules and the plan before anything is built.