The Payment Integration Is the Easy Part

Jul 24, 2026 • 5 min read

The Payment Integration Is the Easy Part

Why multi-party payouts become problems of ledgering, reconciliation, refunds, and changing contracts.

I have been building payment systems for a long time, and there is one conversation I keep having with technical leaders. It usually starts the same way. They tell me the payments feature is mostly done, the Stripe integration works, they are maybe two weeks from launch. And I never know how to say the next part politely, so I usually just say it.

The integration is about 20 percent of the work. You are two weeks from starting.

Nobody believes me the first time. I didn't believe it either, years ago. Part of the problem is the word itself. What teams call "payments" is really several systems hiding behind one API: transaction processing, a ledger, allocation rules, payout execution, reconciliation, exception handling. The API call is just the front door.

So let me walk through where the other 80 percent lives, using scars from a platform we built that splits revenue among multiple parties. By the time we were done it supported 47 different split scenarios. Real money, real rights holders, real disputes when something was off by a dollar.

Money does not exist when you think it does

The first thing that breaks people's mental model: there is no single moment when money "arrives."

A charge succeeds. Is that money yours? Not really. It can be disputed for months. It settles days later, minus fees, and adjustments, disputes and currency corrections can land long after your allocation logic has already run. If you are splitting that payment among five parties, which number are you splitting? The gross? The net after fees? What if the fee changes because the customer's bank is in another country?

We learned to treat every payment as a promise that matures in stages, not as an event. The system that pays people out the moment a charge succeeds is a system that will one day pay out money it never actually received. And then you get to have the awkward conversation about taking it back.

Refunds arrive after the money is gone

Here is a scenario nobody designs for on day one. A customer pays. The platform splits the money among four parties and pays them out. Three weeks later, a partial refund.

Now what. The money already left. Do you claw back from four people proportionally? What if one of them has a zero balance? What if your contract with one of them says they keep their share regardless? We had scenarios where the answer was different for different parties on the same transaction, because that is what the underlying agreements said.

The refund flow ended up being more code than the payment flow. I want to say that surprised me, but by then it didn't.

Rounding is not a detail

Split $100 three ways. Somebody gets the extra penny. Fine, pick a rule.

Now do it across thousands of transactions per day, with splits recalculated when contracts change, and per-party minimum payout thresholds, and one party paid in a different settlement currency. The pennies pile up somewhere, and they had better pile up in a place your ledger knows about. An auditor once cared very much about a discrepancy that was, in total, less than the cost of the coffee at the meeting. Rightly so, honestly. If the small numbers are wrong, you cannot trust the big ones.

Pick your rounding rules early, write them down, and make your own ledger the source of truth for what each party is owed. The provider's records and the bank statement are the external evidence you reconcile against it, and they will catch things your ledger missed. But a dashboard is not a substitute for a ledger.

Retries are how you pay people twice

Networks fail. So you retry. And if your payout call is not idempotent, a timeout that actually succeeded plus a retry equals a double payout, and recovering money from someone's bank account is somewhere between unpleasant and impossible.

This is a mostly solved problem, idempotency keys have been around forever, but I still see systems in production without them. And the key is only the start. You also need to persist the payout intent before you send it, deduplicate the provider's callbacks, and have a plan for the request whose final status came back as a shrug. Teams skip all of this because the integration worked fine in testing, where networks are polite.

Contracts change in the middle

The failure mode I least expected. Not technical at all.

Agreements between parties get renegotiated. Effective dates are sometimes in the past. So the question becomes: does the new split apply to money already collected but not yet distributed? To transactions from last month? We had to build the waterfall logic to be versioned by effective date, so that any transaction could answer "which rules applied to you, and why." That versioning turned out to be the most valuable feature in the whole system, because when a dispute came, we could show the history instead of arguing about it.

If your split logic is a config file with the current percentages in it, you have built a snapshot, not a system.

What I would tell my past self

Reconciliation is the product. Everything else is the demo. Every serious payment system we have built eventually organized itself around one question: can we prove, at any moment, where every dollar went. Paid out, held, refunded, taken as a fee, reserved, or written off as a loss, with the full path back to the original transaction. Systems that can answer that survive audits, disputes, refunds, and 2 AM incidents. Systems that cannot are one confused customer away from a very bad month.

None of this is exotic computer science. It is mostly discipline, and having been burned before. Which, I suppose, is what experience is.

If you are designing multi-party payouts or revenue waterfalls right now and some of this sounds uncomfortably familiar, I am glad to compare architectures before the assumptions become production code. I have more scars where these came from.