Canal: Telegram vs WhatsApp — decisión de arquitectura (2026-09-26)

Después de cerrar Cloud API directo ([CREDENCIAL]- antiextraccion.md) y el análisis de biométricos/BSP ([CREDENCIAL].md).

TL;DR

Telegram elimina el 100% de los dos bloqueadores que quedaban: verificación de negocio y costo de números. Cuesta $0, no pide ni un documento, y el prefijo del 1-oct no le aplica. Pierde en una sola cosa: el paciente ya está en WhatsApp.

Por eso la conclusión no es “elige Telegram”. Es: el canal es un adaptador, no el producto, y Telegram va primero porque es el único desbloqueado hoy.

1. Lo que Telegram borra

Bloqueador (identificado antes)Estado con Telegram
Verificación de negocio con documentosNo existe. Ni alta, ni verificación, ni biométricos
Número nuevo por cliente ($150-400 MXN/mes)No hace falta con Business Bot (ver §2)
Registro de número por API + SMSNo aplica
Cap de 2 números sin verificarNo aplica
Templates con aprobación de MetaNo hay templates. El bot escribe a cualquier usuario que lo haya iniciado, sin ventana de 24h ni cooldown
Cliff de precio del 1-oct-2026No hay cliff. 0.1 Stars solo para broadcast pagado (requiere 100,000 Stars + 100,000 MAU — irrelevante)
Costo por mensaje$0 siempre

2. Connected Business Bots: la pieza que cambia el modelo

Telegram permite que un usuario convierta su cuenta en cuenta de negocio y conecte un bot de negocio que procese y responda en su nombre.

  • Un usuario puede conectar un solo business bot (BOT_BUSINESS_MISSING si no tiene el flag bot_business).
  • El bot recibe updateBotNewBusinessMessage / Edit / Delete — los DMs privado que llegan al dueño del negocio.
  • Puede responder como el dueño del negocio: los mensajes “NO se marcan con el nombre del bot desde el punto de vista del cliente” (via_business_connection).
  • No requiere Telegram Premium — “connected bots are also available to non-Premium users”. Premium solo es para el resto de las features business.
  • El cliente es quien conecta su cuenta y su bot desde Ajustes → Telegram Business → Chatbots.

Por qué esto es lo importante: la clínica conserva su identidad. El paciente ve un mensaje de la clínica, no de un bot. Y tú no operas ningún número.

Multi-tenant: un solo bot, N clínicas conectadas, connection_id → tenant. Exactamente la misma forma que phone_number_id → tenant en WhatsApp. La tabla de tenants no cambia de esquema.

3. Soberanía: Telegram le gana a Meta

Meta no tiene equivalente. Telegram publica el código fuente del Bot API Server y tú lo corres: descargas archivos sin límite de tamaño, subes hasta 2000 MB, webhook por HTTP plano, IP local, cualquier puerto, max_webhook_connections hasta 100,000. Requiere api_id/api_hash propios y un servidor persistente.

No cambia los rate limits (30 msg/s sigue siendo 30, confirmado en el repo oficial). El premio concreto es la infraestructura, no el throughput.

Límites con hosting de Telegram (core.telegram.org/bots/faq):

  • 1 mensaje/segundo por chat privado
  • 20 mensajes/minuto por grupo
  • ~30 mensajes/segundo en broadcast masivo gratis
  • 1,000 msg/s con paid broadcasts a 0.1 Stars/msg (irrelevante a escala piloto)

4. El costo: dos tiers, y no son el mismo producto

Tier A — Bot API simple (HTTPS puro)

  • $0. Solo un token de @BotFather.
  • Webhook HTTPS estándar → vive en el mismo Cloudflare Worker que WhatsApp.
  • 20 minutos de trabajo.
  • Contra: es un bot más en la lista del paciente. El mensaje viene firmado como bot, y el paciente tiene que buscarlo e iniciarlo.

Tier B — Connected Business Bot (identidad real de la clínica)

  • $0. El paciente ve a la clínica, no a un bot.
  • Contra: es MTProto, no HTTPS. account.updateConnectedBot y invokeWithBusinessConnection son MTProto puro. En un Cloudflare Worker eso significa TCP sockets + crypto, no un POST. Los métodos de envío aceptan el parámetro business_connection_id en la Bot API normal, pero el registro de la conexión y el envelope de invocación son MTProto.
  • Pendiente de verificar: si la Bot API expone los business message updates o si el bot necesita un proceso con TDLib. Si necesita TDLib, no vive en el Worker y aparece un componente persistente (Hetzner/OCI/local).
  • No se puede asumir. Esto decide si Telegram cabe en la misma infra que WhatsApp o si son dos.

5. La comparación honesta

WhatsApp Cloud APITelegram Business Bot
Documentos / biométricosVerificación de negocioNinguno
Costo fijo$17-47 USD/mes (números)$0
Costo por mensaje$0 hasta 1,000/número/mes, luego MXN 0.1565$0
Identidad del canalNúmero nuevo que tú operasLa cuenta que la clínica ya tiene
OnboardingApp + token + registro por API + SMS@BotFather, y la clínica conecta su bot
Cap de cuentas2 sin verificar1 bot por cuenta, N cuentas por bot
TemplatesAprobación de MetaNo hay
AlcanzabilidadEl paciente ya está ahíHay que invocarlo
InfraestructuraHTTPS → WorkerMTProto → probable proceso aparte
Auto-alojadoNo (red de Meta)Sí, fuente oficial publicada
Residencia de datosNo puedes fijarla a MXAmsterdam + Miami, opacidad de retención

6. La decisión

Reach es el único eje donde Meta gana, y es el único que decide el proyecto. Un paciente dental mexicano ya tiene WhatsApp. Pedirle que instale Telegram es fricción que mata la conversión, y ninguna otra ventaja lo compensa. Para ese caso de uso, WhatsApp es el canal correcto.

Pero el orden de construcción se invierte:

  1. Telegram primero. No porque sea mejor, sino porque es el único desbloqueado hoy: Meta te tiene esperando paperwork y onboarding, Telegram te tiene esperando un mensaje a @BotFather. Es el primer canal que puedes shipping antes de tener un solo cliente — que es exactamente lo que pide “ship the smallest real version”.
  2. El 1-oct es la ventana. Meta empieza a cobrar dentro de 5 días. Telegram no tiene cliff. Empezar por Telegram significa que el RAG está productor antes de que exista el precio.
  3. WhatsApp después, cuando haya cliente pagando y la verificación de negocio valga la pena (PLBV o ruta de volumen, ver documento anterior).
  4. El argumento de venta: “no dependemos de Meta, arrancamos hoy y agregamos WhatsApp cuando lo necesites”. Al revés no se puede.

Y la regla de los dos documentos anteriores no cambia: el canal produce respuestas, nunca devuelve documentos. Telegram con Business Bot es un oráculo igual de peligroso — connection_id da acceso al DMs de una clínica real.

7. Ventaja dental específica (secundaria)

Telegram Business trae horarios, ubicación, quick replies, greeting y away message; los voice notes y el multimedia (50 MB, antes/después) son mejores que una template de WhatsApp para post-operatorio. Pero esto es bonus al reach: no compensa.

Facts verificados contra

  • core.telegram.org/api/bots/connected-business-bots (un business bot por cuenta, flag bot_business, sin Premium, updateBotNewBusinessMessage, via_business_connection no revela el nombre del bot al cliente, invokeWithBusinessConnection)
  • core.telegram.org/api/business (connected bots disponibles para no-Premium)
  • core.telegram.org/bots/faq (1 msg/s por chat, 20/min por grupo, ~30 msg/s gratis, paid broadcasts 1000/s a 0.1 Stars)
  • core.telegram.org/bots/api (Local Bot API Server: fuente publicada, archivos sin límite, upload 2000 MB, HTTP plano, IP local, cualquier puerto, max_webhook_connections hasta 100,000)
  • github.com/tdlib/telegram-bot-api (los local limits no cambian los bot limits; solo HTTP, requiere api_id/api_hash, requiere proxy TLS)
  • telegrambots.github.io/book/4/business.html (businessConnectionId en métodos de Bot API; CanReply limitado a chats activos en las últimas 24h; el banner con el nombre del bot sí aparece en el chat privado del dueño)

CORRECCIÓN (2026-09-26, tarde) — el §4.4 estaba mal

Consulté core.telegram.org/bots/api directamente. El Bot API va en 10.3 (24-ago-2026) y Update tiene business messages como campos de primera clase:

  • business_connection
  • business_message
  • edited_business_message
  • deleted_business_messages
  • Message.business_connection_id (y sender_business_bot en los salientes)

Recibir business messages es un webhook HTTPS normal. No hace falta MTProto ni un proceso con TDLib. El MTProto queda solo del lado del usuario que conecta el bot (account.updateConnectedBot), que es una acción de la clínica en su cliente.

Lo que dije en §4.4 (“probable componente persistente aparte”) es incorrecto para el Bot API actual. Telegram y WhatsApp viven en el mismo Worker. Corregido aquí para que no queden dos versiones contradictorias.

Residual por verificar: que los métodos de envío acepten business_connection_id sobre HTTPS. La doc de la librería .NET (que sigue el Bot API) dice que sí, y Message.business_connection_id existe; comprobar en el método concreto al implementar.

Detalle de flag: User.can_connect_to_business (devuelto solo en getMe) — hay que checarlo para saber si el bot puede conectarse a cuentas de negocio.

Mini Apps — datos (consultados 2026-09-26)

Qué es: NO aloja tu app

Telegram aloja el runtime (el WebView y sus APIs nativas). La app es tuya y se aloja donde quieras — un Cloudflare Worker, tu servidor, lo que sea. Eso es soberanía máxima y es la misma infraestructura del RAG. Siete formas de lanzarla: botón de perfil, botón de teclado, botón inline, botón de menú, inline mode, direct link (t.me/<bot>/<appname>) y attachment menu.

La URL de la Mini App es la de tu servidor. Telegram no guarda tu código ni tu corpus; guarda la sesión.

Auth: el punto clave para anti-extracción

initData se valida server-side con el token del bot. Desde Bot API 8.0, terceros (builders, SDKs externos) que procesan datos de una Mini App pueden validar sin conocer el token del bot de la clínica.

Eso significa que tú puedes operar el producto de una clínica sin tener su token de bot. Es la propiedad anti-extracción más fuerte que hemos encontrado, y no existe equivalente en WhatsApp (ahí el token lo tiene el integrador, y el integrador puedes ser tú o el cliente).

Lo nuevo que importa para un RAG

Rich Messages (10.1, 11-jun-2026) — hecho para RAG. Texto estructurado con entidades de bloque: RichBlockParagraph, RichBlockList, RichBlockTable, RichBlockCollage, RichBlockSlideshow, RichBlockMap, RichBlockDetails (expandible/colapsable), RichBlockPullQuotation, RichBlockBlockQuotation, RichBlockPhoto, RichBlockVideo, RichBlockVoiceNote, RichBlockAudio, RichBlockSectionHeading, RichBlockFooter, RichBlockDivider, RichBlockMath, RichBlockThinking, RichBlockPreformatted. Inline: bold, italic, underline, strikethrough, spoiler, sub/superscript, marked, code, custom emoji, link, botón inline (RichMessageButton, RichTextButton, RichBlockButtons).

La doc lo dice textualmente: “allowing bots to send highly structured text and stream AI-generated replies with seamless rich formatting”. sendRichMessageDraft hace streaming de parciales; editRichMessageText permite reescritura. RichBlockThinking expone razonamiento. Botones inline = RAG interactivo.

Para una clínica: un plan de tratamiento como tabla, un bloque colapsable de “qué esperar tras la cirugía”, botones de agendar. Nada de eso existe en el canal de texto.

Ephemeral Messages (10.2, 14-jul-2026) — el control anti-oráculo nativo. Mensajes que el bot envía a un chat y que solo ve ese receptor y el bot, con ephemeral_message_id, editables y borrables. En un grupo, la respuesta del RAG es invisible para los demás. Esto es la respuesta de plataforma a la fuga de §5 del primer documento, y reduces la necesidad de controles propios.

Control de generación: can_stop / keep_on_stop en sendMessageDraft + update MessageGenerationStopped. El usuario corta la generación. Bueno para respuestas largas con inferencia pagada.

Stars y Mini App Store: suscripciones pagadas con Telegram Stars (múltiples tiers), regalos, Apple Pay y Google Pay vía terceros. Los bots con Main Mini App que aceptan Stars pueden aparecer en el Mini App Store — distribución que Meta no ofrece.

Almacenamiento (el que eliges, y importa para soberanía):

  • CloudStorage (6.9) → en servidores de Telegram. Evitar para datos de paciente.
  • DeviceStorage (9.0) → local en el dispositivo.
  • SecureStorage (9.0) → local, cifrado, nunca sale del teléfono.

Biometría local (7.2, 31-mar-2024): BiometricManager — Face ID / Touch ID / passcode del dispositivo. Es el inverso del miedo original: la biometría la usa el paciente en su propio teléfono y no se transmite. Para expediente dental es un argumento bueno y real.

8.0 (17-nov-2024): fullscreen (retrato/landscape), addToHomeScreen con atajo en home, shareMessage, downloadFile, LocationManager, acelerómetro/ giroscopio, emoji status.

9.6 (3-abr-2026): requestChat — el usuario elige o crea un chat. 9.5 (1-mar-2026): iconCustomEmojiId en BottomButton.

Endurecimiento de seguridad (ya activo)

Bot API 10.2: Telegram prohíbe usar métodos de Mini App desde orígenes distintos al dominio original de la Mini App. Activado automáticamente el 20-jul-2026 para todas las Mini Apps. Se puede opt-out por @BotFather. Es un CSP efectivo: nadie puede inyectar llamadas al SDK desde una página third-party. Bueno, y ya está.

Lo que NO arregla: reach

t.me/<bot>/<appname> abre Telegram. Si el paciente no tiene Telegram, no hay mini app. La Mini App hereda exactamente el techo de alcance del bot. Ninguna de estas capacidades compensa un paciente que no llega.

Arquitectura resultante (tres puertas, un RAG)

Un RAG, un Worker, un corpus, tres frontales:

PuertaAlcanceCostoPara qué
WhatsApp Cloud APIMáximo (el paciente ya está)$17-47 USD/mes + Meta desde 1-octtexto simple, recordatorios
Telegram Bot (Business Bot)Medio$0texto, cero Meta, cero fricción de onboarding
Telegram Mini AppMedio (mismo público que el bot)$0 + tu hostingUI rica, plan de tratamiento, pago, Media,ephemeral

Los tres comparten el mismo corpus en namespace tenant_id. La Mini App es literalmente el canal web con un envoltorio de distribución — o sea, el “web en paralelo” seguro de §7 del primer documento, pero con su propia distribución y con Stars para monetizar.

Y la regla no cambia: el frontal produce respuestas, nunca devuelve documentos. Las Ephemeral Messages ayudan, pero el tope de citas y el refusal de “repite el documento” siguen siendo tuyos.

Facts verificados contra

  • core.telegram.org/bots/api (Bot API 10.3 24-ago-2026; Update.business_message / business_connection / edited_business_message / deleted_business_messages; Message.business_connection_id; sender_business_bot; User.can_connect_to_business solo en getMe; Rich Messages y clases RichBlock*/RichText*; Ephemeral Messages; MessageGenerationStopped; can_stop/keep_on_stop; getUserPersonalChatMessages; guard_bot; Communities; LivePhoto; setWebhook con secret_token y X-Telegram-Bot-Api-Secret-Token; local Bot API server)
  • core.telegram.org/bots/webapps (Mini Apps; 7 formas de lanzamiento; direct link t.me//; main mini app y Apps tab; initData vs initDataUnsafe y validación server-side; terceros validan sin conocer el bot token desde 8.0; DeviceStorage, SecureStorage, CloudStorage, BiometricManager; sendData 4096 bytes; origin hardening; requestChat en 9.6)