Skip to main content
RapidDev - Software Development Agency
stripe-guide

How to check pending payouts in Stripe

Check pending Stripe payouts in Dashboard → Balance → Payouts tab. Each payout shows its status: pending, in_transit, paid, failed, or canceled. Via the API, use stripe.payouts.list() filtered by status and stripe.balance.retrieve() to see available vs. pending funds. Track payout delivery by listening to payout.paid and payout.failed webhook events.

What you'll learn

  • How to check payout status in the Stripe Dashboard
  • How to list payouts filtered by status via the API
  • What each payout status means
  • How to track payout delivery with webhooks
Book a free consultation
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Beginner5 min read10 minutesStripe API v2024-12+, Node.js 18+March 2026RapidDev Engineering Team
TL;DR

Check pending Stripe payouts in Dashboard → Balance → Payouts tab. Each payout shows its status: pending, in_transit, paid, failed, or canceled. Via the API, use stripe.payouts.list() filtered by status and stripe.balance.retrieve() to see available vs. pending funds. Track payout delivery by listening to payout.paid and payout.failed webhook events.

Understanding Stripe Payout Statuses

Stripe payouts go through several statuses: pending (scheduled but not yet initiated), in_transit (sent to your bank), paid (confirmed delivered), failed (rejected by the bank), or canceled. Monitoring these statuses helps you reconcile your books, predict cash flow, and catch failed payouts quickly. You can check statuses in the Dashboard, via the API, or by listening to webhook events.

Prerequisites

  • A verified Stripe account with payouts enabled
  • At least one payout initiated (or a payment processed that triggers automatic payout)
  • Node.js 18+ for API examples

Step-by-step guide

1

Check payouts in the Dashboard

Go to Stripe Dashboard → Balance. The overview shows your available balance, pending balance, and in-transit funds. Click the 'Payouts' tab to see a list of all payouts with their status, amount, arrival date, and destination bank account.

Expected result: You can see all payouts with their current status and expected arrival dates.

2

Understand payout statuses

Each payout has one of five statuses: 'pending' means it's scheduled but not yet sent; 'in_transit' means Stripe has sent it to your bank; 'paid' means your bank has confirmed receipt; 'failed' means the bank rejected it; 'canceled' means it was manually canceled before being sent.

Expected result: You understand what each status means and can interpret the payout timeline.

3

List pending payouts via the API

Use stripe.payouts.list() with a status filter to find pending or in-transit payouts programmatically.

typescript
1const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);
2
3// List pending payouts
4const pending = await stripe.payouts.list({
5 status: 'pending',
6 limit: 10,
7});
8
9pending.data.forEach(p => {
10 console.log(`${p.id} | $${p.amount / 100} ${p.currency.toUpperCase()} | ETA: ${new Date(p.arrival_date * 1000).toLocaleDateString()}`);
11});

Expected result: A list of pending payouts with amounts and expected arrival dates.

4

Check your balance breakdown

The balance API shows how much is available for payout, how much is pending (from recent charges not yet settled), and how much is in transit (payouts already sent to your bank).

typescript
1const balance = await stripe.balance.retrieve();
2
3console.log('=== Available (ready to pay out) ===');
4balance.available.forEach(b => console.log(` ${b.amount / 100} ${b.currency.toUpperCase()}`));
5
6console.log('=== Pending (from recent charges) ===');
7balance.pending.forEach(b => console.log(` ${b.amount / 100} ${b.currency.toUpperCase()}`));

Expected result: A clear view of your available vs. pending balance, showing how much can be paid out now.

5

Track payout delivery with webhooks

Set up webhooks for payout.paid (successful delivery) and payout.failed (bank rejected) to track payouts in real time. RapidDev teams use these webhooks to update financial dashboards and trigger alerts for failed payouts.

typescript
1app.post('/webhook', express.raw({ type: 'application/json' }), (req, res) => {
2 const sig = req.headers['stripe-signature'];
3 const event = stripe.webhooks.constructEvent(
4 req.body, sig, process.env.STRIPE_WEBHOOK_SECRET
5 );
6
7 switch (event.type) {
8 case 'payout.paid':
9 const paid = event.data.object;
10 console.log(`Payout ${paid.id} delivered: $${paid.amount / 100}`);
11 break;
12 case 'payout.failed':
13 const failed = event.data.object;
14 console.log(`Payout ${failed.id} FAILED: ${failed.failure_message}`);
15 // Alert team, update records
16 break;
17 }
18
19 res.json({ received: true });
20});

Expected result: Your server receives real-time notifications when payouts are delivered or fail.

Complete working example

payout-tracker.js
1require('dotenv').config();
2const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);
3
4async function getPayoutSummary() {
5 const balance = await stripe.balance.retrieve();
6
7 console.log('=== Balance Summary ===');
8 balance.available.forEach(b => {
9 console.log(`Available: ${(b.amount / 100).toFixed(2)} ${b.currency.toUpperCase()}`);
10 });
11 balance.pending.forEach(b => {
12 console.log(`Pending: ${(b.amount / 100).toFixed(2)} ${b.currency.toUpperCase()}`);
13 });
14
15 // List recent payouts by status
16 const statuses = ['pending', 'in_transit', 'paid', 'failed'];
17
18 for (const status of statuses) {
19 const payouts = await stripe.payouts.list({ status, limit: 5 });
20 if (payouts.data.length > 0) {
21 console.log(`\n=== ${status.toUpperCase()} Payouts ===`);
22 payouts.data.forEach(p => {
23 const arrival = new Date(p.arrival_date * 1000).toLocaleDateString();
24 console.log(
25 ` ${p.id} | ${(p.amount / 100).toFixed(2)} ${p.currency.toUpperCase()} | ` +
26 `Arrives: ${arrival}${p.failure_message ? ' | FAILED: ' + p.failure_message : ''}`
27 );
28 });
29 }
30 }
31}
32
33async function getPayoutDetails(payoutId) {
34 const payout = await stripe.payouts.retrieve(payoutId);
35 console.log('Payout details:', {
36 id: payout.id,
37 amount: payout.amount / 100,
38 currency: payout.currency,
39 status: payout.status,
40 arrival_date: new Date(payout.arrival_date * 1000).toLocaleDateString(),
41 failure_message: payout.failure_message,
42 method: payout.method,
43 type: payout.type,
44 });
45 return payout;
46}
47
48module.exports = { getPayoutSummary, getPayoutDetails };
49
50// Run directly
51if (require.main === module) {
52 getPayoutSummary().catch(console.error);
53}

Common mistakes when checkking pending payouts in Stripe

Why it's a problem: Confusing 'pending balance' with 'pending payouts'

How to avoid: Pending balance = funds from recent charges not yet settled (takes 2 days). Pending payouts = scheduled payouts waiting to be sent to your bank. These are different concepts.

Why it's a problem: Not monitoring payout.failed webhook events

How to avoid: Failed payouts mean money isn't reaching your bank. Listen for payout.failed events and alert your team immediately. Check the failure_message for the reason.

Why it's a problem: Expecting payouts to arrive on weekends or holidays

How to avoid: Payouts only process on business days. Payouts scheduled for weekends or holidays arrive on the next business day.

Why it's a problem: Not using pagination when listing many payouts

How to avoid: The API returns a maximum of 100 payouts per request. Use has_more and starting_after to paginate through all results.

Best practices

  • Check your payout status regularly in the Dashboard during the first weeks
  • Set up payout.paid and payout.failed webhooks for automated monitoring
  • Reconcile payouts with your bank statements weekly
  • Use the balance API to forecast cash flow based on available and pending amounts
  • Alert your finance team immediately when a payout fails
  • Keep your bank account details updated to prevent payout failures
  • For Stripe Connect platforms, monitor connected account payouts separately

Still stuck?

Copy one of these prompts to get a personalized, step-by-step explanation.

ChatGPT Prompt

Write a Node.js script that checks Stripe payout status by retrieving the balance (available and pending) and listing recent payouts grouped by status (pending, in_transit, paid, failed). Show amounts, currencies, arrival dates, and failure messages. Include a function to get details for a specific payout.

Stripe Prompt

Build a Stripe payout monitoring tool in Node.js that retrieves balance breakdown, lists payouts by status, shows arrival dates, and displays failure reasons for failed payouts. Include both summary and detail views.

Frequently asked questions

What does 'pending' payout status mean?

Pending means the payout is scheduled but Stripe hasn't sent it to your bank yet. This is normal — payouts sit in pending status until the next scheduled payout time.

What does 'in_transit' mean?

In transit means Stripe has sent the funds to your bank, but your bank hasn't confirmed receipt yet. This typically lasts 1-2 business days for US accounts.

How long do payouts take to arrive?

For US accounts, payouts typically arrive in 2 business days after initiation. International accounts may take 3-7 business days depending on the country and bank.

What causes a payout to fail?

Common causes: incorrect bank account details, closed bank account, bank rejecting the deposit, or account restrictions. Check the failure_message field on the payout object for the specific reason.

What happens to funds from a failed payout?

Failed payout funds are returned to your Stripe available balance. Stripe may automatically retry the payout, or you can trigger a manual payout after fixing the issue (e.g., updating your bank details).

How do I reconcile payouts with my bank account?

Each payout has a unique ID and amount. Match these with deposits in your bank statement. Use the Stripe Dashboard export feature or API to download payout details for accounting.

RapidDev

Talk to an Expert

Our team has built 600+ apps. Get personalized help with your project.

Book a free consultation

Need help with your project?

Our experts have built 600+ apps and can accelerate your development. Book a free consultation — no strings attached.

Book a free consultation

We put the rapid in RapidDev

Need a dedicated strategic tech and growth partner? Discover what RapidDev can do for your business! Book a call with our team to schedule a free, no-obligation consultation. We'll discuss your project and provide a custom quote at no cost.