Fees

The protocol fee is 0.5%. What it applies to, how it splits, and what else costs money on-chain.

Launch promotion: 0% fees through July 31, 2026

During the launch window, the on-chain platform fee is set to 0 bps. Every payment settles in full to the merchant (minus the Stacks network fee, which is unrelated and goes to miners). After July 31, 2026, the standard 0.5% described below resumes. Subscriptions started during the promo will pay 0.5% on renewals after the end date — the contract reads the current fee at the moment of each payment, not at creation time.

There are two kinds of fees on every sBTC Pay transaction: a protocol fee (sBTC Pay's cut, currently 0.5%) and a network fee (paid to Stacks miners to include the transaction in a block). They're separate and charged differently.

Protocol fee: 0.5%

Every payment that lands on the contract — invoice payment, direct payment, subscription payment — splits into two transfers in the same atomic transaction:

  • Merchant receives: amount × 0.995
  • Protocol fee recipient: amount × 0.005

Example

A customer pays an invoice for 100,000 sats (0.001 sBTC).

  • Merchant's wallet receives 99,500 sats
  • Protocol fee recipient receives 500 sats

Both transfers succeed or both revert. The customer sees a single transaction in their wallet, and the dashboard's merchant-received column shows the post-fee amount.

No fee on refunds

When you issue a refund, there's no additional protocol fee — you pay the refund amount from your own wallet directly to the payer.

Can the fee change?

Yes, but with guardrails enforced by the contract itself:

ParameterTypeDescription
Current feeuint
default: 0 bps (launch promo)
Set to 0 for the launch promotion through July 31, 2026. Reverts to 50 bps after.
Maximum fee everuint
default: 500 bps (5%)
Hard-coded ceiling. The contract rejects any fee change above this.
Max change per updateuint
default: 100 bps (1%)
One adjustment cannot move the fee by more than this. Prevents surprise jumps.
Who can updateprincipalContract deployer (governance controlled). Changes are public, on-chain, and emit an event.

If the fee ever changes, the update is an on-chain transaction that emits a platform-fee-updated event. Anyone can see the current rate by calling the get-fee-rate read-only function or reading the platform-fee-bps data var directly.

Network (transaction) fee

Stacks charges a small network fee on every transaction, paid to whichever miner includes it in a block. This is separate from the protocol fee and always paid in STX, regardless of whether the payment itself is sBTC or STX.

Typical amounts at the time of writing:

  • Low-congestion mainnet: 0.001–0.01 STX per transaction
  • High congestion: can spike higher, driven by demand

Who pays the network fee:

  • Customer — when paying an invoice, making a direct payment, or triggering a subscription payment
  • Merchant — when registering, updating their profile, cancelling an invoice, or issuing a refund

Your customer needs STX, even to pay in sBTC

A customer paying an invoice in sBTC still needs a small STX balance to cover the network fee. Most wallets warn the customer if their STX balance is too low. This is a property of Stacks, not sBTC Pay — every dApp on Stacks has this requirement.

Side-by-side example

A full picture of one invoice payment:

  • Invoice amount: 100,000 sats
  • Customer pays: 100,000 sats (+ a few μSTX for network fee)
  • Merchant receives: 99,500 sats
  • Protocol fee: 500 sats
  • Network fee (paid by customer in STX): ~1,000 μSTX

Total cost to the customer: 100,000 sats + ~1,000 μSTX network fee. Everything else is value-flow.

Why 0.5%?

0.5% sits between traditional card processors (2.5–3.5%) and bank wires (flat fee, long settlement). It's low enough that merchants can absorb it without passing it on, but high enough to sustain ongoing infrastructure costs. It's a deliberate early-adopter rate — as adoption scales, the rate can be adjusted (within the guardrails above).

Where to check the current rate

Three authoritative sources, in order of convenience:

  1. Frontend constant: frontend/src/lib/stacks/config.ts exports PLATFORM_FEE_BPS.
  2. Contract read-only: call get-fee-rate on the deployed contract. See Smart Contract Reference.
  3. On-chain data var: read platform-fee-bps directly via the Stacks API.