TronDealer suma Bitcoin nativo a su pasarela multichain. Aceptá BTC on-chain (P2WPKH bech32) y elegí cómo recibís el valor: crédito automático en QvaPay, oferta P2P Zelle o sweep directo a tu wallet con fee 0.4 por ciento. Conversión BTC a USD congelada al momento del depósito, webhooks firmados HMAC y settlement automatizado sin custodia manual.
Después de meses operando exclusivamente con stablecoins, TronDealer da el primer paso hacia ser una pasarela multi-asset al estilo NOWPayments: desde hoy aceptamos Bitcoin nativo on-chain. Y no es solo "agregar otra red al checkout". Es un cambio de modelo: ahora podés cobrar en BTC y elegir cómo recibís el valor —saldo QvaPay, oferta P2P Zelle o sweep directo a tu wallet— con el monto convertido a USD al precio del momento del depósito.
Este artículo explica qué se lanzó, por qué importa para tu negocio, cómo funciona técnicamente por dentro y cómo encaja en el ecosistema de pagos que ya conocés.
bc1q...) generadas por cliente.Si vendés productos o servicios online y querés expandir el universo de clientes que pueden pagarte, no aceptar Bitcoin es dejar dinero sobre la mesa. Hay tres razones concretas:
USDT y USDC son perfectos para quien ya está dentro del ecosistema cripto. Pero para el cliente promedio que tiene "algo de Bitcoin guardado", BTC sigue siendo el activo digital por defecto. Es lo que la gente compra primero, lo que aparece en cada noticia, y lo que entienden hasta los menos técnicos. Aceptar BTC abre tu tienda a un segmento de usuarios que jamás se metió con stablecoins.
Bitcoin se transfiere entre cualquier dirección del planeta sin intermediarios, sin KYC y sin permisos bancarios. Para un negocio que vende a Cuba, Venezuela, Argentina, Colombia o cualquier mercado donde el rail bancario internacional es hostil, BTC es infraestructura financiera real, no especulación.
Las stablecoins están atadas al dólar por diseño. Bitcoin, en cambio, históricamente se ha apreciado contra el USD en horizontes de 4+ años. Si elegís el flujo de payout a tu wallet, podés decidir mantener una parte del cobro en BTC como reserva de valor —algo que no podés hacer con USDT/USDC sin convertir manualmente en un exchange.
Cobrar en BTC no es trivial. A diferencia de USDT en TRON o USDC en Solana —donde el monto on-chain ya viene en valor USD (1:1)— Bitcoin tiene tres complicaciones que toda pasarela seria tiene que resolver:
1. Modelo UTXO, no de cuenta. En Ethereum o TRON el "balance" de una dirección es un número en una tabla. En Bitcoin, el balance es la suma de "salidas no gastadas" (UTXOs) dispersas por la cadena. Para barrer fondos hay que tomar cada UTXO, firmarlo individualmente, y armar una transacción consolidadora.
2. Sin método de "consultar balance". Los nodos públicos de Bitcoin Core no exponen los RPCs de wallet (listunspent, getreceivedbyaddress). No hay forma directa de preguntarle al nodo "cuánto BTC hay en esta dirección". Hay que escanear la blockchain bloque por bloque y matchear las salidas contra nuestras direcciones activas.
3. Volatilidad on-chain. Si un cliente pagó 0.001 BTC el martes a las 3pm cuando BTC valía $75,000 (= $75 USD), pero tu sistema cobra el martes a las 3:30pm cuando BTC vale $76,500 (= $76.50 USD), ¿qué monto reportás al merchant? ¿Y si entre el depósito y el sweep BTC se mueve 5%?
Cada minuto, un cron lee el último bloque confirmado (getblockcount) y procesa los nuevos hasta 6 por tick. Cada bloque se descarga con getblock(hash, 2) —que devuelve la transacción completa con sus outputs y direcciones— y se matchea contra un Set en memoria con todas las direcciones activas de nuestros clientes. Lookup O(1), comparaciones en microsegundos.
Nos quedamos siempre 1 bloque atrás del tip de la cadena como protección barata contra reorgs depth-1 (huérfanos), que son los más comunes. Los depth-≥2 son aproximadamente un evento al año, y los manejamos vía rollback automático del estado spent si el sweep falla con missing-inputs.
RPC-only: Bitcoin Core JSON-RPC vía nodo propio. Sin Blockstream API, sin Mempool.space, sin BlockCypher como fuentes de verdad. Cero dependencias HTTP-API de terceros para datos de cadena. La única excepción es CoinGecko para el precio BTC/USD, que cacheamos 5 minutos en memoria y nunca afecta la detección on-chain.
Para un usuario que paga $50 en BTC, 6 confirmaciones (~60 min) es una experiencia frustrante. Para un pago de $50,000 es razonable. Por eso el default son 2 confirmaciones (~20 min en steady state) —el punto óptimo para la mayoría de tickets ecommerce— pero es configurable por cliente.
Bitcoin no ha tenido un reorg sustancial en años; 2 confirmaciones cubren el 99.9% de los casos sin sacrificar UX.
Aquí es donde Bitcoin se diferencia de stablecoins. En el momento en que detectamos tu depósito —la primera vez que aparece en un bloque, no cuando llega al sweep— consultamos el precio BTC/USD spot en CoinGecko y lo guardamos en la base de datos como price_usd_at_detect. Este precio es el que viaja en el webhook al merchant, el que se usa para acreditar QvaPay, y el que aparece en la oferta P2P de Zelle.
¿Por qué congelarlo? Porque el cliente "pagó $50" en su mente cuando hizo la transferencia. Si BTC sube o baja entre la detección y el sweep, el monto USD que reportás no debería cambiar; sino estarías reportándole al merchant un valor distinto al que el cliente intentó pagar. El precio congelado da auditabilidad: cualquiera puede verificar amount_native × price_usd = amount en el payload del webhook.
{
"event": "transaction.confirmed",
"data": {
"asset": "BTC",
"amount": "50.42",
"amount_native": "0.00066667",
"price_usd": 75630.00,
"tx_hash": "abc123...",
"vout_index": 0,
"confirmations": 2,
"network": "btc"
}
}El campo amount siempre está en USD —para BTC, USDT, USDC, todas las cadenas— así que tu lógica de negocio compara amount contra order.total sin necesidad de un branch por asset.
Lo más importante para vos como merchant: una vez que el BTC llega y se confirma, vos elegís cómo lo recibís. Configurás esto una vez en Settings del dashboard.
Si tu cuenta TronDealer tiene payout_method: "qvapay" y un qvapay_account configurado, cada depósito BTC confirmado dispara automáticamente una orden en QvaPay que acredita el monto USD equivalente directamente en tu balance. Los BTC se quedan en custodia de TronDealer (que opera la liquidez de USDT en el backend), y vos recibís dólares digitales listos para retirar a tu cuenta bancaria, enviar a otro usuario QvaPay, o pagar servicios desde la app.
Ventaja: Vos nunca tocás BTC. Recibís USD-en-stablecoin, libre de volatilidad, en el ecosistema QvaPay donde ya tenés tu flujo bancario.
Comisión: Cero comisión de sweep adicional —QvaPay aplica su comisión estándar de retiro que ya conocés.
Si tu cuenta tiene payout_method: "zelle" y un zelle_contact (email/teléfono Zelle), cada depósito BTC ≥ $5 USD dispara una oferta P2P en la plataforma de Zelle Offers que un comprador toma para pagarte directamente vía Zelle con dólares de su cuenta bancaria estadounidense.
Ventaja: Recibís USD reales en tu cuenta de banco US sin pasar por exchange ni intermediario. Útil para freelancers, profesionales LatAm con cuenta US, o quien quiere convertir BTC → USD bancario con la mínima fricción.
Comisión: Cero comisión de sweep. El descuento P2P de mercado (~2-3%) lo absorbés vos vs precio spot, que es el costo normal de mover Zelle.
Si tu cuenta tiene payout_method: "wallet" y un sweep_wallet_btc configurado (cualquier dirección BTC: P2PKH, P2SH, P2WPKH, P2TR), cada depósito se barre automáticamente a tu dirección. Los BTC viajan directamente del wallet temporal del cliente a tu wallet personal en una sola transacción consolidadora.
Ventaja: Máximo control. Recibís BTC en la dirección que vos manejás, podés tenerlo como reserva, hardware wallet, lo que quieras. Sin intermediarios.
Comisión: Aplica el WALLET_SWEEP_FEE estándar de TronDealer —0.4% o $0.30 mínimo (lo que sea mayor) para depósitos menores a $10— deducido automáticamente del monto barrido. Por ejemplo:
| Depósito BTC | Equiv. USD | Comisión | Recibís |
|---|---|---|---|
| 0.00066 | ~$49.80 | $0.20 (0.4%) | ~0.00065736 BTC |
| 0.00013 | ~$9.80 | $0.30 (mín) | ~0.00012603 BTC |
| 0.01000 | ~$755 | $3.02 (0.4%) | ~0.00996 BTC |
Más el fee de minero de Bitcoin (típicamente $0.50-$2 por tx dependiendo de la congestión del mempool), que se descuenta del bruto antes que la comisión de TronDealer.
Para que veas exactamente qué pasa cuando un cliente paga:
Vos generás un wallet BTC desde el dashboard o vía API. Devolvemos una dirección P2WPKH (bc1q...) que es tuya y única de ese cliente. La clave privada queda almacenada en nuestra base de datos cifrada y nunca sale del servidor.
El cliente abre su wallet preferido (Phoenix, Muun, Wallet of Satoshi para Lightning—aunque por ahora solo on-chain— o cualquier wallet on-chain) y manda BTC a la dirección que le diste. La transacción entra al mempool de Bitcoin.
En promedio cada 10 minutos un minero arma un bloque y la tx queda confirmada con 1 confirmación. Tu cron del scan procesa ese bloque dentro del próximo minuto.
Insertamos la row en v2_btc_transactions con status: detected, confirmations: 1, price_usd_at_detect: <spot>. Si tu negocio tiene configurado, te enviamos el evento con el payload firmado HMAC.
Latencia total típica: 25-35 minutos desde que el cliente firma la tx hasta que tu sistema interno tiene el balance acreditado. La mayor parte es esperar bloques de Bitcoin; nuestra capa agrega ~30-60 segundos de overhead total.
Si ya estás integrado con TronDealer para stablecoins, el contrato del webhook BTC es 100% backward-compatible. El campo amount siempre representa el valor USD-equivalente, independientemente del asset.
function handleWebhook(event) {
const { asset, amount, amount_native, price_usd, tx_hash } = event.data
// Comparación con order.total — funciona para BTC, USDT, USDC sin branching
if (parseFloat(amount) >= myOrder.total_usd) {
markOrderAsPaid(tx_hash)
}
// Si querés mostrar el monto cripto al usuario en el dashboard:
if (asset === 'BTC') {
console.log(`Pagado ${amount_native} BTC ($${amount} USD @ $${price_usd})`)
}
}La firma X-Signature-256 se computa exactamente igual (HMAC-SHA256(webhook_secret, raw_body)), los códigos de respuesta esperados son los mismos, y el retry policy es idéntico (5 intentos con backoff exponencial para transaction.confirmed; best-effort para transaction.swept; fire-and-forget sin reintentos para el opt-in transaction.confirmation_update).
Hay tres decisiones de diseño que vale la pena explicitar porque diferencian seriamente a TronDealer de otras pasarelas BTC del mercado:
1. No custody confusa. Cuando elegís payout_method: "wallet", los BTC viajan del wallet temporal del cliente directo a tu wallet. TronDealer nunca consolida en una pool interna que después tiene que liquidar contra vos. Cada depósito es trazable on-chain desde el cliente hasta vos.
2. Sin Lightning sin avisar. Por ahora solo soportamos Bitcoin on-chain (Layer 1). Lightning Network está en roadmap pero requiere infraestructura completamente distinta (nodo LN dedicado, canales, gestión de liquidez) y no la prometeríamos antes de tenerla.
3. Sin auto-liquidación a fiat. Si elegís payout_method: "wallet", recibís BTC nativo. Cero conversión forzada a USDT/USDC/dólar. Si querés mantener BTC, lo mantenés. Si querés convertir, vos decidís cuándo y dónde. Si preferís recibir directamente en USD-equivalente, esa es la opción QvaPay o Zelle.
Bitcoin es el primer paso. Lo que viene en orden:
Si ya tenés cuenta TronDealer, no tenés que hacer nada nuevo en el plugin de WooCommerce o en tu integración API. Bitcoin aparece como una opción más en el dashboard. La próxima vez que generes un wallet, elegís la red btc y el flujo continúa.
Si todavía no tenés cuenta, registrate gratis en /onboard y configurá tu método de payout preferido. La API key que recibís sirve para todos los assets —stablecoins y BTC— sin diferenciación.
Bitcoin está activo en producción pero seguimos puliendo aristas. Si encontrás algo raro, querés sugerir una mejora, o tu caso de uso requiere algo que no contemplamos, escribinos a [email protected] o abrí un issue en el repo de WooCommerce.
webhook_urltransaction.incomingCuando el siguiente bloque encadena, la confirmación pass del scan promueve la row a status: confirmed, confirmations: 2. Disparamos el evento transaction.confirmed —el principal— y disparamos el flujo de payout configurado (QvaPay, Zelle o sweep wallet).
Mientras esperas ese segundo bloque, si activaste notify_confirmation_updates (PATCH /api/v2/clients/me con {"notify_confirmation_updates": true}) también recibes eventos transaction.confirmation_update con el conteo en vivo y un campo min_confirmations — para que tu UI muestre "1 de 2 confirmaciones" en lugar de un pendiente congelado. Los bloques de ~10 minutos de Bitcoin son exactamente donde este evento vale la pena. Es cosmético y fire-and-forget: sin reintentos, y nunca acredites saldo desde él.
Cada 10 minutos un cron de sweep barre los wallets con depósitos confirmados. Construimos una PSBT consolidadora, firmamos con la clave privada del wallet temporal, y broadcasteamos al mempool de Bitcoin. Si configuraste payout_method: wallet, los fondos llegan a tu dirección; si configuraste QvaPay o Zelle, llegan a la custodia de TronDealer (que ya acreditó tu balance en el paso 5).
Tras el broadcast exitoso del sweep, te enviamos transaction.swept con el hash on-chain del sweep, el monto neto, la comisión aplicada, y el destino. Útil para reconciliación contable.