edit_square igindin

MeetCal: Por qué construí Calendly dentro de Telegram

Cada '¿podemos hablar?' en Telegram termina con un enlace de Calendly en el navegador. MeetCal mantiene todo el agendado en un solo chat

Ilya Gindin
translate de  · en  · fr  · pt-br  · ru
leer version ilao dzindin arrow_forward

Hay un momento específico que me rompió.

Alguien me escribe en Telegram: “¿podemos hablar esta semana?” Respondo: “claro, aquí está mi Calendly.” Hacen clic, el navegador se abre, carga lento en el móvil, quizás les pide crear una cuenta, quizás se agota el tiempo. Cinco minutos después están de vuelta en Telegram confirmando el horario. La conversación completa ahora está dividida entre dos apps y una pestaña del navegador.

Esto pasa docenas de veces por semana. Construí MeetCal porque me cansé de esa división.

El problema con Calendly en Telegram

Calendly está bien. Hace lo que dice. Pero el supuesto de producto que tiene incorporado es que agendar es una tarea independiente — algo a lo que navegas deliberadamente, como reservar un vuelo.

Agendar en Telegram no funciona así. “¿Podemos hablar?” es una línea casual en medio de una conversación sobre otra cosa. Cuando dejas caer un enlace de Calendly en ese momento, le estás pidiendo a la otra persona que pause, cambie de contexto, complete un flujo de varios pasos en una interfaz desconocida, y luego regrese. La mitad de las veces el impulso se ha ido cuando vuelven.

La fricción no son solo los pasos adicionales. Es la ruptura en el hilo conversacional. El cambio de contexto señala “esto ahora es una tarea formal de agendado” cuando todo lo que querías era encontrar una hora libre.

Qué hace MeetCal

El host configura su disponibilidad una vez en el bot. A partir de ahí, puedes compartir tu tarjeta de reserva de forma inline — escribe @MeetCalBot en cualquier chat de Telegram y aparece una tarjeta de vista previa enriquecida directamente en la conversación. El invitado la toca, se abre una Mini App dentro de Telegram, elige un horario, listo. Sin navegador, sin email, sin creación de cuenta.

La confirmación y los recordatorios ocurren como mensajes de Telegram. Todo el ciclo — sugerir, reservar, confirmar, recordar — permanece en un solo lugar.

La parte del sharing inline importa más de lo que suena. Significa que no tienes que salir del chat para compartir tu calendario. Solo escribes el nombre del bot a mitad del mensaje y la tarjeta aparece. El destinatario nunca ve un enlace sin formato.

El problema técnico más difícil

La app es React + Vite. Las Telegram Mini Apps te dan acceso a WebApp.MainButton, que es el botón en la parte inferior de la pantalla que flota sobre tu contenido. Es el botón de acción principal en casi todas las Mini Apps.

La API es imperativa: MainButton.show(), MainButton.hide(), MainButton.setText('Reservar horario'), MainButton.showProgress(). Llamas a métodos, Telegram maneja el renderizado.

React es declarativo. Describes el estado, React decide qué renderizar.

El desajuste creó un bug específico: cada vez que el estado del componente cambiaba — incluso el estado no relacionado con el botón — el botón parpadeaba. Desaparecía por un solo frame antes de reaparecer con el texto correcto. En la pantalla de un teléfono esto se ve roto.

La causa raíz era que tenía un único useEffect observando todo el estado relacionado con el botón y llamando a show() y luego setText() en cada render. El breve hide() entre renders era visible.

La solución fue dividir el hook en efectos separados con arrays de dependencias separados. Un efecto solo se ejecuta al montarse para inicializar el botón y adjuntar el manejador de clics. Un efecto separado solo se ejecuta cuando cambia el texto del botón o el estado de carga, y nunca llama a hide() — solo a setText() y showProgress(). La visibilidad se gestiona independientemente con su propio efecto que solo se dispara cuando cambia el flag visible.

Tres efectos en lugar de uno. Cada uno con un array de dependencias mínimo. El parpadeo se detuvo.

Es una cosa pequeña pero tardó medio día aislarla, y es el tipo de cosa que determina si una app se siente nativa o defectuosa.

Lo que la plataforma Mini App hace bien y mal

Bien: la distribución es gratuita. Si el bot funciona, la gente lo encuentra a través de la búsqueda inline. Sin revisión del app store, sin paso de instalación. Las primitivas de UI de Telegram — MainButton, BackButton, feedback háptico, la hoja de compartir nativa — son suficientes para construir algo que se siente como una app real.

Mal: la experiencia de depuración es difícil. Los errores en la Mini App aparecen de maneras que son difíciles de rastrear. El objeto WebApp se comporta diferente en los distintos clientes de Telegram (escritorio, iOS, Android) de maneras que no están documentadas. Pasé un día depurando un problema de layout que solo se reproducía en Android porque el cálculo de la altura del viewport incluye el teclado en una plataforma y no en la otra.

La plataforma es joven. Se siente eso. Pero las restricciones te empujan hacia UIs más simples, lo que generalmente es algo bueno.

Estado actual

MeetCal tiene tres niveles: gratuito (reservas básicas, slots limitados por mes), Starter y Pro. Los niveles de pago desbloquean disponibilidad recurrente, buffers personalizados entre reuniones, y algunas otras cosas que los usuarios avanzados solicitan.

La monetización es a través de Telegram Stars — la moneda interna de Telegram. Es un ajuste natural porque los usuarios nunca salen de la plataforma para pagar. La conversión de gratuito a pago es temprana, pero las personas que pagan tienden a usar el producto en serio.

Qué haría diferente

Habría dedicado menos tiempo al pulido del flujo de reservas en la primera versión y más tiempo al onboarding del host. El momento en que alguien configura su disponibilidad por primera vez es donde la mayoría de la gente abandona. El flujo funciona pero no es lo suficientemente obvio. Seguí optimizando la experiencia del invitado — la persona que reserva — cuando la experiencia del host era el cuello de botella real.

También: habría leído el changelog de Telegram Mini Apps más detenidamente antes de empezar. Hubo cambios en la API entre cuando empecé a construir y cuando publiqué que requirieron reescribir partes de la capa de autenticación. Lección: trata la plataforma como inestable hasta que hayas publicado al menos una versión.

La apuesta central sigue siendo válida. La mensajería es donde vive la atención. El agendado también debería vivir ahí.

← arrow keys or swipe →