Mi experiencia creando Spark para la ShipATon de RevenueCat

A principios de agosto me enteraba por las redes de un hackaton organizado por RevenueCat, una empresa californiana que ofrece un servicio para facilitar la gestión de las compras y subscripciones dentro de aplicaciones móviles. El día 3 empezaba, un concurso abierto en el que cualquiera podía presentar una aplicación con un único requisito principal, integrar alguna compra en ella. Su nombre, «Ship a ton» ya nos da una idea del objetivo, «Entregar (vender) una tonelada», básicamente, vender más. Los premios y demás requisitos son bastante claros pero no es necesario saberlos para lo que aquí nos concierne, hay varias categorías con varios premios entre ellas, si tienes curiosidad, en la página del hackaton están definidos.

Ilustración de un gato pirata, con un parche en el ojo, en un timón de barco sosteniendo un teléfono móvil. El fondo tiene un cielo al atardecer y debajo está el texto "Ship-A-Ton"

Yo, culo inquieto profesional, pensé «¿Por qué no?», me gusta la idea de vender más y tengo la capacidad de crear algo que pueda ser atractivo para la gente, tenía algo más de un mes por delante, el hackaton terminaba el día 19 de septiembre, que luego pasó a ser el 20, por suerte, más adelante te cuento el porqué.

Pues bien, ya estaba «metido en un nuevo fregao», como decimos coloquialmente por aquí, ahora sólo me faltaba buscar un proyecto no demasiado grande, construible en un mes y al que pudiera integrar alguna compra de valor. Un poco de auto brainstorming, investigación y tiempo de reflexión para al final optar por un «juego» de dados que había jugado tiempo atrás con mi familia y nos había hecho pasar un rato muy entretenido, además de unas buenas risas, algo rápido y sencillo para jugar en grupo.

Consta de diferentes objetos con distintas temáticas en cada una de las caras de los dados que luego el jugador ha de combinar para crear la mejor o más graciosa historia que pudiera ocurrírsele. Seguro habría ideas más originales y/ó prácticas pero el recuerdo del tiempo compartido en familia anteriormente pudo más que las otras ideas así que ya estaba decidido. Estaría bien que cualquiera pudiera probar la experiencia desde sus teléfonos móviles, encajaba muy bien el tema de las compras con packs de dados temáticos opcionales acompañando al ya integrado en la aplicación, con objetos cotidianos, un parque, una bicicleta, un bolígrafo, un avión, una pelota, etc.

Ya tenía la idea, las herramientas necesarias y las ganas de crear algo nuevo, así que manos a la obra, el día 8 de agosto empezó todo, primero creando las imágenes para verificar que tenía la capacidad de poder aplicarles un estilo similar entre sí y lo bastante atractivas como para ser integradas en un juego de estas características, unas pocas pruebas de concepto y tras varias horas ya tenía las imágenes para el pack principal listas para ser usadas en un prototipo.

Una cuadrícula de íconos coloridos que representan varios objetos como un computador portátil, un teléfono móvil, una calculadora, transporte, muebles, y otros artículos de uso cotidiano.

Con todo ya preparado y decidido, era hora de comenzar la faena, construir la interfaz principal, unas mecánicas que simulen unos dados, 6 concretamente, con 6 caras cada uno, aleatorizar los resultados, integrar las imágenes y añadir algunas animaciones y efectos sonoros para hacerlo un poco más dinámico. Todo iba sobre ruedas, en una semana ya tenía la base construida, sólo faltaba integrar las compras en la aplicación, algo que suele ser tedioso ya que implica interconectar diferentes servicios entre las plataformas de aplicaciones, RevenueCat y tu propia infraestructura. Teniendo en cuenta que el tiempo era limitado y no demasiado extenso era buena idea integrar las compras cuánto antes, además este tipo de procesos suelen ser largos y dar problemas.

Normalmente trabajo primero en Android y luego en iOS, al venir de Android nativo me siento más cómodo con sus herramientas de desarrollo, a principio de mes empezaba a integrar las compras dentro de la app, iba a ser fácil, una única compra para desbloquear el pack temático y disponible para siempre, unos cuántos ajustes aquí y allá, configuración de la consola de Google, un webhook para recibir notificaciones de transacciones, cuentas de servicio, APIs, etc. El día 7 de septiembre lancé la primera versión funcional a la tienda de Google con todo funcionando correctamente. Todo estaba fluyendo como la seda, una vez en producción me ayudaron para probar los códigos promocionales desde Android, con un rotundo éxito.

Tocaba ahora proceder con la publicación para Iphone en TestFlight, para ir iniciando el proceso, la publicación a Apple suele ser más propensa a objeciones, al menos en mi experiencia. Lo primero que quería de Apple era que ellos me aprobasen los productos integrados en TestFlight para poder probar bien la parte de compras, pero entre que hacía tiempo que no integraba compras en la app en una aplicación y que el proceso para enviarlas a revisión en Apple es un poco lío, van por separado de las revisiones de la aplicación la primera vez que las integras y pueden revisarlas de forma independiente, la cosa empezó a demorarse.

De repente, un día, veo que las compras en la versión de Android han dejado de funcionar… «¿Por qué?» Si ya estaba en producción, con códigos promocionales funcionando y probados, ¡no puede ser! Creyendo que es un error de la aplicación, abro el IDE y me pongo a investigar el código y hacer debug de las solicitudes, allí me encuentro un error de RevenueCat avisándome que la configuración no estaba completa. «Pero si había quedado todo listo…». Entonces es cuando procedo a entrar al panel de RevenueCat y me encuentro que las credenciales (que se encargan de verificar que está todo correctamente configurado contra los servicios de Google) no son válidas… Mi cara se convierte en un poema, ha dejado de funcionar sin haber tocado nada, cómo me gustan los imprevistos del mundo de la programación, esa magia oscura que por muy controlado que creas tenerlo siempre hay algo que puede salir (y sale) mal. No podía ser, por más que revisaba las configuraciones tanto de la consola de Google como de RevenueCat (no debería ser de la aplicación ya que la verificación se hace entre servidores) no veía nada mal, todo estaba correcto, los productos activos en Google Play, las configuraciones estaban según lo indicado en la documentación, etc. La sensación de frustración viendo todo correctamente configurado y que no funcione se apoderaba de mí, en esos momentos es cuándo el síndrome del impostor florece y te planteas mandar todo a la mierda, pero no; cabezón de mí, ahí estuve horas y horas revisando, creando proyectos y claves de nuevo intentando localizar el origen del error sin éxito alguno.

Captura de pantalla de la plataforma RevenueCat mostrando el panel de configuración de un proyecto de una aplicación llamada "Story Craft Dices Android". Se resalta un error de "Credentials need attention", indicando problemas con permisos de API.

A veces uno no le queda más remedio que pedir ayuda, cuándo ves que el proceso se ha seguido (y revisado 101 veces) según las instrucciones pero aun así no funciona, toca pedir ayuda, primero un ticket de soporte con la gente de RevenueCat, era fin de semana (viernes 13 de septiembre por la noche), así que me tocaba esperar al lunes, ahora la sensación de frustración pasaba a ser de desesperación y miedo, «Ya no llego al concurso», pensaba, sigo peleando con Apple para que me la aprueben y ahora deja de funcionar la de Google, «Soy un desastre», «No voy a ser capaz de cumplir las fechas», etc. La montaña rusa del programador en su mayor expresión, la sensación de estar en todo lo alto cuándo resuelves algún problema y de repente en la más mismísima miseria cuándo algo falla, y más si aun encima no sabes por qué.

Pues bien, a falta de 5 días para cerrarse el plazo del hackaton las compras en la aplicación fallaban en Google (en producción) y aun ni había pasado los filtros de Apple para publicar en su App Store, la posibilidad de no poder ni participar en el concurso estaba cada vez más presente entre mis pensamientos. Pero no soy de rendirme tan fácil, un mensaje en el foro de RevenueCat y a seguir luchando con Apple.

Una vez llegado el lunes la primera comunicación con RevenueCat no parece traer muy buenas noticias, simplemente me dicen que tengo que esperar 36 horas a que se valide la cuenta de servicio de Google, algo que se me hizo raro, hacía tiempo que la había creado y había estado funcionando en producción, les respondo y quedo a la espera. El día 18 Apple ya me había aprobado la aplicación y podía subirla a producción, no sin haber pasado por dos revisiones que no deberían haber sido rechazadas, en una me pedían integrar un botón para restaurar las compras, por si el usuario cambia de dispositivo, algo que ya me habían dicho en la revisión anterior y ya había integrado, a volver a esperar otra buena tanda de horas para que la revisen de nuevo. Luego, cuando me dijeron por segunda vez que debía quitar una captura de la ficha de la aplicación en la que se veían los precios, la había retirado ya tras el primer aviso. Pero que conste que esto no es una queja, sino más bien un ejemplo para ilustrar el hecho de que durante este tipo de procesos es común que haya errores por cualquiera de las partes que intervienen, somos humanos.

Día 19, agobiadísimo porque se termina el plazo de entrega y esperando a ver si al menos Apple me aprobaba la aplicación dentro de plazo, al ser horario de California aun tenía algo de margen, era mi última esperanza. Con publicarla en una de las dos tiendas era suficiente para participar en el concurso, aunque veía que el tiempo apretaba y no iba a llegar. Con ya casi toda la esperanza perdida leo en la cuenta de X de RevenueCat que por un error tipográfico en uno de los mensajes tienen que extender el concurso un día más. ¿Hay alguien ahí? Parece que el guión estuviera escrito…

Después de todos los problemas e imprevistos, Apple me aprueba la aplicación a falta de 8 horas para el cierre del plazo del concurso, ¡Bien! Al final entro en plazo (no sin algo de suerte por el cambio de fecha límite de entrega), esperemos que de aquí a que termine no se estropee nada más y puedan al menos probarla y valorarla. Termino de cubrir lo poco que faltaba de la ficha de candidatura de la aplicación en DevPost, poner los enlaces nuevos, añadir códigos promocionales y listo, al final parece que, aunque bajo la campana, vamos a participar en el concurso. Yo estaba tranquilo en realidad, me gustaría presentarme ya que era la propuesta inicial pero teniendo en cuenta que, en realidad, gran parte de los problemas fueron ajenos no me preocupaba mucho, si no me presentaba me quedaba la nueva aplicación para añadir al catálogo de productos de BetaZetaDev; pero ya que me lo había planteado estaría bien concluirlo.

El nombre de la aplicación, Spark (Chispa en Inglés), evoca esa chispa que enciende la llama, el impulso inicial que te invita a lanzarte a la aventura. Representa la inquietud y el ingenio de los narradores de historias, como aquellos cuentos que los ancestros compartían alrededor de una hoguera, ahora llevados a un mundo moderno. Es un juego sencillo para disfrutar en grupo, que además estimula la mente y fomenta la creatividad, algo que nunca viene mal.

En total han sido 112 horas (utilizo WorkIO para contabilizar el tiempo de trabajo) que le he dedicado a este proyecto en un mes, apróximadamente dos semanas de trabajo intensivo en el que he puesto todo el empeño para cumplir los plazos y de paso, desafiarme a mi mismo a ver hasta dónde era capaz de llegar. Los ganadores ya han sido publicados y Spark no está entre ellos :carita triste: aunque en realidad, ganar el concurso no era el objetivo principal, con casi 2000 participantes de todo el mundo sería muy complicado ganar pero bueno, la experiencia y sobre todo la aplicación están construidas y yo, contento con el proceso, a pesar de todo.

El día 21 recibo una contestación al ticket de RevenueCat avisándome de que el motivo de que las credenciales dejasen de funcionar era bug en su proceso de verificación y ya había sido resuelto, chapeau por ellos que se han dignado a avisarme y pedir perdón. Los jurados del concurso ya pueden utilizar cualquiera de las plataformas para probar la app, ambas estaban funcionando aun a pesar de llegar un poco tarde con las compras de la de Android.

Hoy es el día de lanzamiento oficial, ya está preparado todo en Product Hunt, si te apetece apoyarme te lo agradecería un montón, va a ser un día largo y podemos llegar a más gente con tu apoyo tanto votándolo, como compartiendo este artículo o los enlaces a la app en Product Hunt. Además, puedos ayudarme a ganar unas zapatillas guapísimas : )

Spark - Have fun and boost your creativity with Spark. | Product Hunt

Spark está disponible tanto para Google como para Apple de forma gratuita (y sin publicidad), a mayores incluye, de forma opcional, los packs de Fantasía y Misterio que proporcionan objetos tematizados que sustituyen a los integrados en la aplicación de forma gratuita y dotarán a vuestras historias de un contexto diferente. La música de fondo también está tematizada para hacer la experiencia más profunda y es diferente por cada pack. Te dejo aquí un código que puedes utilizar para canjear el pack de Fantasía y hacerte con él para siempre, gratis, selecciona la opción para canjearlo en la pantalla de compra del pack dentro de la aplicación. Estate atento por nuestras redes si estos han sido canjeados, estaremos lanzando nuevos durante el día de hoy.

Google: F063Q2CWRQCTYXRCPUCSH7R

Apple: H79RYYW4XLMT

La reflexión que yo saco de todo esto viene a confirmar un poco lo que ya sabía, los procesos de despliegue son largos, sobre todo la primera vez, si tienes que sacar una aplicación al mercado en una fecha determinada asegúrate de iniciar el proceso de revisión con las stores, como mínimo, dos semanas antes. Los procesos en un proyecto de estas características difieren mucho entre desarrollo, creación de recursos y despliegue, cada una de las partes tiene tiempos diferentes y han de ser gestionados correctamente para no vernos afectados por imprevistos. Algo tan simple como una captura de pantalla promocional para la tienda puede hacer que tu aplicación sea rechazada y tengas que esperar un buen puñado de horas hasta que vuelva ser revisado. Independientemente del resultado del concurso estoy satisfecho de mi trabajo y al final, haber llegado a tiempo, la aplicación funciona muy bien, está disponible también para tablet y tiene el contenido suficiente cómo para ser una buena candidata a generar ingresos extra. Los problemas son parte del camino, la lucha contra el síndrome del impostor es común y los momentos de bajón habituales, hay que saber gestionarlos para no tirar el trabajo a la basura a la mínima de cambio.

Si tienes algún comentario o sugerencia es bienvenido, espero haber contribuido de alguna manera a exponer un poco el proceso de creación y despliegue de una aplicación de estas características para intentar ayudar a aquellos que se enfrentan, o se van a enfrentar, a este tipo de procesos y puedan pensar que son los únicos que tienen problemas, son parte del avance en este mundo de altibajos como es el desarrollo de software. Muchas gracias por leerme si has llegado hasta aquí y hasta otra.

Leave a Comment