Inspiration

AI assistants are starting to shop for people, but they can only buy from stores with integrations. A one-person studio has none.

The other half bothered me more. Everyone is excited about agents that run a business for you: answer customers, issue refunds, chase invoices. But no small shop owner should hand an agent the keys to their PayPal.

So I wanted two things at once:

  • a small shop that any AI assistant can buy from;
  • an AI that can help run the shop, while money only moves within the owner's rules or with the owner's OK.

That's Sayso: your agents ask, you say so.

What it does

  • Opening a shop takes a few photos. The owner uploads pictures of her work and a line of text. Sayso drafts the shop and suggests prices from what similar pieces sell for. She confirms, signs in with PayPal, and the shop is live.
  • Any AI shopper can buy. Sayso exposes an MCP server. In ChatGPT you add it once as a custom MCP plugin (no sign-in, just the server address) and ask for what you want. The assistant builds a cart with PayPal's merchant-cart spec, and the shop prices it, not the AI. When stock runs out, the shop offers a fix and the assistant takes it. The buyer pays with a Pay with PayPal button in the chat.
  • Every money move goes through Guard. A refund, an invoice or a rule change is first a proposal. Guard simulates it against PayPal and checks it against the owner's rules. Then it either runs or waits for her. When it waits, her phone can notify her, she sees who asked and why, and she can approve with her fingerprint. The passkey signs that exact request, PayPal does it, and Sayso reads the result back from PayPal before calling it done.
  • Agents can't grant themselves power. When an agent asks to raise its own refund limit to $10,000, Guard holds it. Only the owner changes the rules.
  • Autonomy is earned. After she approves the same kind of request three times, Sayso suggests a rule that lets the agent handle those alone. The limit comes from her own approvals, rounded up to the next $10, and it never goes past anything she turned down.
  • It stays in step with PayPal. If she refunds from her PayPal account, or a buyer opens a dispute, PayPal's webhooks tell Sayso. Her orders, sales and audit trail stay in step with PayPal.

How I built it

  • App: Next.js 16, React 19 and TypeScript (strict), with Postgres. Hosted on Render: web service, database and a cron job.
  • PayPal, end to end:
    • Orders v2: authorize, capture, void and tracking.
    • Payments: refunds, each one read back after it runs.
    • Vault: saved PayPal for buyers, with limits.
    • Invoicing: custom orders and deposits.
    • Partner Referrals: sales land in the owner's own account.
    • Log in with PayPal: the owner's PayPal is her login.
    • Webhooks: verified in-house (CRC32 of the raw body, SHA256withRSA, certificate only from *.paypal.com). Each event is treated as a hint: Sayso re-reads the payment from PayPal with the owning account before changing anything.
  • Agent interfaces: an MCP server for buyers (no key needed) and one for sellers (a scoped, revocable key, never a PayPal login), plus a CLI and an agent skill. The cart card in ChatGPT is an MCP App that Sayso serves itself.
  • Guard: propose → simulate against PayPal → check the rules → run or wait → passkey signature → execute → read back. Every step lands in a hash-chained audit log, so any record can be checked: "chain intact ✓".
  • The rest of the stack:
    • AG Grid: orders, catalog and activity.
    • AG Studio: the in-depth report on the owner's Overview.
    • Bryntum: the "what to make next" production board.
    • Channel3: market prices.
    • APIMatic: SDKs and a developer portal from the OpenAPI spec.
  • Tests: 213 of them, running against an in-memory PayPal that refuses impossible calls the way PayPal does, including its webhooks.

Challenges

  • Never moving money twice. Agents retry, and webhooks can arrive twice or out of order. Every write to PayPal carries an idempotency key, and every webhook handler can run twice without effect.
  • Prompt injection through the shop itself. Buyers write refund reasons, names and notes, and the owner's assistant reads them. So that assistant only reads: it can't refund, approve or change anything. It points the owner to the page where she does it herself.
  • Making "held" feel safe, not annoying. If an owner has to approve everything, the agent saves them nothing. Earned rules let the routine requests stop waiting.

What I learned

The hard part of agentic commerce isn't the AI, it's trust. Giving an agent power is easy; giving it power in a way the owner can see, limit and take back is the real product. PayPal already has the primitives for that: authorizations, refunds that can be read back, signed webhooks and partner accounts. Sayso is the layer that decides when an agent may use them.

Built With

Share this project:

Updates

Submission history