Every payment an agent makes settles on-chain directly to your payout address — there is no batching, holding period, or T+1 cycle. This guide covers the settlement lifecycle, where funds land, how to read the fee breakdown, and how to reconcile your books.

Settlement lifecycle

When an agent pays an order, settlement happens in the same flow: the Policy Service co-signs, and an ERC-3009 TransferWithAuthorization moves USDC on Base to your payout address with ~1 second finality. You are paid the moment the payment succeeds. A settlement (stl_ ID) moves through three states: Failed settlements are terminal — SohoPay never silently retries a settlement. The agent must resubmit the payment (orders expire after 10 minutes), and the failure reason tells you which side needs to act.

Payout destinations

Settlements pay out to the USDC wallet address on Base you registered during onboarding. You can change it under Settings → Payout in the dashboard; changes to the payout address on mainnet require re-confirmation by your authorized signer.
Bank off-ramp is on the roadmap, not shipped. Today the only payout destination is a Base USDC address. Fiat off-ramping (USDC → bank account) is planned post-mainnet — until then, use an exchange or off-ramp provider of your choice.

Fee breakdown per settlement

SohoPay’s fee is 5%, charged to the operator’s credit line — you always receive the full order amount. Fetch any settlement to see the exact math:
Settlement
merchant_amount always equals gross_amount. The operator_fee (3% LP yield + 2% protocol revenue) is informational for you — it’s drawn from the operator’s credit line, not your payout. Full policy is in Fees.

CSV export

For accounting, export settlements over any date range. The export runs asynchronously and returns a download URL:
The CSV contains one row per settlement with settlement_id, payment_id, agent_id, amounts, onchain_tx, and timestamps. The same export is available in the dashboard under Settlements → Export.

Reconciliation tips

  • Reconcile against the chain, not the API. Every completed settlement has an onchain_tx; the USDC Transfer event in that transaction is the ground truth for your books.
  • Key on settlement_id. Payments and settlements are 1:1, but treat stl_ as your ledger primary key and pay_/ord_ as references.
  • Consume webhooks, sweep with exports. Use merchant.settlement.completed webhooks for real-time ledger entries, then run a daily CSV export as a completeness check — webhook delivery is at-least-once, not guaranteed-exactly-once.
  • Expect exact amounts. USDC settlements have no FX, spread, or merchant-side fee. Any discrepancy between merchant_amount and the on-chain transfer is a bug — report it with the request_id.

Disputes

Because settlement is instant and on-chain, there is no chargeback mechanism — disputes are handled between you and the operator, with the operator liable for its agents’ transactions. See the trust model for how liability is assigned and what SohoPay will and won’t arbitrate.

Test it

  • Settle a sandbox payment and fetch its settlement — confirm merchant_amount equals gross_amount and fee_breakdown sums to operator_fee
  • Open the onchain_tx on Sepolia Basescan and match the USDC transfer to your payout address
  • Receive merchant.settlement.completed on your webhook endpoint
  • Run a CSV export for today and confirm the settlement appears in it

Next steps

Webhooks

Real-time settlement notifications with HMAC verification.

Fees

The full 5% fee policy and how the operator side works.

Trust Model

Liability, dispute handling, and what’s enforced on-chain.