Tab Splits
A bill-splitting tool for the group dinners I host. Ten dinners and $4,000 in receipts later, guests have started organizing their own.
tabsplits.com ↗
01 – What
Tab Splits turns a restaurant receipt into a fair, itemized tab for everyone at the table. Scan the receipt, check what the AI read, assign or share each item, and send every diner a link showing what they owe, with tax and tip included.
How it changed with use
From an editing screen to a guided flow. The first version was a single receipt screen. By spring 2026 it was a step-by-step wizard, so organizing a tab at the table means answering one question at a time.
Receipt quirks. Auto-gratuity and service charges go into the tip instead of being treated as a dish, and duplicate lines (
2x Lychee Martini+1x Lychee Martini) are merged.
- Role
- Founder: product, design, technical direction
- Team
- Me + AI coding agents
- Since
- November 2025
- Built with
- Replit Agent → Claude Code
"Let's just split it evenly" penalizes whoever skipped the cocktails.
02 – Why
I built it for Amuse-Bouche, the Denver food collective I organize, where small groups of people, often strangers, meet over restaurant meals. Budgets and orders vary, and settling up used to be the most awkward part of a lovely evening. Doing the math properly on a phone at the table is slow and error-prone, and splitting evenly penalizes whoever skipped the cocktails.
Tab Splits exists so the bill doesn't undermine the friendships the dinner was meant to start.
The experience
Tab-Splits serves two different people with two distinct experiences. The organizer does the work once. Each guest needs a tab they can understand, check, and settle. Most of the design effort went to the guest experience.
For the organizer
- Scan
- the receipt. GPT-4o vision reads the items, subtotal, tax, and any auto-gratuity.
- Verify
- what the AI read against the photo.
- Assign
- items. A meal-format preset (Family Style, Coursed, Mixed Bag) handles the shared plates, then a "Who had the…?" prompt goes item by item. Split equally, or by share when people had different amounts.
- Share
- tip, choose who paid, and check each diner's total, then send one link by QR code or text.
For each guest
- Open
- the link. No app, account, or password.
- Pick a name
- to personalize the view. Names aren't verified; anyone with the link sees the same bill.
- Inspect
- your items, your portion of anything shared (¼ of the appetizer, ⅔ of the margaritas), your share of tax and tip, and your total. The full bill and the original receipt photo are one tap away, so anyone can check how their number was reached.
- Pay
- if whoever paid has added a Venmo handle, a button opens Venmo with the recipient, amount, and note prefilled. The guest confirms the payment in Venmo.
- Start your own
- a "Split your own tabs for free" link at the bottom of every tab invites guests to organize their own.




03 – Four decisions and what they taught me
Decision 01
AI does the reading; the organizer makes the call
Vision models misread receipts, so extraction is treated as a draft that the organizer checks against the photo.
The full story
When the items don't add up to the receipt subtotal, the app says by how much and explains that individual shares won't sum to the bill. It offers optional fixes but never blocks sharing, because the organizer at the table knows things the receipt doesn't. Diners see a matching note on their link, so a mismatch is never silent.
Decision 02
One calculation everywhere, accurate to the cent
The organizer's view, the review step, and each diner's link all use the same function, so everyone sees the same numbers.
The full story
Tax and tip are split in proportion to what each person ordered, and amounts are allocated in whole cents. Before that change, roughly 3 in 10 randomized test bills had per-person amounts that missed the receipt total by a cent or so. Now, when every item is assigned and the items match the subtotal, the shares sum exactly to the bill, and a randomized test enforces it.
Decision 03
Design for the guest first, at the organizer's expense
Guests usually meet the product for the first time, didn't choose it, and need to trust that their share is fair.
The full story
Most of the design effort went to the guest: no sign-up, an itemized tab they can check against the full bill, and payment details prefilled in Venmo. Because the link works like a key, it shows as little as possible: no phone numbers or emails, and the receipt photo only for link holders.
The organizer flow got less polish. I was almost always the organizer and could work around its rough edges, so guest-facing work kept winning. The cost showed up when other members wanted to run their own dinners: two have organized group bills so far, and the first-time organizer experience is now the main constraint on adoption beyond my own table. That's the next thing to fix.
Decision 04
Spend engineering effort where money and privacy are at stake
I hardened the parts that could cost someone money or expose private data, and wrote down what I deliberately deferred.
The full story
Re-scans and deletions are all-or-nothing database transactions, so a dropped connection can't leave a half-empty bill. Request logs exclude response bodies, and production won't start without a real session secret. Just as deliberate is what isn't here: no indexes for scale it doesn't have, no error-tracking vendor, and no dependency upgrades for advisories that don't apply to how it runs. A backlog file in the repo records each deferral and why.
Real-world use
Through September 2026:
10
group bills split across 9 dinners
$4,017
in receipts covered
9 of 17
diners came back for two or more dinners
2
guests have since organized group bills of their own
04 – How
I direct the product, UX, technical decisions, testing, and iteration, with AI coding agents writing most of the implementation. I started on Replit in November 2025 because it was the fastest way to learn whether the idea worked at a real dinner. In July 2026 I moved it with Claude Code onto services I control: code on GitHub, Postgres and file storage on Supabase (with existing receipt images still working), and hosting on Vercel.
- Problem
- defined the problem and requirements from what I saw at real dinners.
- Design
- the flows and interaction details: the wizard, meal formats, split-by-share, the diner-facing link.
- Decisions
- the product and technical calls (the pricing rule, what gets validated where, what to secure and what to defer), working through options and tradeoffs with the AI tools.
- Review
- reviewed, tested, and debugged the output, including catching several rounds of split-math errors.
- Quality bar
- one shared calculation instead of copies, and focused automated tests for the parts that handle money and private data.
Tools, constraints & technical notes
Why move off Replit
To own the stack, so I can understand, maintain, and deploy it outside any single platform, and to build fluency with production workflows beyond prototyping: version control, secrets management, database migration, deployment, and automated testing.
Known limits
It calculates; payment happens in Venmo, and the app records who paid the restaurant, not who has paid them back.
Share links are bearer links that don't expire, and diners aren't individually authenticated.
It's sized for dinner parties: a handful of people per table and a few bills a month.
Stack: React 18 and Vite on the front end; an Express API running as a Vercel Fluid Compute function; Supabase Postgres (via Drizzle) and Supabase Storage; OpenAI gpt-4o for receipt extraction and item categorization; Resend for password-reset email.
Community · AI