← Building2025–nowLive

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 ↗
Tab Splits verifying a receipt before splitting

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.
Verify step: AI-extracted, auto-categorized items beside the receipt photo
Organizer: AI-extracted items, checked against the receipt photo.
Assign step: three margaritas split 2:1 between Priya and Marcus
Organizer: an unequal split.
Guest name picker: personalizes the view, no login
Guest: pick your name.
Guest tab: items with fractional shares, tax, tip, total, and a Pay on Venmo button
Guest: your itemized tab and the Venmo handoff. Screenshots use a synthetic receipt and fictional diners.

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