Inspiration
AI agents can already search, compare and decide for us. At checkout they stop, because nobody has solved how an agent should spend money safely. I kept asking one question: if my agent agrees on a price, what stops it from overspending, and who gets to say no?
Tender is my answer. Agents negotiate, a human stays in control of big decisions, and PayPal moves the money.
What it does
Tender is a control room where buyer and seller agents, each with its own wallet and spending policy, negotiate and settle deals through PayPal.
- Everyday shopping: The Pantry Butler agent contacts two competing grocery sellers, haggles with each, picks the cheapest offer and settles it.
- Land and cars: An "Acquisitions Concierge" buyer negotiates with two land brokers or two car dealers. The arguments fit the category: title, zoning and frontage for land, mileage and warranty for cars. They trade offers over several rounds until they agree on a price, and the cheaper seller wins.
- Human approval: Each agent has a per-transaction cap, a daily cap, a category allow-list and an approval threshold. A six-figure purchase pauses in an Approvals Queue, and no money moves until a person clicks Approve.
- Payouts: A manager agent gets paid, then automatically splits the revenue among subcontractors with one PayPal Payouts batch.
- Live dashboard: There are 9 agents, a real-time ledger, an activity feed, pending approvals and spend analytics. Every deal opens into its full negotiation transcript.
How I built it
- Frontend: React, Vite and Tailwind, with Server-Sent Events so the dashboard updates live as agents negotiate.
- Backend: Node.js and Express, with Prisma on SQLite.
- PayPal: The Orders API v2 creates each purchase, and the Payouts API v1 pays sellers and splits revenue. Authentication is OAuth 2.0 client credentials against the PayPal Sandbox. A single environment variable,
TENDER_MODE, switches between a safe mock mode and live sandbox. - Negotiation engine: It's deterministic by default, so demos are reliable. If you add a Groq or OpenRouter key, the same agents negotiate with a live LLM.
- Deployment: Both services run on Render from a single blueprint.
Challenges I ran into
- Making the haggling sound human: My first version was just numbers going back and forth. A buyer that cites closing costs and a broker that defends clean title read much more convincingly, so I made the dialogue depend on the category.
- Keeping money moves safe: Letting agents spend autonomously is risky. I had to design the order of policy checks and approval so settlement can never happen before a human signs off.
- Real-time state: Approvals, ledger rows and activity feed items all had to stay in sync over SSE. Pending and settled states were tricky to keep consistent.
- Free-tier cold starts: The API sleeps when idle, which made demos and recording awkward until I learned to wake it first.
- Recording the demo: The ledger and detail drawer are interactive, so automating clean screenshots and video took more trial and error than I expected.
Accomplishments that I'm proud of
- Two agents negotiating over land and cars, with reasoning that reads like a real conversation
- A human-in-the-loop flow where agents handle the work and people keep the final say
- Using both the PayPal Orders and Payouts APIs, so Tender covers buying and paying out
- A live, deployed demo that anyone can try right now
What I learned
- Trust is the real blocker for agent payments, not intelligence. Caps, allow-lists and approvals matter as much as the AI.
- Building to PayPal's sandbox APIs, with a mock mode alongside, made development and demos much faster.
- Streaming updates make agent behavior far easier to understand and trust than a finished result alone.
What's next
- Plug into real storefronts such as Shopify and WooCommerce, using the merchant's existing PayPal account
- Add dispute handling and refunds
- Add per-agent budgets that reset on a schedule, and richer analytics
- Test with live sandbox flows end to end, then move toward production review
Built With
- ag-grid
- agent
- ai-agent
- express.js
- groq
- javascript
- llm
- node.js
- oauth2
- openrouter
- paypal
- paypal-orders-api
- paypal-payouts-api
- prisma
- react
- render
- server-sent-events
- sqlite
- tailwindcss
- typescript
- vite
Log in or sign up for Devpost to join the conversation.