Skip to content
FamilyCounts web app: family expense list with tags, group selector, attachments and Excel export

FamilyCounts — Family Expense Tracker

3 minutes read

From 2022 to 2025 I worked on FamilyCounts (familycounts.online), a family expense-tracking service: backend, web interface, devops.

About the project

FamilyCounts is a chat-like family expense-tracking app: each family member logs their expenses and tags them, the account owner sets budgets, and the whole family gets a notification when a budget is exceeded. There is a quick expense summary and an Excel export for any period. iOS and Android apps; running since 2016, around 2,000 active users.

My job was to develop the product while working through the accumulated tech debt: tests, push notifications, database performance, the missing web version.

My role

Backend and web development was on me. I discussed backend and API changes with the mobile app developers (iOS and Android) and worked in tandem with a QA tester. Once a week the whole team got on a call: the client, the mobile app developers, the tester, and me.

What I did

  • Web interface — there was no web version. Built it from scratch with React and Vite: expense feed with infinite scroll, filters by tags and periods, tag management, attachments, Excel export. Admin area: user search, server-side pagination, email sending, account deletion.
  • Tests — hadn’t run for years. Fixed the suite (about 60 commits); along the way real production bugs surfaced: only the last condition in a query chain was applied, some callbacks always returned an error, batch inserts didn’t work. After that, new features shipped with tests.
  • ORM and performance — Waterline, the stock ORM in Sails.js, has performance problems baked into its architecture, and the framework itself is abandoned. Proposed to the client a move to Knex.js: rewrote the heavy queries, added database migrations and indexes.
  • Push notifications — kept breaking from time to time. Renewed the APNs certificates, moved Android pushes from the legacy FCM API to FCM HTTP v1.
  • Sign in with Apple — built the backend part: token verification, registration, account linking.
  • Subscription plans — plans with limits: packages, caps on records, group members and attachments, subscription status checks, action audit, payment emails. In-app purchases went through RevenueCat; I built the backend part and the API. The integration was still in testing when I left.
  • Stack — updated Node.js to a current version, wired Sentry into the app’s logger.
  • DevOps — releases, deploys and backups of the production server; set up and maintained the QA server used as staging. Linux, Docker, docker-compose, ssh, cron.

Results

  • The service got a web version: it can now be used from a computer, not just a phone.
  • The service got the groundwork for monetization: subscription plans with limits and purchase handling.
  • The service became more stable and faster: rewritten queries and indexes removed the long-standing database slowdowns.
  • The codebase is maintainable again, with working tests, database migrations, and error monitoring in Sentry.

Stack

Node.js · Sails.js · MySQL · Knex.js · RabbitMQ · React · Vite · Bootstrap · Mocha · Sentry · FCM / APNs · Google Cloud Storage · Docker · Linux

Share this post