Settlement lifecycle
When an agent pays an order, settlement happens in the same flow: the Policy Service co-signs, and an ERC-3009TransferWithAuthorization 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: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
completedsettlement has anonchain_tx; the USDCTransferevent in that transaction is the ground truth for your books. - Key on
settlement_id. Payments and settlements are 1:1, but treatstl_as your ledger primary key andpay_/ord_as references. - Consume webhooks, sweep with exports. Use
merchant.settlement.completedwebhooks 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_amountand the on-chain transfer is a bug — report it with therequest_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_amountequalsgross_amountandfee_breakdownsums tooperator_fee - Open the
onchain_txon Sepolia Basescan and match the USDC transfer to your payout address - Receive
merchant.settlement.completedon 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.

