Guides / Founders and builders

Connect Stripe to a custom app without holding customer money

Let Stripe take the payment and settle it into the seller's own Stripe account, so your app never receives or holds the funds. For a single business, that means Checkout or a Payment Link on their account plus a webhook. For a platform with many sellers, it means Stripe Connect with direct charges.

The short answer

Your app should never be the place money lands. It should create a payment on Stripe's side, send the customer to a Stripe-hosted page, and then listen for Stripe to say the payment succeeded. The money goes from the customer's card to the seller's Stripe balance and from there to the seller's bank.

Which setup you use depends on one question: how many different sellers receive money through your app? One seller means you use their Stripe account directly. Many sellers means you need Connect.

One business: use their own Stripe account

If you are building for yourself or for one client, this is the simplest and safest route. The owner creates a Stripe account in their own name, and your app uses that account's keys to create payments. Stripe is the processor, the owner is the merchant, and you are just software.

You have two main ways to start the payment:

  • Payment Links: no code for the payment itself. You create a link in the Stripe dashboard and put it on a button. This works for fixed prices like a single product or a flat deposit.
  • Checkout Sessions: your server creates a session with the amount, line items, and a success URL, then redirects the customer to Stripe's hosted page. Use this when the amount is calculated by your app, such as a cart total or a deposit based on the order.
  • Stripe Elements: card fields embedded in your own page. It gives more design control but more integration work, and it is rarely worth it for a small app.

Many sellers: Stripe Connect and direct charges

If your app lets multiple businesses get paid, each one needs its own connected Stripe account. With direct charges, the payment is created on the connected account, so it settles to that seller and not to you. You can take an application fee if you want a cut, and Stripe handles splitting it.

Connect has a few account types and the details change, so read Stripe's current Connect docs before you commit. Expect an onboarding step where each seller verifies their identity with Stripe, which is the point: Stripe handles the compliance around holding and moving money. Connect is real engineering work, so do not reach for it if one account will do.

Wire it up safely

Most problems with custom Stripe setups come from the glue code, not the payment itself. A few habits prevent most of them.

Never trust the browser to tell you a payment worked. A customer landing on your success page is not proof of payment. Mark an order as paid only when your server receives a verified webhook event from Stripe, such as a completed Checkout Session.

  • Keep secret keys in server-side environment variables, never in front-end code or a public repository.
  • Use a restricted API key with only the permissions your app needs.
  • Verify the webhook signature on every event.
  • Make your webhook handler safe to run twice, since Stripe may send the same event more than once.
  • Build and test entirely in Stripe's test mode first, then swap in live keys.
  • Store the Stripe session or payment ID on your order so you can reconcile later.

What you should still plan for

Not holding the money does not mean no responsibilities. Refunds, disputes, and payouts happen in the seller's Stripe dashboard, so tell the owner where to find them. Stripe charges its own processing fees, and the rates vary, so check Stripe's current pricing instead of assuming.

If you take deposits, decide up front what happens on cancellation, and show the deposit and the balance clearly before the customer pays. Also store only what you need. With hosted Checkout, card numbers never reach your server, and that is a good reason to keep it that way.

Where a small fixed-price build fits

If you have a prototype where the order form works but the payment step does not, or you need an order page that collects a deposit without anyone touching the money, a small build can cover it. Our App tier is $19, with a working preview within one business day of your brief, one round of tweaks, and one free rebuild if the first pass is not right. It includes saved data, an admin view behind a magic link, email notifications, and full MIT-licensed source code. Hosting is included for 12 months, then $9.00 per month or you self-host.

The closest example is a cake order page with deposits and an owner dashboard. It only offers valid pickup dates, shows the estimated total and deposit, and collects the deposit through the bakery's own Stripe account. The same pattern works for any order or booking that needs money up front. If your app needs multiple sellers with onboarding, that is a bigger Connect project and outside what this tier is meant for.

Keep the money out of your hands by letting Stripe host the payment and settle it to the seller's own account. Use Checkout with a verified webhook for one business, and Connect direct charges only when many sellers get paid through your app.

Related examples

Want this built for you? Describe it and we'll scope it in a minute.

0 / 600

Have more details to share? Use the full form