Update, September 2026: Circles now also gather the transactions you tag with them. The argument below is unchanged — a Circle still holds no balance, and the trade named in "What we gave up" still stands: there is no trip total.
Every expense-splitting app you have used starts the same way: create a group. Name it, add people, and only then can you record that you bought coffee.
We built HiBill that way too. Then we deleted it.
The group was never the thing people wanted
Groups feel right on a whiteboard. A trip is a group. A flat is a group. Money in, money out, split at the end. It maps cleanly onto a database table, which is probably why every app in this category has one.
But watch what actually happens. Somebody buys lunch for three of the five people on the trip. Somebody pays their share directly in cash before the trip is over. Two people share a taxi that nobody else was in. Someone leaves early. Someone joins for the last two days.
Every one of these is a normal Tuesday, and every one of them fights the group model. You end up with a group that has a balance, and people inside the group who have balances with each other, and a settlement flow that has to decide which of those it is touching. We had a table in our schema for exactly that — the same two people could carry a group-scoped balance and a global balance at the same time, and a settlement had to pick a side.
That is not a data model. That is a bug with a schema around it.
What people actually track
Ask someone what they are owed and they never answer with a group. They answer with a name.
"Marco owes me for the tickets."
"I still need to pay Aya back for the flat deposit."
The unit is a person. The group was scaffolding we invented to hold expenses, and then we made users maintain it.
So in HiBill a balance is always between you and one other person, in one currency. That is the only kind of balance there is. Open a person and you get the entire two-person ledger — every expense you both touched, every transfer either way, and the number it comes to right now.
But trips are real
The obvious objection: something has to hold "the Lisbon weekend" together. Seven people, nobody has each other's details, and adding them one at a time is miserable.
That is real, and it is a connection problem, not an accounting one. So we built Circles to solve exactly that and nothing more.
A Circle is a named roster. "Lisbon weekend". "Flat 4B". You open it, show the QR code, and everyone who scans it is instantly connected to everyone else in one tap. Then when you add a transaction, you drop the whole Circle onto it at once instead of picking seven names, and the transaction is filed under that Circle so the trip stays readable in one place.
What a Circle does not do is hold money. It has no balance. It settles nothing. Delete it after the trip and every balance it helped you create is still exactly where it was, sitting between the pairs of people who actually owe each other.
That distinction — roster, not ledger — is the whole design. It is what lets us give you the convenience of a group without the accounting mess of one.
What fell out of the schema
Once balances were strictly pairwise, a surprising amount of the app stopped being necessary:
The group ledger, group memberships, group attachments and group comments — gone.
The dual balance system, where a pair could be in two states at once — gone. There is one balance per pair per currency.
The whole settlement object — folded into an ordinary transfer. Settling up is no longer a separate ceremony with its own screen and its own status field; it is just money moving from one person to one person, in the same timeline as everything else.
We went from four ways to record money changing hands to two: an expense (someone paid for something shared) and a transfer (money went from one person to one person). That is it. Lending, paying back, settling up — all the same shape, because they are all the same event.
There is a third kind you never create yourself, Simplification, which appears when the system can collapse a debt loop. If you owe Marco, and Marco owes Aya, and Aya owes you, that circle can shrink. It shows up labelled, in the timeline, so the number never changes without a visible reason.
The part that surprised us
We expected the rewrite to cost us features. It did the opposite.
Open splits — post a bill and let people claim their own share — were hard to reason about with a group pot, because it was unclear what an unclaimed share meant. Pairwise, it is obvious: whatever nobody claims stays with the person who paid. Same for multi-currency. Same for adding somebody who has not signed up yet.
Features that had been sitting in the "too complicated" pile became small once the model underneath stopped fighting them.
What we gave up
Honest accounting: you cannot ask HiBill "what did the Lisbon trip cost in total?" and get a single number the way a group-first app would. That is a genuine loss, and if trip-level totals are the main thing you want, another app fits you better.
We think it is the right trade. Group totals are a report. Knowing what you owe Marco is the job. We would rather be excellent at the job than adequate at both.
HiBill is in public beta and the free tier is free forever. If you have opinions about any of this — especially if you think we cut the wrong thing — the feedback board goes straight to the people who write the code.