por Redouane Achouri* – Entrepreneurship Handbook
Hace unas semanas, tuve la idea de crear un servicio que enviara recordatorios diarios para motivar a la gente a trabajar en sus objetivos. Para empezar, el servicio enviaría un mensaje SMS con una cita inspiradora en un horario seleccionado, por ejemplo justo antes de una sesión de entrenamiento.
Hay muchas aplicaciones de motivación en el mercado que ofrecen un servicio similar: mostrar citas motivadoras en momentos aleatorios o programados, pero no he encontrado ninguna que no requiera la instalación de una aplicación y utilice SMS en su lugar. Así que decidí intentarlo y construir una yo mismo, como proyecto paralelo a mi trabajo actual.
La motivación de este proyecto es doble: trabajar en el diseño del sistema y aprender sobre marketing y crecimiento.
Resultado final: https://www.uppush.me/
StacK: Next.js, Material UI, AWS EventBridge Scheduler, AWS SNS, AWS Lambda, DynamoDB, Terraform.
Diseño de la arquitectura
Hay 4 componentes clave para que esto funcione:
- Un formulario para que los usuarios se inscriban
- Una base de datos para almacenar los horarios de los usuarios y otros metadatos.
- Un programador para activar el envío de un SMS a la hora seleccionada por el usuario.
- Un intermediario de SMS: un servicio que proporciona una API para enviar mensajes SMS a un número de teléfono determinado a cambio de una pequeña tarifa.
Los criterios que tuve en cuenta para diseñar la arquitectura fueron:
Simplicidad: Mantener el diseño lo más simple posible y evitar complejidades innecesarias. Esto facilitará el mantenimiento y minimizará los problemas.
Bajo costo: Elegir opciones gratuitas o de bajo coste, pero sin comprometer la calidad.
Velocidad: Utilizar plataformas y herramientas con las que esté familiarizado para reducir la fricción y avanzar lo más rápido posible.
La landing page y el formulario de inscripción
La página de aterrizaje debe ser capaz de mostrar el valor del servicio a los visitantes, de forma sencilla y concisa. Una vez familiarizados con el servicio, los usuarios deben poder decidir si se registran o no.
Para construir la interfaz de usuario, utilicé Next.js y la biblioteca Material UI. Next.js permite desarrollar rápidamente las API del lado del cliente y del backend, y viene con muchas optimizaciones listas para usar, además de proporcionar una excelente documentación.
El alojamiento se realiza en Vercel, la empresa que creó Next.js, y que ofrece una generosa capa gratuita con cuota suficiente para un proyecto de esta envergadura. También se integra con GitHub y ofrece CI/CD desde el principio.
La base de datos
Por su diseño, la aplicación no depende de grandes lecturas o escrituras en la base de datos y no almacena datos relacionales. Elegí AWS DynamoDB porque encaja perfectamente: No tiene servidor (no hay sobrecarga de aprovisionamiento y mantenimiento), tiene un costo de aprovisionamiento bajo y predecible, y no es SQL.
El programador
Una parte muy interesante y divertida de diseñar e implementar.
Una vez inscritos, los usuarios esperan recibir un SMS a determinadas horas del día y determinados días de la semana, por ejemplo, cada dos días a las 6:00. Hay muchas opciones para programar una tarea.
Hay muchas opciones para un programador de tareas (por ejemplo, Airflow, Celery), pero volviendo a los requisitos de diseño, la solución más sencilla y rápida es Amazon EventBridge Scheduler: no tiene servidor, es fácil de configurar y tiene una generosa capa gratuita.
Se crea una programación de EventBridge (equivalente a una tarea cron) para cada cuadrante de la hora (en el minuto 00, en el minuto 15, en el minuto 30 y en el minuto 45), para cada hora del día y para cada día de la semana. El resultado son 4 cuadrantes x 24 horas x 7 días = 672 horarios.
A cada usuario se le asignan los horarios que corresponden a las horas seleccionadas durante el registro (convertidas a UTC).
Ha sido muy interesante tener en cuenta las zonas horarias de los usuarios durante el registro. En la mayoría de los casos, podemos asumir con seguridad que la zona horaria configurada en la configuración regional del usuario (configuración del sistema) es donde vive el usuario, pero eso no siempre es exacto, porque los usuarios pueden estar viajando, o porque la configuración regional simplemente no se puede acceder o leer desde el navegador. Por lo tanto, el formulario de registro tiene una lista desplegable de todas las zonas horarias comúnmente conocidas que los usuarios pueden seleccionar. El formulario utiliza por defecto la zona horaria leída (o adivinada) en la configuración regional.
Una vez seleccionada una zona horaria, el horario del usuario se convierte de zona horaria local a UTC utilizando la lista de desfases UTC de la base de datos IANA.
El agente de SMS
Para enviar programáticamente un SMS a un número de teléfono determinado, AWS SNS es una opción que se ajusta bien a nuestros requisitos de diseño. Es asequible (aunque no siempre la más barata), y se integra bien con otros servicios de AWS.
Para UpPush.me, cada programación activa una llamada a una función Lambda que obtiene una cita y formatea el mensaje SMS que luego se envía a los suscriptores a través de SNS.
Sin embargo, me encontré con algunos obstáculos que requirieron algunas idas y venidas con el equipo de soporte de AWS (que fue muy receptivo y dispuesto a ayudar, incluso en mi cuenta personal de «nivel básico»):
- Aumentar la cuota de gasto por defecto de 1 $/mes.
- Salir de la caja de arena de SMS para poder enviar mensajes a números de teléfono que no estén restringidos a una lista preestablecida de destinos permitidos.
- Tratando de obtener un Sender ID, que es un requisito de algunos países como la India, que representa un mercado increíble para UpPush.me, dada la gran población. Todavía no he recibido el Sender ID, pero afortunadamente casi todos los países no lo tienen como requisito.
Publicar el servicio
Una vez que tuve un MVP, empecé a compartir UpPush.me en foros para constructores como indiehackers.com y subreddits como r/smallbusiness y r/EntrepreneurRideAlong. ¡El resultado fue que recibí comentarios de otros constructores y tuve mis primeros suscriptores 🎉!
Lo que otros constructores encontraron genial fue la claridad del mensaje de la página de aterrizaje, y cómo transmite la idea y de una manera sencilla y clara.
Otro feedback común sobre el servicio fue que la UI (landing page) necesitaba mejorar, y recibí muchas recomendaciones de usar una herramienta sin código para construir la landing page en lugar de usar una librería React. Aunque es importante tener una interfaz de usuario visualmente atractiva, no es la parte más crítica de UpPush.me. Por lo tanto, en esta etapa, prefiero conservar y mejorar la interfaz de usuario actual, y centrarme en la construcción del servicio, en lugar de invertir en la reconstrucción con una herramienta sin código.
Los usuarios también comentaron que les gustaría añadir funciones como enviar citas y puntuar las citas que les envían por mensaje o autor.
Aprendizajes
La perfección es enemiga de lo bueno
Como ingenieros y desarrolladores, podemos distraernos fácilmente del objetivo de construir un producto que sea útil y deseable para los usuarios y centrarnos en las minucias de construir el producto perfecto. La perfección es enemiga de lo bueno, y es importante definir cuál es el resultado deseado de cualquier proyecto (qué es lo bueno), y establecer salvaguardas que nos impidan dedicar demasiado tiempo y energía a la mera construcción.
Definir plazos
En mi opinión, la salvaguarda más poderosa contra el perfeccionismo son los plazos, porque con ellos el recurso más preciado es el tiempo, y permiten cambiar la perspectiva de «sería bueno tener esto» a «cómo puedo construir y enviar esta función y pasar a la siguiente».
Buscar e integrar continuamente los comentarios
Construir un servicio sin saber lo que los usuarios quieren realmente tiene el doble efecto negativo de perder recursos (tiempo, energía) y crear un impulso que nos aleja de la entrega de un producto. Es importante buscar opiniones periódicamente e integrarlas en el desarrollo del producto, ya sea para crear nuevas funciones, editar las actuales o corregir errores.
Hacer es la mejor manera de aprender
Si quieres convertirte en un mejor diseñador de sistemas, arquitecto, desarrollador o vendedor, trabajar en tus propios proyectos a gran escala es la mejor manera porque tienes la libertad de hacer tu propia investigación para la mejor implementación, y las mejores herramientas y tecnologías a utilizar. Además, los recursos que tienes a tu disposición son finitos (tiempo, energía, presupuesto) y eso te lleva a ser diligente en el uso de cada uno de ellos.
Después de 4 semanas desde su lanzamiento, UpPush.me ya atiende felizmente a 32 suscriptores (¡y subiendo!)
El ecosistema actual para emprendedores tecnológicos está en auge con soluciones para construir y entregar software -desde herramientas sin código hasta soluciones de alojamiento de bajo coste- y me emociona ver lo grandes que son las comunidades de constructores de «pequeñas empresas» y cuántos productos y servicios interesantes se están desarrollando