> ## Documentation Index
> Fetch the complete documentation index at: https://docs.spherepay.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Stablecoin and Fiat Payroll for Global Teams

> Pay W-2 employees and 1099 contractors in stablecoins or fiat. Cover both crypto-native and traditional payroll models with a single integration.

Use SpherePay to disburse payroll in stablecoins or convert stablecoin payments to fiat for employees and contractors. This is common for companies with globally distributed teams or crypto-native workforces.

## Two payroll models

| Model                  | Flow                         | Best for                                           |
| ---------------------- | ---------------------------- | -------------------------------------------------- |
| **Stablecoin payroll** | USD → USDC → employee wallet | Crypto-native employees, international contractors |
| **Fiat payroll**       | USDC → USD → employee bank   | Traditional employees who prefer fiat              |

## Recommended — virtual accounts for stablecoin payroll

The fastest way to ship a stablecoin payroll integration is to use **[Onramper Accounts](/concepts/automation/onramper-accounts)** (virtual bank accounts) instead of per-paycheck `POST /v2/transfer` calls.

Each employee gets their own dedicated virtual USD bank account (account + routing number, or SEPA details for EUR). On payday you initiate a single ACH/wire from your payroll platform to each employee's virtual account using your existing payroll tooling. SpherePay automatically converts the deposit to USDC and delivers it to the employee's registered wallet — no transfer API call required.

**Why this pattern wins:**

* **Faster integration.** No per-payment API logic, retry handling, or idempotency keys.
* **Reuses your payroll system.** Initiate the ACH from Gusto, Rippling, or your existing rails — the virtual account "looks like" a normal bank account to the originator.
* **Auditable.** Each payment is recorded as a deposit on a dedicated account, mapped 1:1 to an employee.
* **Hands-off after setup.** Onboarding the employee + provisioning the Onramper Account is the only API work. Recurring payroll happens via bank rails.

The per-transfer API patterns below are still relevant when:

* You're paying contractors ad hoc (no recurring schedule)
* You want first-party control over which wallet receives each payment
* You're running fiat payroll (USDC → bank), where Onramper Accounts don't apply — use [Offloader Wallets](/concepts/automation/offloader-wallets) instead

## Third-party transactions

Payroll disbursements are **third-party transactions** — you're moving funds on behalf of another party (your employees or contractors). Each payee must be a verified SpherePay customer with completed KYC/KYB before they can receive funds.

<Warning>
  Every payee must be a verified customer in SpherePay with completed KYC or KYB. Sending payroll to an unverified customer will fail at the API layer.
</Warning>

## Setup requirements

Before processing payroll:

1. **Verify your company** — Complete [KYB](/concepts/onboarding/business-kyb).
2. **Verify each payee** — Each employee or contractor needs [KYC](/concepts/onboarding/individual-kyc).
3. **Register payment instruments per payee:**
   * [Wallets](/concepts/transfers/wallets) for stablecoin payments
   * [Bank accounts](/concepts/transfers/bank-accounts) for fiat payments

## Model 1 — Stablecoin payroll

USD from your company bank account → USDC → employee wallet.

```mermaid theme={"dark"}
flowchart LR
    CB["Company<br/>bank account"] -->|USD ACH / Wire| SP["SpherePay<br/>on-ramp"]
    SP -->|USDC| EW["Employee<br/>wallet"]
```

### Per-payee transfer

```bash theme={"dark"}
curl -X POST https://api.spherepay.co/v2/transfer \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": "5000.00",
    "customer": "customer_123",
    "source": {
      "type": "bank_account",
      "id": "bankAccount_company",
      "currency": "usd",
      "network": "ach"
    },
    "destination": {
      "type": "wallet",
      "id": "wallet_123",
      "currency": "usdc",
      "network": "sol"
    }
  }'
```

### Batch processing

For multiple employees, fan out transfers in parallel:

```javascript theme={"dark"}
const employees = [
  { customerId: "customer_employee_1", amount: "5000.00", walletId: "wallet_1" },
  { customerId: "customer_employee_2", amount: "4500.00", walletId: "wallet_2" },
  { customerId: "customer_employee_3", amount: "6000.00", walletId: "wallet_3" },
];

const transfers = await Promise.all(
  employees.map(emp =>
    createTransfer({
      amount: emp.amount,
      customer: emp.customerId,
      source: {
        type: "bank_account",
        id: COMPANY_BANK_ID,
        currency: "usd",
        network: "ach",
      },
      destination: {
        type: "wallet",
        id: emp.walletId,
        currency: "usdc",
        network: "sol",
      },
    })
  )
);
```

## Model 2 — Fiat payroll (off-ramp)

USDC from your company wallet → USD → employee bank account.

```mermaid theme={"dark"}
flowchart LR
    CW["Company<br/>wallet (USDC)"] -->|USDC| SP["SpherePay<br/>off-ramp"]
    SP -->|USD ACH / Wire| EB["Employee<br/>bank account"]
```

### Per-payee transfer

```bash theme={"dark"}
curl -X POST https://api.spherepay.co/v2/transfer \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": "5000.00",
    "customer": "customer_123",
    "source": {
      "type": "wallet",
      "id": "wallet_company",
      "currency": "usdc",
      "network": "ethereum"
    },
    "destination": {
      "type": "bank_account",
      "id": "bankAccount_123",
      "currency": "usd",
      "network": "ach"
    }
  }'
```

## Automated recurring payroll

For recurring payroll, use [Offloader Wallets](/concepts/automation/offloader-wallets) or [Onramper Accounts](/concepts/automation/onramper-accounts) instead of one-off transfers:

1. Create an Offloader Wallet or Onramper Account for each employee.
2. Send stablecoins to their Offloader Wallet (or fiat to their Onramper Account).
3. SpherePay auto-converts to the destination currency and deposits on the configured rail — no per-payment API call required.

## Compliance considerations

* **KYC every payee.** Every recipient must be a verified customer.
* **Collect tax information.** You're responsible for tax reporting (W-9, W-8BEN, etc.).
* **Document transfers.** Maintain records of all payroll disbursements.

## Best practices

* **Batch carefully.** Group transfers to minimize API calls but watch for rate limits.
* **Handle failures gracefully.** Build retry logic for failed transfers.
* **Use idempotency keys.** Prevent duplicate payments.
* **Communicate with payees.** Let employees know expected settlement times.

## Settlement times

| Payment type | Method | Settlement             |
| ------------ | ------ | ---------------------- |
| USD → USDC   | ACH    | Same/next business day |
| USD → USDC   | Wire   | Within 30 minutes      |
| EUR → USDC   | SEPA   | Same/next business day |
| USDC → USD   | ACH    | Same/next business day |
| USDC → USD   | Wire   | Within 30 minutes      |
| USDC → EUR   | SEPA   | Same/next business day |

## Related

<CardGroup cols={2}>
  <Card title="Transfers API" icon="arrow-right-left" href="/concepts/transfers/overview">
    Create on-demand on-ramp and off-ramp transfers with full control over timing and amount.
  </Card>

  <Card title="Offloader Wallets" icon="wallet" href="/concepts/automation/offloader-wallets">
    Automated stablecoin-to-fiat transfers using dedicated wallet addresses.
  </Card>

  <Card title="Onramper Accounts" icon="landmark" href="/concepts/automation/onramper-accounts">
    Automated fiat-to-stablecoin conversions using virtual bank accounts.
  </Card>

  <Card title="Individual KYC" icon="user-check" href="/concepts/onboarding/individual-kyc">
    Onboarding employees and contractors.
  </Card>
</CardGroup>
