Documentation

Gig Economy

Gig Economy

PerfectPay solves the gig economy payout problem: workers want their money now, platforms want low cost and reliability, and the payment rail that works best varies per worker. PerfectPay's multi-rail payout routing picks the right rail for each disbursement automatically.

Worker Payout Integration

The basic flow for paying a gig worker:

  1. Worker completes work and earnings are calculated on your platform
  2. Your platform calls the PerfectPay payouts API with the worker's payout details
  3. PerfectPay selects the optimal rail based on speed, cost, and worker eligibility
  4. Funds are disbursed to the worker's account
  5. Webhook confirms delivery

POST /payouts/create

GET //sandbox.perfectpay.ai/payouts/create
curl https://sandbox.perfectpay.ai/payouts/create \
  -X POST \
  -H "api-key: YOUR_SECRET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 15750,
    "currency": "USD",
    "payout_type": "bank",
    "customer_id": "cus_worker_042",
    "payout_method_data": {
      "bank": {
        "bank_account_number": "000123456789",
        "bank_routing_number": "110000000",
        "bank_name": "Worker Credit Union",
        "bank_account_holder_name": "Alex Worker"
      }
    },
    "metadata": {
      "platform_earnings_id": "earn_20260323_042",
      "work_type": "delivery"
    }
  }'

See the payouts guide for the full API reference.

Multi-Rail Payout Routing

Not every worker can receive funds on every rail. PerfectPay evaluates the available options and picks the best one:

RailSpeedTypical CostAvailability
Push-to-CardMinutes~$0.25-0.50Most Visa/Mastercard debit cards
RTPSeconds~$0.25Banks on the RTP network
FedNowSeconds~$0.25Banks on the FedNow network
ACH Same-DaySame business day~$0.05-0.25All US bank accounts
ACH Standard1-2 business days~$0.02-0.10All US bank accounts

How Rail Selection Works

When you send a payout without specifying a rail, PerfectPay's smart routing evaluates:

  1. Worker's payment method -- card vs bank account determines eligible rails
  2. Speed preference -- instant payouts prefer RTP/FedNow/Push-to-Card
  3. Receiving bank eligibility -- not all banks support all rails
  4. Cost optimization -- if the worker's bank supports both RTP and FedNow, pick the cheaper option
  5. Fallback -- if the preferred rail fails, retry on the next available rail

You can also specify the rail explicitly if your platform logic requires it:

GET //sandbox.perfectpay.ai/payouts/create
curl https://sandbox.perfectpay.ai/payouts/create \
  -X POST \
  -H "api-key: YOUR_SECRET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 15750,
    "currency": "USD",
    "payout_type": "bank",
    "customer_id": "cus_worker_042",
    "priority": "instant",
    "payout_method_data": {
      "bank": {
        "bank_account_number": "000123456789",
        "bank_routing_number": "110000000",
        "bank_name": "Worker Credit Union",
        "bank_account_holder_name": "Alex Worker"
      }
    }
  }'

Setting "priority": "instant" tells PerfectPay to use the fastest available rail. If no instant rail is available for that worker's bank, it falls back to same-day ACH.

Instant Payout Capabilities

Instant payouts are the differentiator for gig platforms competing for workers. PerfectPay supports instant disbursements through:

  • Push-to-Card -- funds land on the worker's debit card within minutes
  • RTP (Real Time Payments) -- bank-to-bank in seconds, 24/7/365
  • FedNow -- the Fed's instant payment rail, also 24/7/365

To offer instant payouts:

  1. Onboard workers with their debit card or bank account details
  2. Enable connectors that support instant payout rails (see connectors)
  3. Call the payouts API with "priority": "instant"
  4. Subscribe to payout_succeeded webhooks to confirm delivery in real time

See the instant settlement guide for configuration details.

Smart Rail Selection Per Worker

Different workers have different financial setups. PerfectPay stores each worker's payout preferences and eligible rails:

  • Worker A has a Visa debit card at a small bank not on RTP -- gets Push-to-Card for instant, ACH for standard
  • Worker B has a checking account at a FedNow-enabled bank -- gets FedNow for instant, ACH for standard
  • Worker C has both a debit card and a bank account -- PerfectPay picks the cheapest instant rail

This selection happens automatically at payout time. Your platform does not need to maintain rail-eligibility logic.

Batch Payouts

For platforms that pay workers at the end of a shift or day, batch payouts reduce API calls:

GET //sandbox.perfectpay.ai/payouts/batch
curl https://sandbox.perfectpay.ai/payouts/batch \
  -X POST \
  -H "api-key: YOUR_SECRET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "payouts": [
      {
        "amount": 15750,
        "currency": "USD",
        "customer_id": "cus_worker_042",
        "payout_type": "bank"
      },
      {
        "amount": 22300,
        "currency": "USD",
        "customer_id": "cus_worker_043",
        "payout_type": "bank"
      },
      {
        "amount": 8900,
        "currency": "USD",
        "customer_id": "cus_worker_044",
        "payout_type": "card"
      }
    ]
  }'

Each payout in the batch is routed independently based on the worker's rail eligibility.

Compliance Considerations

Gig economy payouts introduce specific compliance requirements:

  • 1099 reporting -- track cumulative payouts per worker for tax reporting thresholds
  • KYC/KYB -- verify worker identity before enabling payouts (use account metadata to track verification status)
  • OFAC screening -- ensure payees are not on sanctioned lists
  • State money transmitter laws -- depending on your platform model, you may need licenses or a partnership with a licensed entity

Use PerfectPay's metadata fields to store compliance status per worker and gate payouts programmatically until all checks pass.

Webhook Events for Payouts

Subscribe to these events for real-time payout tracking:

  • payout_succeeded -- funds delivered to the worker
  • payout_failed -- payout rejected (insufficient platform balance, invalid account, rail failure)
  • payout_expired -- payout was not completed within the expected window

See Events & Webhooks for webhook setup.

Next Steps