Skip to main content

Payout Flow

Send money to customers and vendors.

import { ValidationError, ZenPays } from 'zenpays'

async function processPayout() {
const zenpays = new ZenPays({
apiKey: process.env.ZENPAYS_API_KEY!,
})

// 1. Check available payout methods
const methods = await zenpays.payouts.getMethods()
console.log('Available payout methods:', methods.map(m => m.type).join(', '))

// 2. Check wallet balance
const balance = await zenpays.wallet.getBalance('USD')
console.log('Available balance:', balance)

// 3. Create payout
const payout = await zenpays.payouts.create({
customerId: 'cust_xxx',
amount: 10000, // $100.00
currency: 'USD',
payoutMethod: 'bank_transfer',
beneficiaryDetails: {
name: 'John Doe',
email: 'john@example.com',
bankName: 'Chase Bank',
accountNumber: '123456789',
accountType: 'checking',
routingNumber: '021000021',
},
description: 'Withdrawal request',
idempotencyKey: 'payout_unique_123', // Prevent duplicates
})

console.log('Payout created:', payout.id)
console.log('Status:', payout.status)

// 4. Monitor payout status
const waitForPayout = async (payoutId: string): Promise<boolean> => {
const p = await zenpays.payouts.get(payoutId)

switch (p.status) {
case 'completed':
console.log('Payout completed!')
console.log('Processed at:', p.processedAt)
return true

case 'failed':
console.log('Payout failed:', p.failureReason)
return false

case 'processing':
console.log('Payout processing...')
break

default:
console.log('Payout status:', p.status)
}

await new Promise(resolve => setTimeout(resolve, 5000))
return waitForPayout(payoutId)
}

return waitForPayout(payout.id)
}

// Retry a failed payout
async function retryFailedPayout(payoutId: string) {
const zenpays = new ZenPays({
apiKey: process.env.ZENPAYS_API_KEY!,
})

const payout = await zenpays.payouts.get(payoutId)

if (payout.status !== 'failed') {
console.log('Payout is not failed, cannot retry')
return
}

console.log('Retrying payout:', payoutId)
const retried = await zenpays.payouts.retry(payoutId)
console.log('Retry status:', retried.status)
}

// Get customer payouts
async function getCustomerPayouts(customerId: string) {
const zenpays = new ZenPays({
apiKey: process.env.ZENPAYS_API_KEY!,
})

const { data, total } = await zenpays.payouts.listByCustomer(customerId, {
limit: 10,
})

console.log(`Found ${total} payouts for customer ${customerId}:`)
data.forEach((p) => {
console.log(` ${p.id}: ${p.amount} ${p.currency} - ${p.status}`)
})
}

// Get payout analytics
async function getPayoutAnalytics() {
const zenpays = new ZenPays({
apiKey: process.env.ZENPAYS_API_KEY!,
})

const analytics = await zenpays.payouts.getAnalytics('30d')

console.log('Payout Analytics (30 days):')
console.log(' Total volume:', analytics.totalVolume)
console.log(' Total count:', analytics.totalCount)
console.log(' Success rate:', analytics.successRate, '%')
console.log(' Avg processing time:', analytics.averageProcessingTime, 'seconds')
}

processPayout()