Inspiration

Building a setup from parts is a compatibility puzzle. A condenser mic needs 48V phantom power, a stand needs the right mount thread, and an interface needs enough mic inputs. Shops show you products, not whether they work together. When something doesn't fit, you find out after you've paid, and the return takes weeks.

What it does

You type a goal, for example "Podcast setup for 2 people under $900". AgentCart builds a bundle from a curated catalogue of real products. An AI reads each manufacturer's spec sheet and checks every part against the parts it connects to, quoting the sheet as evidence. Parts that don't fit are shown in red with the line that rules them out.

You approve the whole bundle once with PayPal. The money is authorised, not charged. When a shop ships a part, it uploads a photo of the box label. The part is charged only if the label, the AI and the shop's declared model all name the exact variant that was checked. A wrong variant (for example an SM58S instead of an SM58-LC) is never charged, and whatever isn't charged is released when the order is finished.

How we built it

  • Next.js and TypeScript for the shopper page, merchant console and server routes.
  • AG Grid for the bundle table: custom cell renderers for the verdict, its spec-sheet quotes and confidence, row colours by payment state, a pinned total row, and a Swap button that re-checks one row in place.
  • Gemini Pro (gemini-3.1-pro-preview) reads the attached spec sheets and returns a verdict with quotes. Gemini Flash (gemini-3.8-flash) turns the goal into constraints and reads the box-label photo.
  • PayPal Orders v2 with intent: AUTHORIZE for one approval, Payments v2 for partial capture of each confirmed part and void of the rest, order tracking, and the PayPal JS SDK for the popup. Every money call uses a fixed PayPal-Request-Id, so a retry can never charge twice.
  • Render hosts the judge demo (Singapore region, built from main), so judges can try the full flow without installing anything.
  • Safety by design: the AI has no PayPal access. It returns JSON, and only one server file (lib/orders.ts) can capture or void, after every check agrees.
  • Confidence from checks, not self-rating: each quote is looked up in the spec sheet's own text, and verdicts are compared with hand-checked specs the AI never sees. If any check fails, the part is left out of the approval until the shopper reviews it.

Challenges we ran into

  • PayPal's authorise flow allows one purchase unit per order, so paying several sellers from one approval wasn't possible without partner onboarding. We chose a single seller and kept multi-seller as a next step.
  • Spec sheets are inconsistent. Some state the fact we need only in an image, or not at all, so the AI is told to say when a sheet is silent and lower its confidence rather than guess.
  • PDF text is messy. Our quote check once missed a correct quote because a sheet's text came out as "5 / 8" instead of "5/8", which made a correct part look untrustworthy. We fixed the matcher and added the real sheet text as a test.
  • Making the result repeatable: parts are checked in a fixed order, cheapest first, and verdicts are cached by product set.
  • Live prices from Channel3. We mapped 22 of 23 catalogue products to hand-picked Channel3 listings and built the lookup with a fallback to the last checked price; the fallback held when we broke the key on purpose. But spot-checks against retailer pages found stale prices (one microphone listed at $439 against $369 at retail; one pair of headphones at $179 against $159). Showing judges a wrong price, or a total that drifts from the demo, would undermine the trust the product is built on, so we shipped with checked prices and kept live pricing as a next step.

Accomplishments that we're proud of

  • 20/20 correct on a held-out test set of real spec-sheet pairings, written and hand-checked before the AI ever saw them.
  • A wrong variant is never charged, by construction: the AI alone can never trigger a capture.
  • Tested against the real PayPal sandbox: partial captures followed by a void of the remaining hold.

What we learned

We learned that trust has to come from checks people can see, not from the AI sounding confident. Every verdict had to quote the spec sheet and pass a check we wrote ourselves. We also learned how much of a payments product is about the money you don't take: holding, partially capturing and releasing it correctly mattered as much as charging it.

What's next for AgentCart

  • Live prices and stock for each catalogue product. We built the lookup with Channel3, with a fallback to the checked price, and kept it off for judging until our retailer spot-checks pass.
  • Finding products live from retailer listings, instead of a curated catalogue. Our tests showed search didn't yet pick the exact variant reliably enough.
  • Paying several sellers from one approval through PayPal's multi-seller onboarding.
  • Matching the box itself (barcode scan or label photo matched to the catalogue), not just the label text.

Built With

Share this project:

Updates

Submission history