Transaction Batching in Practice: How Exchanges Cut Bitcoin Fees by 75% With Batch Withdrawals
Transaction batching combines multiple payments into one transaction, saving 75%+ in fees. How exchanges and businesses implement it.
Every Bitcoin transaction carries fixed overhead: version bytes, locktime, input scripts, and output counts that must be included regardless of whether the transaction pays one person or a hundred. Transaction batching consolidates multiple outgoing payments into a single on-chain transaction, amortizing that fixed cost across all recipients. The result is a 75% or greater reduction in total fees: a figure confirmed both by Bitcoin Optech's analysis and by real-world exchange deployments.
For exchanges processing thousands of withdrawals daily, batching is not an optimization: it is a requirement. Without it, withdrawal fees during high-fee periods would become prohibitively expensive for both the platform and its users.
How Batching Works at the Transaction Level
A standard Bitcoin payment has one or more inputs (the coins being spent) and typically two outputs (one to the recipient, one returning change to the sender). Every transaction also includes fixed fields that consume block space regardless of the payment count.
Fixed Overhead Per Transaction
These fields exist in every transaction, whether it pays one recipient or one hundred:
| Field | Size (vBytes) | Purpose |
|---|---|---|
| nVersion | 4 | Transaction format version |
| Input count | 1 | Number of inputs (compactSize) |
| Output count | 1 | Number of outputs (compactSize) |
| nLockTime | 4 | Earliest block/time for inclusion |
| SegWit marker + flag | 0.5 | Signals witness data |
| Total overhead | ~10.5 | Paid once per transaction |
On top of this, each input adds 57 to 148 vBytes depending on the address type, and each output adds 31 to 43 vBytes. In a non-batched transaction, the sender also creates a change output to return unspent funds: another 31+ vBytes.
The Math Behind 75% Savings
Consider an exchange that needs to process 20 withdrawal requests. Without batching, each withdrawal becomes its own transaction with one input, one payment output, and one change output:
- Per transaction (P2WPKH): ~10.5 overhead + 68 input + 31 payment output + 31 change output = ~141 vBytes
- 20 transactions total: 20 × 141 = 2,820 vBytes
- At 25 sat/vB: 70,500 sats in fees (~$47 at $67,000/BTC)
With batching, those 20 payments become a single transaction with one input, 20 payment outputs, and one change output:
- Batched transaction: ~10.5 overhead + 68 input + (20 × 31 payment outputs) + 31 change output = ~730 vBytes
- At 25 sat/vB: 18,250 sats in fees (~$12)
- Savings: 74% reduction in total fees
Per-recipient cost: In the batched scenario, each withdrawal effectively costs ~36.5 vBytes instead of ~141 vBytes. The marginal cost of adding one more recipient is just 31 vBytes (the size of a single P2WPKH output), because the overhead, input, and change output are shared.
Fee Savings by Batch Size
The savings are not linear. The first few recipients added to a batch yield the largest marginal improvement because the fixed costs are spread over a rapidly growing denominator. Beyond 10 to 15 recipients, each additional payment contributes smaller incremental savings.
| Batch Size | Total vBytes | Per-Recipient vBytes | Fee Savings vs. Individual |
|---|---|---|---|
| 1 (no batching) | 141 | 141 | 0% |
| 2 | 172 | 86 | ~39% |
| 5 | 265 | 53 | ~62% |
| 10 | 420 | 42 | ~70% |
| 20 | 730 | 36.5 | ~74% |
| 50 | 1,660 | 33.2 | ~76% |
| 100 | 3,210 | 32.1 | ~77% |
These figures assume a single P2WPKH input. Real-world batches often require multiple inputs (especially if the exchange's UTXO set is fragmented), which reduces the percentage savings but still yields substantial improvement over individual transactions.
How Exchanges Implement Batching
Production batching systems must balance three competing goals: minimize fees, minimize withdrawal delay, and manage operational complexity. Exchanges use three primary strategies.
Time-Based Batching
The simplest approach: accumulate all pending withdrawals and broadcast a batch at fixed intervals. Bitcoin Optech recommends starting with an hourly cron job that sends all pending payments.
Binance reportedly batches withdrawals every 15 to 30 minutes. Kraken uses a 5 to 30 minute processing window for standard withdrawals, with extended windows for enhanced-security accounts or high-value transactions. The advantage is predictability: both the exchange and its users know roughly when withdrawals will be processed.
Threshold-Based Batching
Payments are batched when the accumulated count or total value crosses a configured threshold. Bull Bitcoin's open-source Batcher tool implements this with configurable parameters: a target BTC amount that triggers immediate execution, a maximum wait time before forcing a batch, and a polling interval to check whether the threshold has been reached.
This approach adapts naturally to demand: during high-volume periods, batches fire frequently with many recipients. During quiet periods, the timeout ensures withdrawals are not delayed indefinitely.
Hybrid Approach
Most production systems combine both strategies: broadcast a batch when either the time limit or the value threshold is reached, whichever comes first. This provides a floor on user experience (maximum wait time) while optimizing batch size during periods of high activity.
Which Exchanges Batch (and Which Do Not)
Batching adoption among major exchanges has grown significantly since 2020, but implementation quality varies.
Coinbase launched transaction batching on March 12, 2020, applying it to 100% of Consumer and Pro customer withdrawals. The result was a 75.2% reduction in transaction fees, with 100% of savings passed to customers. Coinbase reported that batching reduced its daily on-chain transaction count by roughly 95%: a change significant enough to visibly reduce confirmed transactions per day across the entire Bitcoin network.
Binance uses automated batching with processing intervals of 15 to 30 minutes. Kraken offers batch processing for withdrawals with configurable processing windows. Mining pools and payment processors also widely use batching to consolidate payouts.
Network-wide impact: Research from Veriphi (cited by Bitcoin Optech) found that full SegWit adoption combined with universal batching could save Bitcoin users hundreds of millions of dollars in cumulative network fees. Even partial adoption has measurably improved network throughput.
Not all platforms batch equally. Some exchanges still process withdrawals individually, particularly those prioritizing instant withdrawal confirmation over fee efficiency. Smaller exchanges may lack the engineering resources to build and maintain batching infrastructure, as it requires careful UTXO management, robust fee bumping capabilities, and transaction monitoring.
UTXO Management Complexity
Batching does not exist in isolation. It interacts directly with how an exchange manages its pool of unspent transaction outputs. Poor UTXO management can undermine batching savings entirely.
The Fragmentation Problem
Each batched transaction produces a change output, and incoming deposits create new UTXOs of varying sizes. Over time, an exchange's wallet accumulates hundreds or thousands of small UTXOs. When it comes time to construct a batch, the wallet may need to combine many small inputs to reach the required total, adding 57 to 68 vBytes per additional input and reducing the percentage savings.
A wallet holding the same total value in 100 small UTXOs versus 5 large UTXOs will pay dramatically different fees for identical payment amounts. The difference can reach hundreds of dollars per transaction during high-fee periods.
Consolidation Strategy
Bitcoin Optech recommends a two-phase approach for services using batching:
- Consolidate small UTXOs into larger ones during low-fee periods (at 10 to 20% of normal feerate)
- Use the consolidated UTXOs as inputs for batched withdrawals during normal operations
This consolidation step is critical because it transforms the UTXO set into a shape optimized for efficient batching. Without it, the savings from batching gradually erode as the UTXO set fragments.
Fee Bumping Constraints
Large batched transactions introduce fee bumping complexity. Bitcoin Core's relay policy limits transactions to 101,000 vBytes and enforces a maximum of 25 unconfirmed ancestors or descendants. If recipients re-spend their outputs before the batch confirms, the sender may be unable to bump the fee via CPFP. Using RBF (Replace-By-Fee) to bump a batched transaction replaces the entire transaction, affecting all recipients: a more complex operation than bumping a single-recipient payment.
The Privacy Tradeoff
Batching creates a meaningful privacy cost that exchanges and users should understand. Every recipient in a batched transaction can see all other output addresses and amounts by inspecting the transaction on any block explorer.
Recipient Linkage
While recipients cannot identify who controls the other addresses, they can observe:
- The exact number of other withdrawals processed in the same batch
- The amount sent to each output address
- That all recipients used the same exchange (or service) for withdrawal
In a payroll context, this would mean every employee could see every other employee's payment amount. For exchanges, the risk is lower because withdrawal addresses are typically not tied to publicly known identities, but the linkage still provides chain analysis firms with additional data points.
Transaction Fingerprinting
The one-input-many-outputs pattern is a distinctive fingerprint. Address clustering tools can easily identify batched transactions as originating from exchanges, payment processors, or other high-volume operators. The common-input-ownership heuristic assumes all inputs belong to the same entity: for exchange batching, this assumption is correct, which means analysts can reliably attribute the entire transaction to a known exchange.
Paradoxically, batching can improve privacy in one narrow way: combining many unrelated payments into a single transaction creates noise that makes it harder to trace the flow of any individual payment through subsequent hops.
Implementation Tradeoffs Summary
| Factor | Without Batching | With Batching |
|---|---|---|
| Fee per withdrawal | ~141 vBytes (P2WPKH) | ~32 to 53 vBytes depending on batch size |
| Withdrawal speed | Immediate broadcast | 5 to 60 minute delay |
| Recipient privacy | Only sender and recipient visible | All recipients visible to each other |
| Engineering complexity | Low | Moderate to high |
| UTXO management | Simple | Requires consolidation strategy |
| Fee bumping | Straightforward | Affects all recipients |
| Network impact | High block space usage | Reduced block space usage |
SegWit, Taproot, and Batching Combined
Batching becomes even more effective when combined with modern address types. SegWit reduced input sizes by moving signature data to the witness (which receives a 75% weight discount), and Taproot (P2TR) further reduced key-path spend inputs to 57.5 vBytes while using fixed-size 64-byte Schnorr signatures.
An exchange using P2TR inputs with batching achieves the maximum possible fee efficiency on Bitcoin L1. Each Taproot input saves roughly 10 vBytes compared to P2WPKH, and the fixed-size Schnorr signatures eliminate the variable-length ECDSA encoding that historically caused slight unpredictability in fee estimation.
The combination of full SegWit adoption, Taproot, and universal batching represents the practical upper bound for L1 fee optimization. Beyond this, further savings require moving payments off-chain entirely.
When Batching Is Not Enough
Batching optimizes L1 transactions, but it cannot eliminate the fundamental constraint: every batch still competes for block space and must wait for block confirmation. During fee spikes, even batched withdrawals become expensive. When the mempool is congested, batched transactions wait alongside everything else.
The delay inherent in batching (waiting 5 to 60 minutes to accumulate enough payments) also conflicts with user expectations for instant withdrawals. Exchanges must choose between optimizing fees and providing fast service.
Layer 2 protocols solve this differently. Spark, for instance, enables instant Bitcoin transfers without broadcasting on-chain transactions at all. Because Spark transfers happen off-chain via statechain key rotations, there is no per-transaction overhead to amortize and no block space to compete for. Individual payments are already efficient by default: the entire rationale for batching (amortizing fixed L1 costs) simply does not apply.
For exchanges and businesses processing high volumes of payments, combining L1 batching for on-chain withdrawals with Layer 2 rails for instant transfers provides the best of both approaches: minimal fees when using the base layer, and instant settlement when speed matters.
Building a Batching System
For developers implementing batching, the key decisions are:
- Batch trigger: choose time-based, threshold-based, or hybrid based on your withdrawal volume and user expectations
- UTXO consolidation: schedule regular consolidation during low-fee windows to maintain an efficient input set
- Fee estimation: use conservative fee estimation for batches since a stuck batch delays all recipients, not just one
- Fee bumping: implement RBF signaling on all batched transactions so you can bump the fee if the mempool surges after broadcast
- Monitoring: track confirmation times, fee overpayment, and UTXO set health metrics
Bull Bitcoin's open-source Batcher provides a production-ready reference implementation with configurable batch timeout, threshold amount, and polling interval. Bitcoin Core itself supports sending to multiple recipients in a single sendmany RPC call.
For teams building on Bitcoin and looking to bypass L1 fee complexity entirely, the Spark SDK provides APIs for instant, self-custodial transfers that settle without on-chain transactions. Wallets like General Bread demonstrate this approach in production: users send and receive Bitcoin instantly with no batching delay and no base-layer fee overhead.
Key Takeaways
Transaction batching remains one of the most effective L1 fee optimizations available to Bitcoin businesses. The 75% savings figure is well-documented and achievable with batches as small as 10 to 20 recipients. Major exchanges including Coinbase, Binance, and Kraken have adopted batching, and the tooling is mature enough for any service processing regular Bitcoin withdrawals.
The tradeoffs are real: batching introduces delay, links recipients in the same transaction, and requires ongoing UTXO management. These costs are acceptable for most exchange withdrawal workflows but become problematic for time-sensitive or privacy-critical payments. For those use cases, Layer 2 protocols like Spark eliminate the need for batching entirely by removing the base-layer overhead that makes it necessary.
This article is for educational purposes only. It does not constitute financial or investment advice. Bitcoin and Layer 2 protocols involve technical and financial risk. Always do your own research and understand the tradeoffs before using any protocol.

