Learn how to fix the Stripe "payouts not enabled" error with step-by-step instructions for account verification, bank setup, API checks, and contacting Stripe support.
Book a call with an Expert
Starting a new venture? Need to upgrade your web app? RapidDev builds application with your growth in mind.
How to Resolve Stripe "Payouts Not Enabled" Error: A Comprehensive Tutorial
Step 1: Understanding the "Payouts Not Enabled" Error
The "Payouts Not Enabled" error in Stripe typically occurs when your account hasn't completed the necessary verification steps to receive funds. This can happen for several reasons:
Step 2: Log in to Your Stripe Dashboard
First, access your Stripe account dashboard:
Step 3: Check Your Account Activation Status
Once logged in, check if there are any pending tasks for your account activation:
Step 4: Complete Your Business Profile
Ensure your business profile is complete:
Step 5: Verify Your Identity
Complete personal identity verification:
Step 6: Set Up Your Bank Account Properly
Ensure your bank account is properly configured:
Step 7: Check for Verification Micro-deposits
If Stripe uses micro-deposits for verification:
Step 8: Check Your Account via the Stripe API
For developers, you can check your account status programmatically:
const stripe = require('stripe')('sk_test_YOUR_SECRET_KEY');
async function checkAccountStatus() {
try {
const account = await stripe.accounts.retrieve();
console.log('Account Status:', account.payouts\_enabled);
console.log('Charges Enabled:', account.charges\_enabled);
console.log('Requirements:', account.requirements);
return account;
} catch (error) {
console.error('Error retrieving account:', error);
throw error;
}
}
checkAccountStatus();
Step 9: Address Specific Requirements
If the API or dashboard shows specific requirements that need addressing:
Example of checking specific requirements via API:
const stripe = require('stripe')('sk_test_YOUR_SECRET_KEY');
async function checkAccountRequirements() {
try {
const account = await stripe.accounts.retrieve();
if (account.requirements) {
console.log('Currently Due:', account.requirements.currently\_due);
console.log('Eventually Due:', account.requirements.eventually\_due);
console.log('Past Due:', account.requirements.past\_due);
}
return account.requirements;
} catch (error) {
console.error('Error checking requirements:', error);
throw error;
}
}
checkAccountRequirements();
Step 10: Update Account Information via API (If Needed)
If you need to update specific account information programmatically:
const stripe = require('stripe')('sk_test_YOUR_SECRET_KEY');
async function updateAccountInformation() {
try {
const account = await stripe.accounts.update({
business\_profile: {
mcc: '5734', // Merchant Category Code
url: 'https://example.com',
support\_email: '[email protected]',
support\_phone: '+15555555555'
},
company: {
name: 'Example Business LLC',
tax\_id: '123456789',
address: {
line1: '123 Main St',
city: 'San Francisco',
state: 'CA',
postal\_code: '94111',
country: 'US'
}
},
tos\_acceptance: {
date: Math.floor(Date.now() / 1000),
ip: '192.168.0.1' // User's IP address
}
});
console.log('Account updated successfully:', account.id);
return account;
} catch (error) {
console.error('Error updating account:', error);
throw error;
}
}
updateAccountInformation();
Step 11: Check for Restrictions in Your Region
Some countries or regions have specific restrictions:
Step 12: Contact Stripe Support
If you've completed all the steps and still face issues:
Step 13: Handle the Error Gracefully in Your Application
While resolving the issue, update your application to handle the error gracefully:
const stripe = require('stripe')('sk_test_YOUR_SECRET_KEY');
async function createPayout(amount, currency = 'usd') {
try {
// First check if payouts are enabled
const account = await stripe.accounts.retrieve();
if (!account.payouts\_enabled) {
console.error('Payouts are not enabled for this account');
// Get specific details about why payouts are disabled
const requirements = account.requirements || {};
const currentlyDue = requirements.currently\_due || [];
if (currentlyDue.length > 0) {
console.error('Requirements needed for payouts:', currentlyDue);
}
// You might want to notify the user or admin here
return {
success: false,
error: 'payouts_not_enabled',
requirements: currentlyDue
};
}
// If payouts are enabled, proceed with payout
const payout = await stripe.payouts.create({
amount: amount,
currency: currency,
});
return {
success: true,
payout: payout
};
} catch (error) {
console.error('Error creating payout:', error);
return {
success: false,
error: error.message
};
}
}
// Example usage
createPayout(1000).then(result => {
if (result.success) {
console.log('Payout created successfully:', result.payout.id);
} else {
console.log('Failed to create payout:', result.error);
if (result.requirements) {
console.log('Please complete these requirements:', result.requirements);
}
}
});
Step 14: Implement Webhook Monitoring for Account Updates
Set up webhooks to monitor account status changes:
const express = require('express');
const stripe = require('stripe')('sk_test_YOUR_SECRET_KEY');
const app = express();
// Use JSON parser for webhook requests
app.use('/webhook', express.raw({type: 'application/json'}));
app.post('/webhook', async (req, res) => {
const sig = req.headers['stripe-signature'];
let event;
try {
event = stripe.webhooks.constructEvent(
req.body,
sig,
'whsec_YOUR_WEBHOOK\_SECRET'
);
} catch (err) {
console.error(`Webhook Error: ${err.message}`);
return res.status(400).send(`Webhook Error: ${err.message}`);
}
// Handle specific account update events
if (event.type === 'account.updated') {
const account = event.data.object;
console.log('Account updated:', account.id);
console.log('Payouts enabled:', account.payouts\_enabled);
// If payouts just became enabled, you might want to:
// 1. Update your database
// 2. Notify administrators
// 3. Process any pending payouts
if (account.payouts\_enabled) {
// Handle newly enabled payouts
console.log('Payouts have been enabled!');
// notifyAdmin('Payouts are now enabled for your Stripe account');
// processAnyPendingPayouts();
}
}
res.json({received: true});
});
app.listen(3000, () => {
console.log('Webhook server running on port 3000');
});
Step 15: Regular Account Monitoring
Implement a regular check of your account status:
const stripe = require('stripe')('sk_test_YOUR_SECRET_KEY');
const cron = require('node-cron');
// Schedule a job to run daily at midnight
cron.schedule('0 0 _ _ \*', async () => {
try {
console.log('Running scheduled Stripe account check...');
const account = await stripe.accounts.retrieve();
// Log current account status
console.log('Account ID:', account.id);
console.log('Payouts Enabled:', account.payouts\_enabled);
console.log('Charges Enabled:', account.charges\_enabled);
// Check for any pending requirements
if (account.requirements) {
const currentlyDue = account.requirements.currently\_due || [];
const eventuallyDue = account.requirements.eventually\_due || [];
const pastDue = account.requirements.past\_due || [];
if (currentlyDue.length > 0) {
console.warn('Requirements currently due:', currentlyDue);
// Send notification to administrators
// notifyAdmin('Action required: Stripe account has pending requirements', currentlyDue);
}
if (pastDue.length > 0) {
console.error('Requirements past due:', pastDue);
// Send urgent notification
// notifyAdmin('URGENT: Stripe account has past due requirements', pastDue);
}
}
console.log('Stripe account check completed.');
} catch (error) {
console.error('Error checking Stripe account status:', error);
// notifyAdmin('Error monitoring Stripe account', error.message);
}
});
console.log('Stripe account monitoring scheduled.');
Step 16: Follow Up and Maintain Compliance
After resolving the immediate issue:
When it comes to serving you, we sweat the little things. That’s why our work makes a big impact.