Saltar al contenido
Alejandro Hernández
Todos los proyectos

FinanSync

App de finanzas personales para Android que anota sola los pagos que hago con el celular y me dice cuánto puedo gastar hoy sin tocar lo que ya debo.

Contexto
Proyecto personal, 2026
Rol
Diseño y desarrollo completo
Stack
React Native, Expo, TypeScript, SQLite, Android
  • Primer paso del recorrido de bienvenida sobre la pantalla de inicio
  • Inicio vacío, con Q0.00 para gastar hoy y sin movimientos
  • Cuentas antes de configurarlas, solo con efectivo
  • Formulario de cuenta nueva con banco, nombre, saldo de hoy y moneda
  • Cuentas con el banco agregado y Q6,500.00 en total
  • Ajuste de la quincena con el día 15 y el fin de mes como días de cobro
  • Inicio con Q1,625.00 para gastar hoy y cobro en 4 días
  • Inicio con Q1,309.39 para gastar hoy, antes de registrar un gasto
  • Captura de un movimiento nuevo con el teclado numérico propio
  • Captura con el monto de Q65.00 escrito
  • Selector de la categoría del gasto
  • Selector de la cuenta con la que se paga
  • Gasto de Q65.00 en comida pagado en efectivo, listo para guardar
  • Inicio con el gasto guardado y Q1,293.14 para gastar hoy
  • Ajuste de pagos de Google Wallet con la lectura y el registro automático activados
  • Widget en la pantalla de inicio del teléfono con lo que se puede gastar hoy
  • Notificación de Google Wallet por un pago en Starbucks y aviso de FinanSync de que ya lo registró como comida
  • Gasto de Q38.50 abierto desde el aviso para corregirlo
  • Inicio con el pago de Q38.50 registrado sin haberlo escrito
  • Aviso de FinanSync que pide confirmar un pago en un comercio nuevo
  • Confirmación del pago en el comercio nuevo, con la nota de que la categoría elegida se recuerda
  • Inicio con los dos pagos de Google Wallet registrados
  • Pagos con Q1,895.00 por pagar en la quincena y los próximos vencimientos
  • Detalle del seguro del carro con las opciones de ya lo pagué, editar y eliminar
  • Confirmación para registrar el pago del seguro desde el banco
  • Pagos después de registrar el seguro, con Q45.00 por pagar
  • Inicio con el pago del seguro registrado como transporte
  • Plan de compra de una laptop de Q8,500.00 para el 15 de febrero
  • Resultado del plan con lo que se aparta en cada quincena hasta juntar el precio
  • Plan guardado con el primer aporte ya apartado
  • Cuentas con la meta de la laptop junto a las demás metas y deudas
  • Reporte de octubre con Q15,500.00 de ingresos, Q12,424.77 de gastos y un 20 % de sobra
  • Gráfica de dona con la parte del ingreso que se llevó cada categoría
  • Gastos del mes por categoría con su porcentaje del ingreso

El problema

La gente abandona las apps de finanzas personales porque anotar cada gasto a mano es tedioso: basta con olvidarlo unos días para que los números dejen de servir. A mí siempre me ha gustado llevar el control de mis ingresos y gastos, y quería que ese registro pasara solo.

Mi solución

El gasto se registra solo al pagar. Cuando pago con el celular por NFC con Google Wallet en un comercio que la app ya reconoce, el gasto aparece registrado sin que yo haga nada. Así tengo claro a dónde se va mi dinero.

Lo demás gira alrededor de un número, lo que puedo gastar hoy:

  • Para gastar hoy: lo que tengo libre, menos lo comprometido, repartido entre los días que faltan para mi próximo cobro.
  • Captura en segundos: un teclado propio o texto libre («gasolina 500»), un widget, un atajo en los ajustes rápidos o agitar el teléfono.
  • Pagos y tarjetas: pagos programados con aviso un día antes, y tarjetas de crédito con su día de corte y compras a meses sin intereses.
  • «¿Puedo comprarlo?»: reparte el precio de una compra entre las quincenas que faltan y aparta cada parte sola.
  • Reportes del mes por categoría, tres monedas (GTQ, USD y EUR), respaldos y exportación a CSV y PDF, en español e inglés.

Cómo funciona por dentro

  • Cómo detecto el pago: Google Wallet publica una notificación con cada cobro y la app la lee con el servicio de escucha de notificaciones de Android. El título trae el comercio; el texto, el monto, la moneda y los últimos cuatro dígitos de la tarjeta. Solo cuenta como pago si el texto empieza con monto y moneda, porque Wallet manda una segunda notificación por compra, sin monto.
  • Cómo reconozco el comercio: guardo su nombre normalizado (minúsculas, sin acentos) junto a la categoría, y los cuatro dígitos de la tarjeta identifican la cuenta. Si conozco los dos, el gasto se registra solo y un aviso me deja corregirlo con un toque.
  • Qué pasa cuando no lo reconoce: el pago va a una bandeja de pendientes que no toca ningún saldo. El aviso abre la captura ya llenada y yo solo confirmo; la categoría que elijo queda recordada. Las notificaciones con números que la app no entiende tampoco se pierden: se guardan para registrarlas a mano.
  • Dónde se guardan los datos: en SQLite dentro del teléfono, con migraciones versionadas y el dinero en centavos enteros para no perder precisión. No hay backend ni cuentas de usuario.
  • Cómo sé que las cuentas cuadran: la lógica pura (el parser de dinero, el plan de compra, lo disponible) lleva comprobaciones con asserts que corren al arrancar en desarrollo.

Cómo protejo los datos

  • Nada sale del teléfono: no hay servidor ni analítica. La única conexión descarga el tipo de cambio y no envía ningún dato de mis finanzas.
  • El único permiso delicado es el acceso a notificaciones, y la escucha se limita al paquete de Google Wallet.
  • Al exportar, el PDF escapa el HTML y el CSV neutraliza las celdas que empiezan como fórmula. Un respaldo pasa la verificación de integridad de SQLite antes de restaurarse.

Lo más difícil

No existe una API para saber que pagué con Google Wallet. Antes de escribir la captura hice una sonda que solo guardaba las notificaciones, sin interpretarlas, para ver qué manda Wallet en realidad. De ahí salieron tres decisiones:

  • Ningún pago se registra dos veces. Android vuelve a entregar la notificación cuando Wallet la actualiza. Cada una se identifica por su clave y, una vez atendida, no vuelve a entrar.
  • La fecha es la del cobro. El gasto lleva la hora en que se publicó la notificación, no la hora en que la app la procesa, para que un aviso que llega tarde no caiga en el día o el mes equivocado.
  • Solo registra sola lo que ya conoce. Un número que aparece sin que yo lo apruebe es un número en el que dejo de confiar. Si el comercio o la tarjeta son nuevos, el pago pasa por mí.

Qué mejoraría

  • La escucha vive en el proceso de la app: si Android lo cierra, los pagos de ese rato no se capturan. Lo siguiente es avisar cuando la captura estuvo apagada y después moverla a código nativo.
  • La app decide por quincena, pero los reportes son mensuales. Quiero que también se puedan ver por quincena.