# Stripe Connect Payouts: A Production Checklist for When Sellers Aren't Getting Paid

Stripe Connect payouts stuck, failed, or missing? Nine production checks: payout schedule, delay_days, negative balances, transfer reversals, and Connect webhooks.

When a seller on your marketplace emails "where's my money?", the answer is almost never "Stripe is down." It's usually one of a handful of states your platform didn't model: a balance that is still pending, a payout schedule you never set, a failed bank account that silently disabled payouts, or a refund that took money from the wrong balance.

This is the checklist I run before touching code. It assumes Stripe Connect with Express or Custom accounts, where your platform controls payouts. Every behavior below is from Stripe's current docs, linked at the end.

## First, know which balance the money is in

Your platform and every connected account are separate Stripe accounts, each with its own `pending` and `available` balance. Where a payment lands depends on the charge type:

- **Direct charges** land on the connected account.
- **Destination charges** and **separate charges and transfers** land on your platform first, then move to the seller by transfer.

If you're not sure which one you built, start with [direct vs destination vs separate charges](/blog/stripe-connect-platform-fees). Half of payout confusion is looking at the wrong balance.

To see what a seller actually has, retrieve the balance *as the connected account* (send the `Stripe-Account` header). That one call answers "is it pending, available, or already paid out?"

## The 9 checks

### 1. Is the account actually allowed to receive payouts?

Before anything else, check `payouts_enabled` and the `requirements` hash on the account. A seller who never finished onboarding, or who has a new `currently_due` requirement, can't be paid no matter what the balance says. Listen for `account.updated` and surface missing requirements in your seller dashboard instead of waiting for support tickets. I cover the full status machine in [Stripe Connect KYC and Express onboarding](/blog/stripe-connect-custom-onboarding-kyc).

### 2. Is the money still pending?

New funds sit in `pending` before they become `available`. For a standard Stripe account that's a rolling window (Stripe's docs use 2 days as the example, and it varies by country and account). Sellers read "payment succeeded" as "money is mine now." Your UI should show pending and available separately, with an expected date.

### 3. What payout schedule is the account on?

By default, funds on a connected account are paid out on a daily rolling basis. If your platform owns fraud and dispute liability (or has platform controls), you can change the `interval` to `manual`, `daily`, `weekly` (with `weekly_payout_days`), or `monthly` (with `monthly_payout_days`).

The trap: someone sets `manual` for testing, or to enable Instant Payouts, and nobody builds the job that actually creates payouts. On `manual`, nothing leaves the balance until you call the Payouts API as the connected account.

### 4. Did someone change `delay_days`?

`delay_days` controls how long charges take to become available for payout. On accounts where you own liability you can set `delay_days_override` up to 31. That's useful for marketplaces that pay out after a service is completed, but it is also an easy way to make every seller wait a month without meaning to. Note that Stripe counts business days or calendar days depending on the account's country.

### 5. Did a transfer fail because your platform balance was short?

With separate charges and transfers, a transfer pulls from your platform's **available** balance by default. If that balance is too low, the transfer fails with an error, and Stripe does **not** retry it later when funds arrive. You have to try again yourself.

The fix is to pass the charge ID as `source_transaction` when creating the transfer. The transfer then succeeds even if the charge hasn't settled, and the funds become available to the seller when the original charge does. Use `transfer_group` to tie every transfer for an order together so reconciliation is one query, not a spreadsheet.

### 6. Did a payout fail and disable the bank account?

When a payout fails, its `status` becomes `failed` and `failure_code` says why. Stripe also disables that external account, and no automatic or manual payouts go out until the bank details are updated. You get `payout.failed` and `account.external_account.updated`.

If you don't listen for those, the seller just stops getting paid and nobody on your side knows. Handle `payout.failed` by flagging the seller, emailing them a link to update their bank account, and showing a banner in their dashboard.

### 7. Is the connected account's balance negative?

Refunds and chargebacks create negative transactions. Stripe first takes them from the account the charge was made on, then tries to offset them against future payments. But a connected balance can still go negative, and while it is, you can't pay out to that account. Payouts resume once the balance is positive again.

Two things to know:

- Who pays for that negative balance is on the account: `controller.losses.payments` (Accounts v1) is `stripe` or `application`. If it's `application`, it's you. See [marketplace fraud and risk](/blog/stripe-connect-marketplace-fraud-risk) for why that matters.
- When your platform is liable, Stripe holds a **reserve** on your platform balance to cover it. If a connected account stays negative for 180 days, Stripe moves that reserve over to zero it out (a "Connect collection transfer"). You can let Stripe debit the seller's bank to recover it with `debit_negative_balances` in supported countries.

### 8. Did a refund take money from the wrong place?

This is one of the easiest ways for a marketplace to lose money without noticing.

- With **separate charges and transfers**, refunding the charge has **no effect** on the transfer. The seller keeps the money and your platform eats the refund, unless you reverse the transfer or net it out of a later payout.
- With **destination charges**, the refund API has `reverse_transfer` (pull back from the seller proportionally) and `refund_application_fee` (give back your fee proportionally). Both default to off.

Transfer reversals only work if the seller's available balance covers the amount (or connected reserves are enabled). So reverse early, ideally in the same job that issues the refund, before the funds are paid out. Decide the refund policy per order type and write it down; "who pays for a refund?" is a product decision, not a code detail.

### 9. Are you actually receiving Connect webhooks?

Connect events come in two scopes, and they need **separate endpoints**: one for "your account" and one for "connected accounts" (`connect: true` when created by API). `account.updated`, `payout.failed`, and direct-charge events for your sellers come through the connected-accounts endpoint, with a top-level `account` field telling you which seller. If you only registered one endpoint, you're blind to half your payout events.

Then make the handler production-safe:

- Verify the signature on the raw request body and return `2xx` before slow work.
- Stripe retries failed deliveries for up to three days in live mode and doesn't guarantee order. Store processed `event.id`s and skip duplicates. Don't use `created` to order events.
- Check `livemode`: a production Connect endpoint receives both live and test events.
- Use idempotency keys on the transfers and refunds your handler creates, so a retry never pays a seller twice.

I go deeper on the handler itself in [Stripe webhooks in Next.js, production edition](/blog/stripe-webhooks-nextjs-production).

## A quick triage order

When a seller reports a missing payout:

1. Retrieve the account: `payouts_enabled`, `requirements`.
2. Retrieve the balance as that account: pending, available, negative?
3. List recent payouts for the account: any `failed`, and what `failure_code`?
4. Check the payout schedule and `delay_days`.
5. For platform-first charges, find the transfer for the order (`transfer_group`) and check it exists and wasn't reversed.
6. Check your webhook endpoint's delivery log for errors.

Most of the time you have the answer by step 3.

## When to bring in help

If you're seeing the same payout bug more than once, the issue usually isn't one handler. It's that money state lives in Stripe while your app has its own idea of what each seller is owed. That's the work I do on [Stripe Connect integration](/services/stripe-connect-integration) projects: map the fund flow, make webhooks the source of truth, and add the reconciliation that makes "where's my money?" a lookup instead of an investigation. For a whole platform, see [full marketplace builds](/services/marketplace-development).

A money-flow check starts at $800, and adding payouts to an app you already have starts at $2,500. Those are starting points that flex with what's already built; we agree scope on a free call. [Book a 30-minute call](https://calendar.app.google/w16msrheRumpmWvr6) or [send a brief](/contact).

## FAQ

**How long do Stripe Connect payouts take?**

Funds first sit in the pending balance (Stripe's example for a standard account is a 2-day rolling window, varying by country). Once a payout is submitted, standard payouts usually reach the bank 1–2 business days later. Instant Payouts typically arrive within 30 minutes.

**Why is my Stripe Connect payout failing?**

Common causes: the account has outstanding requirements so payouts aren't enabled, the bank account was rejected (which disables it until updated), the balance is negative, or the account is on a manual schedule and no payout was created. Check `payouts_enabled`, the balance, and the payout's `failure_code`.

**Can I change a connected account's payout schedule?**

Yes, if your platform owns fraud and dispute liability or has platform controls. Set the interval to manual, daily, weekly, or monthly, and adjust `delay_days` up to 31 days.

**Does refunding a charge take money back from the seller?**

Not automatically. With separate charges and transfers, you must reverse the transfer yourself. With destination charges, pass `reverse_transfer: true` on the refund (and `refund_application_fee: true` if you're returning your fee).

**What happens when a connected account has a negative balance?**

You can't pay out to it until it's positive. Stripe offsets it against future payments, may debit the seller's bank if enabled, and if your platform is liable, holds a reserve on your balance. After 180 days negative, Stripe uses that reserve to clear it.

## Sources

Stripe docs, checked November 2026: [Manage connected account payouts](https://docs.stripe.com/connect/payouts-connected-accounts) · [Connect account balances](https://docs.stripe.com/connect/account-balances) · [Manage payout schedule](https://docs.stripe.com/connect/manage-payout-schedule) · [Separate charges and transfers](https://docs.stripe.com/connect/separate-charges-and-transfers) · [Create a refund](https://docs.stripe.com/api/refunds/create) · [Create a transfer](https://docs.stripe.com/api/transfers/create) · [Connect webhooks](https://docs.stripe.com/connect/webhooks) · [Webhooks](https://docs.stripe.com/webhooks)