Inspiration
What it does
How we built it
Challenges we ran into
Accomplishments that we're proud of
What we learned
What's next for Last Call## Inspiration
Group plans fall apart at the money step. Everyone says "I'm in," one person fronts the cost, and then chases friends for weeks.
What it does
Last Call lets a group chip in for a shared plan without anyone being charged until the plan is real.
- The organizer creates an event with the amount the group needs and shares one link.
- Friends pledge in their own words. Someone types "I'm in for $40, but only if Jay's in." The AI reads it and fills in the pledge: max $40, condition "Jay". The friend checks the boxes and confirms. Nothing is saved until they do.
- PayPal holds the card, without charging it. Each friend's max is placed as a card authorization.
- The board updates live. Everyone sees the progress bar, who's in, and who is "Waiting on Jay".
- Last call. When the goal is reached, a short countdown starts so late friends can still join, and every new person lowers everyone's share.
- Lock. Each counted friend is charged once, only their share. Holds for anyone not needed, or whose conditions weren't met, are cancelled. If the goal is never reached, every hold is cancelled and nobody pays.
The goal is fee-adjusted, so the group still collects the full amount after PayPal's fees.
How we built it
- PayPal Orders v2 with intent AUTHORIZE: card fields place a hold, lock captures only each friend's share with
final_capture, and everything else is voided. Every PayPal call sends a PayPal-Request-Id that is saved before the call, so a retry can never charge twice. - AI: Groq (
openai/gpt-oss-20b) reads each pledge message and returns a suggested max, min and conditions. The AI never moves money: the friend confirms every value, and plain, tested code checks it before anything is held. - Python + Flask on Render, Neon Postgres, plain HTML/JS.
- Money in integer cents only, all money math in one module, and status changes use compare-and-set so two requests can't act on the same event.
- Self-healing: if the server sleeps or crashes mid-lock, the next visit finishes the job safely (resume), and a cleanup sweep cancels leftover holds.
- 265 automated tests against a fake PayPal and a real test database, plus "mutation checks": we broke each safety rule on purpose and confirmed a test catches it.
Challenges we ran into
- Conditional pledges in a circle: Ana is in only if Jay is, and Jay only if Ana is. We count pledges whose conditions are met by other held pledges, including circles, and tell the group who they're actually waiting on.
- Never charging twice: network failures in the middle of a charge. We save each request ID before calling PayPal, read PayPal's real status instead of trusting HTTP codes, and resume half-finished locks.
- Keeping the AI safe around money: the AI only suggests; it can't save, hold or charge anything.
Accomplishments that we're proud of
- A full hold → charge share → cancel the rest flow working in PayPal sandbox on a live URL.
- Live conditional pledges ("Waiting on Jay") with real sandbox card holds.
- A test suite that proves the safety rules, not just the happy path.
What we learned
[Each of you: one line. For example: how card authorizations differ from payments, idempotency, compare-and-set, prompt design for strict JSON.]
What's next
- A treasurer dashboard listing all of an organizer's events (needs accounts).
- Pay-link recovery when one friend's card fails at lock.
- Quick-amount buttons, and more languages for pledge messages.
Sandbox demo: no real money moves. All payments use PayPal's sandbox.
Built With
- css
- flask
- groq
- html
- javascript
- neon
- paypal
- paypal-orders-api
- postgresql
- python
- render
Log in or sign up for Devpost to join the conversation.