Inspiration

Planning something with friends should be fun, but buying it together usually isn’t. One person ends up comparing options, collecting everyone’s opinions, paying upfront, and chasing people for their share afterward. If someone drops out, that person is often stuck covering the difference. We built Tandem to handle that coordination inside the conversation where the plan started. We wanted to go from “we should do this” to an actual shared plan without making one friend responsible for everything.

What it does

Tandem is a shopping and planning assistant you can text through iMessage. Tell it what you’re planning, who’s involved, and your budget. It helps find options, compare them, and create a shared plan. Friends join through a link and approve their own share. Tandem tracks the group’s progress and only proceeds when everyone is funded. If someone drops out, it offers alternatives, like choosing a cheaper option or finding a replacement. Afterward, it can also split shared expenses like groceries or gas. Our demo uses test payments, so no real money moves. We also built a Visa Acceptance sandbox integration, although our sandbox account’s processor configuration prevented us from completing live sandbox authorizations.

How we built it

We used Django and PostgreSQL for the backend, React and TypeScript for the website, and Celery and Redis for background jobs and deadlines. Photon connects Tandem to iMessage, Groq powers the conversational agent, and Tavily provides live web search. The AI can suggest actions, but a separate rules engine decides what is allowed. It checks spending limits, consent, group membership, and purchase state before anything changes. We also built signed merchant checkout using Ed25519 signatures, with checks for tampered requests and replay attacks. We divided the work across agent behavior, payments, frontend design, and platform reliability, then integrated everything through shared API contracts and automated tests.

Challenges we ran into

Keeping the conversation consistent was harder than simply getting the AI to answer. It needed to remember confirmed preferences, recognize topic changes, and avoid showing old options or claiming it had created a link when it hadn’t. Group payments added another layer of complexity. A dropout changes the split, which can require new consent and replacement holds. Testing the full journey helped us catch problems that individual tests missed. We also ran into AI rate limits and a Visa sandbox configuration issue. We added model fallback and recovery paths, and kept the demo usable while investigating the payment integration.

Accomplishments that we're proud of

We’re proud that Tandem connects an actual iMessage conversation to a shared plan and individual payment approvals. It feels like one experience instead of several disconnected tools. The dropout flow is one of our favorite parts. The group can switch to a cheaper option, approve the updated shares, and continue without silently charging anyone more. We also built working checkout signatures, tamper detection, and hundreds of automated tests. Those parts are less visible than the interface, but they made us much more confident in the system.

What we learned

We learned that the hardest part of an AI agent is making its actions reliable. A convincing answer isn’t enough if the underlying plan, price, or payment state is wrong. We also learned to separate conversation from authorization. The AI is useful for understanding requests and explaining choices, while deterministic code is better for enforcing limits and handling money. Building with multiple teammates taught us how important clear interfaces and end-to-end testing are. A feature can work on its own and still break when it connects to the rest of the product.

What's next for Tandem

Our next steps are completing the Visa sandbox validation, improving live discovery, and making the transition from a listing to a confirmed price more reliable. We also want to test Tandem with real groups and learn where coordination still feels awkward. Longer term, we’d like to support more merchants and purchases, from weekend trips to roommate furniture and group gifts. The goal is simple: make buying together as easy as talking about it.

Built With

Share this project:

Updates

Submission history