Skip to content
GODJI TECH
All products

Finance · Web app

Tally

Know exactly where your money goes. Tally reads the transaction alerts your bank already emails you and turns them into a live picture — what came in, what went out, where it went, and how much is safe to spend today. No bank login, no spreadsheets, no typing.

Type
Our own product
App
Web app · PWA
Data
Gmail API (read-only)
Backend
Supabase · Edge Functions

The brief

A complete record of your spending, sitting unread in your inbox.

Banks in South Africa email an alert for almost every transaction — a card purchase, a debit order, money in. Budgeting apps want your banking password or a screen-scraping integration; the alternative is a spreadsheet you stop updating by the second week.

The goal was a money picture that keeps itself up to date from data people already have, built around how they actually get paid: payday to payday, not the 1st to the 31st. It had to answer the one question people open a money app for — can I afford this?

What we built

A money picture that maintains itself.

  • Alerts in, transactions out

    Sign in with Google, pick the sender your bank's alerts come from, and Tally imports months of history in one go — amount, merchant, card, account and available balance from each alert.

  • Safe to spend today

    One number: the real balance from your latest alert, minus fixed payments and savings still to come this pay cycle, divided by the days to payday — with every line of the sum shown.

  • Pay cycles, not months

    Tally finds your salary and counts payday to payday everywhere — totals, charts, budgets and history — with a payday plan that ticks itself off as fixed payments go out.

  • Categories that learn

    Teach it a merchant once and every past and future transaction follows, with a review queue for anything new and savings or pass-through money that doesn't count as spending.

  • Money Tally didn't see

    Every alert carries a balance, so Tally reconciles consecutive balances and surfaces what moved with no email: bank fees, debit orders, or transfers between your own accounts.

  • While you're not looking

    Optional server-side import every 15 minutes, a Sunday-evening summary and a heads-up on large payments — plus offline mode, undo on every bulk change and Excel export.

Design decision

No bank integration, on purpose

Bank-feed APIs mean handing over a banking login or paying an aggregator. Bank alert emails are already complete, timestamped and carry the available balance — so Tally reads those, with the narrowest Gmail access available, filtered to one sender, and stores only the extracted fields, never the email itself.

Screens

What it looks like.

Screens use sample data.

  • Safe to spend today, the payday plan, where the money went
    Safe to spend today, the payday plan, where the money went
  • Balances read straight from alerts
    Balances read straight from alerts
  • Activity, grouped by day, with search that understands "over 500"
    Activity, grouped by day, with search that understands "over 500"
  • Budgets per category, six pay cycles side by side
    Budgets per category, six pay cycles side by side

Architecture

A static app, a database, and jobs that run on their own.

tally ▸ stack

   Static web app        tally.godjitech.com · no build step
    ├── index.html        UI, pay-cycle engine, reconciliation, search
    ├── parser.js         alert parser, shared with the server, unit-tested
    ├── Gmail API         read-only, queried by the one sender the user picks
    └── sw.js             offline shell + cached data, installable PWA

   Supabase              Postgres · auth · row-level security on every table
    └── gmail_tokens      refresh tokens, no client policies at all

   Edge Functions        scheduled by pg_cron, key held in Vault
    ├── import-alerts     every 15 min, for every connected user
    └── weekly-summary    Sunday email + large-payment alerts

The harder parts

Where the real work went.

A number people can trust

Adding up transactions drifts — a missed alert, a pending hold, a transfer to savings. So when an alert carries a balance, Tally starts from the bank's own number and only adjusts for what has happened since, and shows its working.

Reconciling balances, not just transactions

The first version compared each alert only with the one before and flagged hundreds of false gaps. The rewrite walks each account in time order and accounts for transfers, reversals and duplicates — so what's left is real.

Spending versus moving money

Money sent to savings, held for someone else or used to pay off your own card leaves the account but isn't spending. Tally keeps those apart, so the charts agree with the totals.

Running without anyone watching

Alerts arrive when the app is closed. A Postgres cron job calls edge functions with a key held in Vault, and refresh tokens live where only the server can read them. If a user revokes access, the next run notices and switches the feature off.

Stack

What it runs on.

  • JavaScript
  • PWA
  • Service Worker
  • Supabase
  • PostgreSQL
  • Row-level security
  • Edge Functions
  • pg_cron
  • Gmail API
  • Google Identity
  • Netlify
  • Playwright