Skip to main content
The platform uses Stripe for secure payment processing. Organizations fund bounties using Stripe Checkout, and developers receive payouts through Stripe Connect.

Payment Architecture

Two-Sided Marketplace

The platform operates as a two-sided marketplace:
  • Organizations: Pay for bounties using Stripe Checkout
  • Contributors: Receive payouts via Stripe Connect accounts
  • Platform: Facilitates secure escrow and transfers

Payment Flow Overview

1

Bounty Creation

Organization creates bounty and specifies amount.
2

Fee Calculation

Platform calculates total including platform fees.
3

Checkout Session

Stripe Checkout session created for payment.
4

Payment Captured

Funds captured and held in escrow (payment status: held).
5

Work Completed

Developer submits work and creator approves.
6

Transfer Created

Platform transfers funds to developer’s Connect account.
7

Payout Processing

Stripe processes payout to developer’s bank account.

Platform Fees

The platform charges fees based on your subscription plan:
PlanPlatform FeeFee-Free Allowance
Free5%$0/mo
Basic4%$500/mo
Pro3%$5,000/mo
Pro+2%$50,000/mo
Fees are calculated automatically and displayed during checkout. Organizations pay the fees, ensuring developers receive the full bounty amount.
Learn more about pricing tiers and fee-free allowances in the Pricing & Plans guide.

Funding Bounties

Creating Checkout Session

When creating a bounty, organizations can choose to fund immediately or pay later:
const bounty = await trpc.bounties.createBounty.mutate({
  title: "Implement feature X",
  amount: "500.00",
  currency: "USD",
  payLater: false // Fund now via checkout
});

// Returns:
// - bounty: Created bounty record
// - checkoutUrl: Stripe Checkout URL
// - fees: Platform fees amount
// - totalWithFees: Total charge amount

Stripe Customer Creation

Organizations automatically get Stripe customers:
  • Created on first bounty funding
  • Customer ID stored in organization record
  • Reused for all future bounties
  • Verified and recreated if missing from Stripe

Payment Confirmation

Payments are confirmed via Stripe webhooks:
  1. User completes Stripe Checkout
  2. Stripe sends checkout.session.completed webhook
  3. Platform captures payment and updates bounty
  4. Bounty status changes from draft to open
  5. Payment status changes from pending to held
Bounties remain in draft status until payment webhook is received. This typically takes a few seconds but can take up to a minute.

Stripe Connect Integration

Developers must set up Stripe Connect to receive payouts.

Connect Account Setup

1

Create Account

Platform creates Stripe Connect account for user.
2

Onboarding Link

User redirected to Stripe onboarding flow.
3

Verify Identity

User provides identity and banking information.
4

Activate Account

Account activated with transfers and payouts enabled.

Initiating Onboarding

const link = await trpc.connect.createConnectAccountLink.mutate();

// Redirects user to Stripe onboarding
// Returns URL for Express Dashboard onboarding flow
window.location.href = link.data.url;

Account Status

Check your Connect account status:
const status = await trpc.connect.getConnectStatus.query();

// Returns:
// - hasConnectAccount: Account exists
// - onboardingComplete: Identity verified
// - cardPaymentsActive: Can receive card payments
// - transfersActive: Can receive transfers
// - accountDetails: Detailed requirements and capabilities

Account Requirements

Stripe may require additional information:
  • Currently Due: Must be provided to receive payouts
  • Eventually Due: Will be required in the future
  • Past Due: Overdue requirements blocking payouts

Express Dashboard

Access your Stripe Express Dashboard to manage:
  • Banking information
  • Payout schedule
  • Tax information
  • Identity verification
  • Transaction history
const dashboard = await trpc.connect.getConnectDashboardLink.mutate();

// Returns:
// - url: Dashboard or onboarding link
// - isOnboarding: true if onboarding incomplete

Receiving Payouts

Payout Creation

When a submission is approved:
  1. Platform creates transfer to Connect account
  2. Payout record created with pending status
  3. Stripe processes transfer
  4. Payout status updates to processing then completed
  5. Funds appear in Connect account balance
  6. Stripe handles bank deposit based on payout schedule

Payout Statuses

  • pending: Transfer initiated, awaiting processing
  • processing: Stripe processing the transfer
  • completed: Successfully transferred to Connect account
  • failed: Transfer failed (retried automatically)

Viewing Payout History

const history = await trpc.connect.getPayoutHistory.query({
  page: 1,
  limit: 20
});

// Returns paginated list of payouts:
// - Payout amount
// - Status
// - Associated bounty
// - Stripe transfer ID
// - Timestamps

Account Balance

Check your Connect account balance:
const balance = await trpc.connect.getAccountBalance.query();

// Returns:
// - available: Funds ready for payout
// - pending: Funds being processed
// - total: Combined available + pending
Balances are in USD cents and converted to dollars for display. Funds move from pending to available based on Stripe’s standard timeline.

Transaction Records

All payment operations are logged:

Transaction Types

  • payment_intent: Initial bounty funding
  • transfer: Payout to contributor
  • refund: Cancelled bounty refund
  • payout: External bank payout

Transaction Details

Each transaction records:
  • Bounty ID
  • Transaction type
  • Amount
  • Stripe ID for verification
  • Timestamp

Activity Tracking

View your complete payment activity:
const activity = await trpc.connect.getActivity.query({
  page: 1,
  limit: 20
});

// Returns combined activity:
// - Payouts received (as contributor)
// - Bounties created (as organization)
// - Associated bounty details
// - Status and amounts

Refunds

Cancelled bounties trigger automatic refunds:
  1. Cancellation request approved
  2. Payment intent cancelled in Stripe
  3. Refund created for original amount
  4. Funds returned to organization’s payment method
  5. Transaction recorded with type refund
Funded bounties with approved submissions cannot be cancelled or refunded. Resolve the submission status first.

Security Features

Payment Locks

Prevents duplicate payment operations:
  • Idempotent payment processing
  • Operation tracking prevents double-charging
  • Redis-based distributed locking
  • Automatic lock expiration

Circuit Breaker

Protects against Stripe API failures:
  • Monitors Stripe API health
  • Automatically opens circuit on repeated failures
  • Prevents cascade failures
  • Auto-recovery when Stripe is healthy

Webhook Verification

All Stripe webhooks are verified:
  • Signature validation
  • Event deduplication
  • Secure endpoint authentication
  • Automatic retry on failure

Common Issues

Payment webhook not received yet. Wait 1-2 minutes. If persists, contact support with bounty ID.
Additional information required. Check Connect status for requirements list. Access dashboard to provide missing information.
Stripe will automatically retry failed transfers. Check Connect dashboard for account issues. Ensure banking information is correct.
Funds transfer from Connect balance to bank based on payout schedule (typically 2-7 business days). Check Stripe Express Dashboard for payout schedule.
Error likely indicates Connect not enabled in Stripe Dashboard. Enable Connect in Stripe settings: dashboard.stripe.com/settings/connect

Best Practices

Complete Onboarding Early

Set up your Stripe Connect account before working on bounties to receive payouts immediately upon approval.

Verify Banking Info

Double-check your banking information in Stripe Express Dashboard to avoid payout delays.

Monitor Requirements

Regularly check for new Stripe requirements to maintain payout capability.

Track Activity

Review payment activity regularly to reconcile earnings and ensure all payouts processed correctly.

Payment Support

For payment-related issues:
  1. Check Stripe Express Dashboard for detailed error messages
  2. Review platform activity logs
  3. Contact support with transaction/payout ID
  4. For Stripe account issues, contact Stripe support directly

Build docs developers (and LLMs) love