Inspiration
Every group trip starts the same way. Someone says "we should go skiing," the group chat lights up for a day, and then it dies. Nobody wants to compare a dozen hotel tabs or chase people for money. Shopping alone isn't much better: search results are ranked by whoever pays the most for ads, and you still do all the comparing. We wanted every shopper to have an AI agent working for them, and every seller to compete on the offer instead of on ad spend.
What it does
Agora gives every shopper a personal AI buyer agent and every seller one sealed bid per request. You tell your agent what you want, by text or on the site, and it turns that into a request. Sellers set their pricing rules once, including a floor price and any discounts. When a request comes in, our engine places a sealed bid for each seller automatically. Sellers can't see each other's bids or your budget, and paying Agora more never moves a seller up the list. Your agent picks the best offer, explains why, and you check out with a saved card. Group travel is our flagship app. Add Agora to an iMessage group chat and it stays quiet until someone types "agora." Then it reads the chat, works out the plan so far, and gets competing offers for flights, hotels and activities. The group votes on a shared Trip Board, and each person's share is held on their card until everyone is in. Agora makes money only when a sale goes through: a 5% fee (minimum $0.50), refunded if the order is cancelled or returned.
How we built it
- Web app: Next.js (App Router, TypeScript) and Tailwind, deployed on Vercel.
- Data and auth: Supabase Postgres through Drizzle with row-level security, Supabase Auth with phone and password login, and a pgvector catalog for the ski-trip demo.
- AI: DeepSeek through the openai SDK, traced with LangSmith. The model parses requests, talks with the user, picks among offers that already qualify, and explains its pick. Prices, floors, fees and caps are plain code, so no LLM is ever in the bidding path.
- Messaging: Photon Spectrum on a dedicated iMessage line, run by a small always-on Node bot.
- Payments: Stripe Connect in test mode. Destination charges take the 5% fee, card holds cover group shares, and reverse transfers handle refunds.
- Background jobs: an always-on worker on pg-boss, which also pulls memory facts out of chats.
- Memory: onboarding answers (sizes, favorite brands, how much the agent can do without asking, delivery address) become memory facts that every chat can read.
Challenges we ran into
The hardest product problem was keeping the bot from being annoying. A bot that replies to everything ruins a group chat, so in groups ours answers only messages that contain the word "agora" (not "agora" inside a longer word). Each answer reads the chat since the previous ping and plans the next step. In 1:1 chats it makes at most one AI call every 10 seconds and can choose to stay silent. Money had to be exactly right. Stripe retries webhooks and requests can race, so we made event handling idempotent and lock each request so only one offer is ever charged. Cancellations and returns also have to refund Agora's fee, not just the seller's share. The buyer's max price has to steer the auction without ever reaching a seller. We built separate buyer and seller views of each request, so seller-facing code never receives the budget at all. We also switched from phone OTP to phone and password login partway through. On top of that, we merged several branches built in parallel (auction and payments, the Photon bot, the prototype UI) and checked them against one design spec.
Accomplishments that we're proud of
- A sealed-bid auction where fees never affect a seller's rank, with tests that check it.
- A bot that lives in an iMessage group chat and stays quiet until someone asks for it.
- Payments on Stripe Connect from card setup through the 5% fee, group holds, and refunds that return the fee.
- Memory that carries your sizes, brands and address into every conversation.
- A handoff from the group chat to a shared web thread, where offers, voting and checkout happen.
What we learned
LLMs are good at conversation and bad at math nobody can audit. Keeping every price, fee and floor in plain code made the system easier to trust and to test. Group chats need a bot that speaks rarely, which is why ours waits for its name. Fair marketplace rules are easy to state. Enforcing one bid per seller and no pay-to-rank took request locks, separate buyer and seller views, and tests. Writing a binding spec first let us build in parallel and still have the pieces fit when we merged.
What's next for Agora
- Live flight and hotel inventory through SerpApi, so Scout can bring in outside offers.
- Better support for mixed iPhone and Android groups, and live app cards in the chat.
- Categories beyond travel, on the same buyer agent and offer engine.
- Seller onboarding at scale through the setup agent, plus seller verification.
- Real payments instead of Stripe test mode.
Built With
- deepseek
- langsmith
- message
- next.js
- node.js
- openai-sdk
- pgvector
- photon-spectrum
- postgresql
- react
- stripe
- supabase
- tailwindcss
- typescript
- vercel
- vitest
Log in or sign up for Devpost to join the conversation.