Every renewal, before it bills you
Each subscription keeps its next due date and its yearly cost. Turn on the calendar feed and renewals sit in your calendar beside your meetings.

Six kinds of entry, one ledger
Each entry keeps its own currency.
| Kind | Example | Amount | What you see |
|---|---|---|---|
| Subscription | Hosting, monthly | −$20.00 | Next renewal date and yearly cost |
| Lifetime deal | Icon library, paid once | −$299.00 | Months until it pays for itself |
| Contractor | Developer, paid in euros | −€1,200.00 | Converted to your base currency at a rate you can edit |
| One-time | Conference ticket | −$400.00 | Logged on the day, no schedule |
| Expense | Coworking day pass | −£25.00 | Counted against its category budget |
| Income | Retainer from a client | +$3,000.00 | Tagged to the client for profit |
Which clients make you money
Tag income and costs with a client to see the margin on each. The forecast adds up renewals and retainers due in the next 30, 60 and 90 days.


Only you can read your rows
Postgres row-level security checks every query against your session. The app holds no admin key, so a bug in its code can’t reach another account.
create policy own_transactions on transactions
for all to authenticated
using (user_id = ((select auth.jwt()) ->> 'sub'));Open source under MIT
The code is public on GitHub. Read how it works, run it on your own accounts, or send a fix.
Star on GitHubA star helps other agencies find it.
- License
- MIT License
Use it, change it and ship it. Keep the copyright notice.
- Source code
- connectfazla/ortha-budget
Next.js, Supabase and Postgres row-level security.
- Self-host
- Read the self-host guide
Bring a Supabase project and a Vercel account, then follow the four steps in the README.
- Made by
- Ortha Studio
A design and engineering studio.
- Developed by
- fazla.dev
