
Every trip with friends ends the same way. Someone made a WhatsApp group called "Goa 💸", someone else kept notes on their phone, and a week after you're home the questions start: "bro, how much do I owe you?"
I've been in that group too many times, so I built EzySplit, a bill-splitting app for groups: trips, flatmates, office lunches. It's live on Google Play. This post is about the decisions behind it, the parts that were harder than they looked, and what I'd tell anyone building something similar.
The problem with "just use Splitwise"
The popular apps work well, but they were designed for how people pay in the US. In India, almost every small payment between friends happens over UPI. The tracking was never really the problem. The settling up was: open the app, see "you owe Kabir ₹1,450", switch to GPay, find Kabir, type 1450, come back and mark it paid. It's four steps, and each one is a chance to forget.
So the first rule for EzySplit was simple: settling up should be one tap.
Settle up with UPI in one tap

UPI has a standard payment link format that any UPI app understands. It carries the payee's UPI ID, their name, the amount and a note. When you tap Settle in EzySplit, the app builds that link from the balance and hands it to Android, which lets you pick GPay, PhonePe, Paytm or whatever you use. The amount is already filled in. You only confirm with your PIN.
A few lessons from building this:
You can't fully trust the "payment done" signal. Different UPI apps report the result differently, and some don't report back at all. So EzySplit asks you to confirm after you return, and the person you paid sees it in the group. I chose honesty over magic here: a settle-up is only "done" when someone confirms it.
Save the UPI ID once. Each person saves their own UPI ID one time, so nobody has to ask "what's your number?" ever again.
Make splits add up exactly. ₹100 split three ways is ₹33.34 + ₹33.33 + ₹33.33, not three times ₹33.33 with a paisa lost along the way. The leftover paise are handed out one at a time, so every split adds up to the bill exactly.
Splitting isn't always 50-50
Real life is messy. One person skipped dinner, the villa was split by room size, someone only had a drink. EzySplit supports four ways to split an expense: equally, exact amounts, percentages and shares. The trick was keeping the add-expense screen calm despite that: equal split is the default, and the other modes only appear when you ask for them.
The feature nobody asked for, but everyone needed
Here's something I didn't expect. The biggest source of arguments in group expenses isn't maths, it's edits. Someone changes "Fish thali ₹2,800" to "₹3,200" after the group has already settled, and suddenly everyone's balance shifts and nobody knows why.
So EzySplit now keeps a change log:
Edited expenses are tagged, and you can see what changed, who changed it and when.
If something changes after a settle-up, it's flagged clearly, and Balances shows a "Changes since settle-up" summary of exactly what moved.
It's not a flashy feature, but it's the one that makes a group trust the numbers. And a split app that people don't trust is just a notes app.
Personal spending, too
Once people had their group expenses in one place, they asked for their own spending there as well: groceries, bills, eating out. EzySplit has a Personal tab with a monthly breakdown and a simple insight about your top category compared with last month. Groups and personal spending sit side by side, so "where did my money go this month" has one answer.
Rebuilding it with Expo
The first version of EzySplit was a bare React Native CLI app. It worked, but every upgrade was painful, and native build issues ate weekends. I rebuilt it on Expo, and it was worth it:
Config instead of native folders. The Android project is generated from one config file, so things like App Links, permissions and the version code live in code I can review, not in files I'm scared to touch.
A boring release pipeline. GitHub Actions builds the app and uploads it to Google Play, release notes included. Releasing is now a merge, not an afternoon.
Firebase for data, a small backend for the rest. Groups and expenses live in Firestore with security rules doing the heavy lifting. A small Express + TypeScript backend on Vercel handles push notifications, invite links, the AI assistant and an admin panel.
One rule I follow strictly: EzySplit has one production database shared by every app version. Every data change has to be additive and safe for people who haven't updated yet. It slows me down a little and has saved me more than once.
Exports, because money needs receipts
At the end of a trip, someone always wants "the sheet". EzySplit exports any group as a PDF report to share, or an Excel file to reconcile. The PDF went through more redesigns than any screen in the app. When something gets forwarded to your whole family, it has to look right.
What I'd tell anyone building a money app
Design for how people actually pay where you live. For India, that means UPI first.
Trust is the product. Change logs, exact paise and clear settle-ups matter more than charts.
Keep the happy path to one tap. Add an expense, split it equally, settle. Everything else can hide behind a toggle.
Never break old versions. Your users update when they feel like it, not when you ship.
Try it
EzySplit is free on Google Play. If your friends still settle trips over WhatsApp, give it a go on your next one, and tell me what's missing. I read every message.