Skip to main content
Rhinestone collects eligible app fees with the transaction and credits your project, identified by the app JWT for embedded wallets or the API key for custom signer integrations. You can monitor the resulting USD balance on the Dashboard’s App fees screen or through the project-level SDK.

How collection works

  1. Prepare a smart-account transaction with the appFees rate described in Set up.
  2. Display the quoted fee before the user signs: the embedded wallet’s review shows it; with a custom signer, show it in your own UI.
  3. Sign and submit the selected quote through your normal transaction flow.
  4. Rhinestone collects an eligible fee with the transaction; verified delivery makes it earned revenue for your project.
  5. Withdraw the available project balance from App fees.
The rate applies to a different value depending on the transaction: For a fixed-output transaction, the fee is an additional debit and the user still receives the requested amount. For a max-out transaction, the fee comes from the balance being spent.

Collection limitations

App-fee collection requires:
  • A smart account. EOAs cannot carry an app fee.
  • A route that supports onchain fee collection.
  • An eligible asset in the transaction, such as a major stablecoin or wrapped native token.
On EVM, a transaction can still execute without the fee if the selected route cannot collect it; inspect the quote before signing. Solana deposits follow a stricter collection and retry policy. App fees cannot be sponsored.

Monitor balances

For either wallet integration, view balances on the Dashboard’s App fees screen. For programmatic reads, use the project-level @rhinestone/sdk client with a backend-held API key:
The API key determines the project. For embedded-wallet revenue, use the same project identified by your app JWT. These balances are not tied to a wallet account. @rhinestone/wallet does not expose balance reads or withdrawals. Read unavailableUsd through GET /app-fees/balances with x-api-version: 2026-09.caucasus; older API versions and the SDK balance type above expose only the first two fields. Pending delivery is not earned revenue and is not included in these balances; pendingUsd means pending payout, not pending delivery. Balances are valued in USD when fees are collected, so later token price changes do not affect them. They are already net of Rhinestone’s share. That share is taken from the app fee and does not increase the amount charged to the user. The same screen also shows Gross collected for the last 90 days. This analytics figure is before Rhinestone’s share and includes fees you may already have withdrawn, so it is not your live balance.

Set the payout destination

Open App fees and select the project. All active project members can view app-fee balances and withdrawal history. Only owners and admins can set the payout destination or initiate a withdrawal. Set an EVM payout address and enter it again to confirm. Withdrawals are irreversible, so use an address you control on every destination chain you intend to select. Changing the address affects future withdrawals only; an existing withdrawal keeps the address captured when it started.

Withdraw revenue

Accumulated Solana earnings from payout-enabled collection chains join eligible EVM earnings in the full-balance withdrawal at their original USD valuation, net of Rhinestone’s applicable share. Fees awaiting finalized collection or delivery, under refund review, refunded, or already reserved are excluded. Native Solana payouts are not supported.
Collected Solana assets, USD earnings, and EVM payout liquidity are separate. Rhinestone can fund EVM payouts independently of converting collected Solana assets; collection does not guarantee immediate liquidity on every payout destination. To initiate a withdrawal:
  1. Select Initiate withdrawal.
  2. Choose an available EVM destination chain and stablecoin (USDC, USDT0, or USDT, as offered on that chain).
  3. Confirm the full balance sweep and payout address.
A withdrawal sweeps the full withdrawable balance. Partial withdrawals are not supported. Only one withdrawal can be in preparation or signing at a time. After it is broadcast, you can start another from newly collected fees while the earlier payout settles. Withdrawals are asynchronous. An accepted request progresses through Pending, Signing, and Submitted, then finishes as Completed or Failed. The detail view shows the gross amount, Rhinestone share, project payout, destination, and transaction hash when available.
A failed or expired withdrawal remains reserved in the pending balance. It does not automatically return to the withdrawable balance. Contact Rhinestone to have the funds released.