Skip to main content

CoinJoin privacy

CoinJoin is a privacy-enhancing technology built into Trezor Suite that allows you to break the link between your Bitcoin transactions, making it significantly harder to track your transaction history on the blockchain.
CoinJoin is currently available for Bitcoin (BTC) only. Support for other networks may be added in the future.

What is CoinJoin?

CoinJoin is a privacy technique that combines multiple Bitcoin transactions from multiple users into a single transaction. This makes it difficult for blockchain analysts to determine which inputs correspond to which outputs.

How it works

1

Mixing pool

Your Bitcoin joins a pool with other users who want to enhance their privacy.
2

Coordinator

A coordinator (run by Trezor Suite) orchestrates the mixing process without gaining custody of your funds.
3

Combined transaction

All participants create a single transaction with multiple inputs and outputs of equal amounts.
4

Anonymity set

After mixing, it’s unclear which input corresponds to which output, creating plausible deniability.
Your Trezor device maintains full control of your private keys throughout the entire CoinJoin process. The coordinator never has access to your funds.

Setting up CoinJoin

CoinJoin requires a special account type optimized for privacy.

Creating a CoinJoin account

1

Navigate to Bitcoin accounts

In Suite, select your Bitcoin wallet and click the + icon to create a new account.
2

Choose Coinjoin account

Select Coinjoin as the account type. This creates a specialized account with privacy features enabled.
3

Configure privacy settings

Set your desired anonymity level:
  • Low: Faster mixing, lower privacy
  • Medium: Balanced speed and privacy (recommended)
  • High: Slower mixing, maximum privacy
4

Fund the account

Transfer Bitcoin to your CoinJoin account. Only transfer from the account you want to anonymize.
Don’t send Bitcoin directly from an exchange to your CoinJoin account. First send to a regular Suite account, then transfer to CoinJoin.

Anonymity levels

The anonymity level determines how many mixing rounds your coins will go through:
  • Rounds: 1-2
  • Time: 1-4 hours
  • Privacy: Basic anonymization
  • Use case: Quick privacy boost

Using CoinJoin

Starting a CoinJoin session

1

Open CoinJoin account

Navigate to your CoinJoin account in Suite.
2

Review conditions

Ensure you meet the requirements:
  • Device connected and unlocked
  • Sufficient balance (minimum 5,000 sats recommended)
  • Suite running and connected to internet
3

Start mixing

Click Start CoinJoin to begin the anonymization process.
4

Keep Suite running

Suite must remain running for the mixing to complete. You can minimize the window but don’t close it.
CoinJoin sessions can take several hours. Start them before going to bed or during work hours.

CoinJoin session phases

The CoinJoin process goes through several phases:
type CoinjoinPhase =
  | 'idle'              // Not running
  | 'connecting'        // Connecting to coordinator
  | 'registering'       // Registering UTXOs
  | 'waiting'           // Waiting for other participants
  | 'signing'           // Signing transaction on device
  | 'broadcasting'      // Broadcasting to network
  | 'success'           // Round completed
  | 'failed';           // Round failed

Monitoring progress

Suite displays real-time progress:
  • Current phase: What’s happening now
  • Rounds completed: How many mixing rounds finished
  • Target anonymity: Goal anonymity set size
  • Current anonymity: Current level achieved
  • Estimated time: Time remaining (approximate)
Progress is not linear. Some rounds complete quickly while others may take longer depending on participant availability.

CoinJoin fees

CoinJoin involves two types of fees:

Coordinator fees

  • Rate: 0.3% of the mixed amount
  • Charged: Per successful mixing round
  • Example: Mixing 1 BTC costs approximately 0.003 BTC per round

Mining fees

  • Standard Bitcoin network fees
  • Split among all participants
  • Typically lower than regular transactions
// Fee calculation example
const calculateCoinjoinCost = (
  amount: number,
  rounds: number,
  coordinatorFeeRate: number = 0.003
) => {
  const coordinatorFees = amount * coordinatorFeeRate * rounds;
  const miningFees = estimateNetworkFee();
  return coordinatorFees + miningFees;
};
Total fees depend on your anonymity target. Higher privacy levels require more rounds and thus higher fees.

Best practices

Always send from an exchange to a regular Suite account first, then transfer to your CoinJoin account. This prevents exchanges from flagging your account.
CoinJoin requires Suite to be actively running. Closing Suite interrupts the process and you’ll need to start over.
Mixing very small amounts (< 5,000 sats) is inefficient due to fees. Consider accumulating more before mixing.
After mixing, avoid combining multiple outputs in a single transaction, as this can reduce privacy gains.
Enable Tor in Suite settings to hide your IP address from the coordinator.

Privacy considerations

What CoinJoin protects

Breaks the link between your old and new UTXOs
Makes it harder to track your spending history
Provides plausible deniability for transactions
Increases your financial privacy on the blockchain

What CoinJoin doesn’t protect

CoinJoin is not a silver bullet for privacy. It doesn’t protect against:
  • IP address tracking (use Tor)
  • Poor operational security
  • Combining mixed and unmixed coins
  • Exchange KYC requirements

Troubleshooting

Check blockers:
  • Device must be connected and unlocked
  • Internet connection required
  • Minimum balance threshold
  • Backend connectivity
Common solutions:
  • Restart Suite
  • Reconnect device
  • Check internet connection
  • Verify account balance
Reasons for delays:
  • Waiting for other participants
  • Network congestion
  • Coordinator maintenance
What to do:
  • Be patient - sessions can take hours
  • Keep Suite running
  • Check coordinator status
  • Try again during peak hours (more participants)
Common causes:
  • Device disconnected during signing
  • Another participant dropped out
  • Network issues
Solution:
  • Suite automatically retries
  • No funds are lost
  • Failed rounds don’t incur fees
If your UTXO is flagged as problematic:
  • Review why it was flagged
  • Wait for the ban period to expire
  • Contact support if you believe it’s an error
interface PrisonInmate {
  id: string;          // UTXO identifier
  reason: string;      // Why it was flagged
  bannedUntil: number; // Unix timestamp
}

Technical details

CoinJoin service architecture

Suite implements CoinJoin using a client-server architecture:
import { CoinjoinBackend, CoinjoinClient } from '@trezor/coinjoin';

class CoinjoinService {
  backend: CoinjoinBackend;  // Blockchain communication
  client: CoinjoinClient;    // Coordination logic
  
  async createInstance(symbol: 'btc' | 'test') {
    const config = getCoinjoinConfig(symbol);
    this.backend = new CoinjoinBackend(config);
    this.client = new CoinjoinClient(config);
  }
}

Desktop vs Web

  • Full CoinJoin support
  • Runs in background
  • Better performance
  • Can mix while minimized
For best CoinJoin experience, use Suite Desktop.

Development and testing

For developers working with CoinJoin:

Local CoinJoin backend

# Start local CoinJoin backend (Regtest)
./docker/docker-coinjoin-backend.sh

# Backend control panel at:
# http://localhost:8080/

Configuration

  1. Enable Debug mode in Suite (click “Settings” header 5 times)
  2. Go to Settings → Crypto and enable Bitcoin Regtest
  3. Set custom backend to http://localhost:19121/
Local CoinJoin backend requires VPN for affiliate server communication.

Security

Overall security features and best practices

Transactions

Viewing and managing your transaction history

Send and receive

Basic cryptocurrency transactions

Application settings

Enable Tor and other privacy settings

Build docs developers (and LLMs) love