Tally

Small businesses do not lose money on subscriptions because the subscriptions are expensive. They lose it because nobody can say, in one number, what is being paid every month, and because the card gets charged before anyone remembers the renewal was coming.

Tally is a self hosted subscription spend tracker. It holds every recurring charge a company has signed up for, normalizes every billing cycle into a single monthly and annual run rate in one reporting currency, and sends an alert before each renewal at whatever lead time you choose. It ships as a Laravel application with a Filament operator console and a Flutter mobile client, and you install it on your own server with a browser based installer.

Live demo

Demo: https://tally.foundrcode.com

Sign in as the workspace user to see the product a customer uses, and as the operator to see the console that runs the installation. The public home page names both doors, so you never have to guess which sign in screen you are on, and it carries the Android download.

Both demo accounts are read only, so you can open every screen without anyone being able to change what the next visitor sees. Read only is enforced in the data layer rather than by hiding buttons, so it holds for the API as well. Your own installation has no such restriction.

Two surfaces, on purpose

The people who use Tally every day and the person who administers the installation want different software, so they get different software.

The product, at /app. Built in Livewire, designed as a statement rather than a CRUD grid. Subscriptions appear as a table, a kanban board or a renewal calendar over the same filtered set. Every figure is money in integer minor units with an explicit currency, never a float.

The operator console, at /admin. Built in Filament, and sealed off from the product. Branding, the public legal pages, license activation, integration keys and cross workspace analytics live here and nowhere else. A workspace user never lands in it, and the console never scopes itself to a single tenant.

What it does

  • Subscriptions. Vendor, amount, currency, billing cycle, renewal date, category and owner, in table, board or calendar form.
  • Spend. Every cycle normalized into one monthly and annual run rate, converted into a single reporting currency.
  • Alerts. Email and Slack notices a configurable number of days before renewal. The same notice is never sent twice.
  • Payment history. Charges log themselves as renewal dates pass, and can be entered or corrected by hand.
  • Team. Shared workspaces with owner, admin, member and viewer roles, and invitations by email.
  • Accounts. Registration, sign in, and self service password reset by email, with the reset form deliberately giving the same answer for a known and an unknown address so it cannot be used to discover who has an account.
  • Import and export. CSV in and out, with lenient parsing of the files people actually have.
  • Branding. Product name, logo, favicon, accent color and support links, set once in the console and applied to the product, the public site, every email and the error pages.
  • Legal pages. Terms, privacy, cookies and refunds, seeded on install and editable as raw HTML from the console.
  • Installation overview. Cross workspace figures plus health checks for cron, mail, license and queue, so you can see what has quietly stopped working.
  • Theme. Light, dark and system, chosen by the visitor and applied before first paint.

The mobile app

A Flutter client for iOS and Android, talking to the same token authenticated API as the web product. It is platform native rather than one layout painted twice: Cupertino controls and navigation on iOS, Material on Android.

  • Onboarding, sign in, statement, subscriptions, subscription detail, renewals and account.
  • Skeleton loading states rather than spinners, and the same statement typography as the web product.
  • Auth tokens held in the platform keychain and keystore, not in plain preferences.

Try it before you buy: the demo home page has a Download for Android button that installs the app against the live demo. Sign in with the workspace credentials above.

You build and sign the app yourself with your own bundle identifier. The documentation walks through changing the identifier, the display name, the icon and the API base URL. The Android and iOS download links on your own home page are settings in the console, so you point them at your own store listings and the buttons hide themselves until you do.

Built for the buyer, not the demo

  • Web installer. Requirements check, database, license, admin account, done. No file editing, and the installer locks itself once it has run.
  • Multi tenancy. A single database with a workspace scope applied globally, so one install serves many teams without leaking rows between them.
  • Custom error pages that carry your branding and survive a broken asset build.
  • Optional SaaS mode. Off by default. Switch it on to add plans, a trial, per plan limits and hosted checkout.
  • Test suite. The item ships with its feature tests, including the ones that hold the two panels apart and the ones that cover the admin console.

Requirements

  • PHP 8.3 or newer
  • Composer 2
  • Node 20 or newer, to build the front end assets
  • MySQL 8, MariaDB 10.6, PostgreSQL 13 or SQLite
  • A cron entry, for the renewal alerts to send
  • An SMTP account, for outbound email
  • Flutter, only if you intend to build the mobile app

Third party services and costs

Tally runs with no third party account at all. Every external service below is optional, is configured from the console or the environment file, and is billed by that provider directly under your own account. None of these costs are included in the price of this item.

  • Email. Any SMTP account works. An HTTP mail API can be used instead. Alerts will not send without one of the two.
  • Slack. An incoming webhook, if you want renewal notices in a channel. Leave it blank and the feature hides itself.
  • Payment rails. Only used if you turn SaaS mode on. Leave SaaS mode off and no payment account is needed.
  • Live chat. An optional support widget. Leave the key blank and no widget renders.

Support

Six months of item support is included, covering defects, questions about the documented features, and help getting a standard installation running. It does not cover customization, third party service configuration or hosting administration.

You May Also Like