Inspiration
Splitting a restaurant bill is a small social disaster. One person fronts the money, nobody remembers who had the wine, tax and tip get split unfairly, and friends abroad pay in another currency. The host then spends weeks chasing everyone on a payment app.
The root problem is that somebody pays first and hopes to be paid back. We wanted to flip that: nobody pays until everybody pays.
## What it does
Quorum turns a bill into a shared table.
- Snap or say the bill. Take a photo of the receipt, or just dictate it ("two pizzas at twenty each and a beer, ten"). AI reads every line, and we check the sum against the printed total, to the cent.
- Everyone opens one link (no app, no sign-up) and taps what they had, or says it out loud. Shared dishes are split; tax and tip follow each plate.
- Everyone authorizes, nobody pays. Each person places a PayPal authorization (a hold) for their exact share.
- The quorum. When the last person authorizes, every hold is captured at once. If the deadline passes first, every hold is released and nobody is charged.
Feeling lucky: if everyone agrees, a card is drawn and one person pays the whole bill. The server draws with a cryptographic seed and publishes a SHA-256 proof, so the result is verifiable.
Every step is written to an append-only ledger (shown in the app with AG Grid) with its PayPal status.
## How we built it
- PayPal (Sandbox): Orders v2 with
intent=AUTHORIZE, then capture of all authorizations only at quorum; void on expiry; webhooks verified by signature (PAYMENT.AUTHORIZATION.*,PAYMENT.CAPTURE.*). We ran a real Sandbox payment to the settled state with three participants. - AI (Groq): vision reads the receipt photo; Whisper transcribes dictation and per-person voice commands; a text model turns speech into items and assignments. In English and Spanish.
- The AI never does the math. All money is integer cents in a deterministic engine (split, tax and tip allocation, rounding). The AI only proposes; every output is validated with Zod before it touches the core. The core is covered by 70 unit tests.
- State machine: a room moves through
DRAFT → OPEN → SETTLED / EXPIRED, enforced on the server; lock, capture and expiry are idempotent. - Stack: Next.js 16 (App Router), React 19, Tailwind 4, TypeScript, Supabase (Postgres), AG Grid for the ledger, GSAP for animations, deployed on Vercel.
- No login needed: identity is a random token per person in the table link (only its hash is stored). Email sign-in is optional.
## Challenges we ran into
- Making "nobody pays until everybody pays" real. PayPal authorizations expire, so the deadline is capped inside PayPal's honor period, and the server releases every hold if quorum isn't reached.
- Trusting AI with money. We split responsibilities: AI reads and interprets, code decides. Anything the model returns is schema-validated, and the sum is checked against the printed total.
- Verifiable randomness for Feeling lucky, without letting the host rig the draw.
- Shared state without sign-up. Everyone sees the same table through token links and lightweight polling.
## Accomplishments that we're proud of
- A complete, working flow: from a photo or a sentence to a settled PayPal payment, tested end to end in the Sandbox.
- A demo you can try in one click, with simulated friends, in either Split fair or Feeling lucky mode.
- A money core that is boringly correct: cents only, tested, and independent from the AI.
## What we learned
Authorize-then-capture is a great primitive for group payments, not just checkouts. And the best use of AI in a payments product is to remove typing, while keeping the arithmetic and the rules in code you can test.
## What's next for Quorum-split
- Realtime updates instead of polling.
- A custom email domain for sign-in links.
- Multi-currency splits for groups across countries.
- Sharing a receipt photo straight from a messaging app.
Try it: no account needed. Open the demo, choose a mode, and pay the last share with the PayPal Sandbox buyer shown on screen (test money only).