Sayso docs
Sayso connects small shops to shoppers and their AI assistants through PayPal. Shoppers buy on the site or from their own assistant, the shop owner's own agent runs the shop, and money only moves inside the rules each person set.
This demo runs on the PayPal sandbox. No real money moves.
Shop on Sayso
No account and nothing to install: PayPal knows who you are when you pay.
- Open Shops and pick one, or tap Ask AI to shop at the bottom right. Sayso's assistant searches every shop and shows what it finds with photos and links; it only shops at Sayso.
- Add pieces to the cart, or let the assistant build it. Each shop has its own cart, because each shop prices it (shipping and tax included) and is paid on its own.
- Pay with PayPal's button, right in the cart or the chat. Nothing is charged until you approve, and you can cancel a cart the assistant made.
- Every order gets its own page: where it is (paid, preparing, shipped, with the parcel's tracking) and its refunds, with a QR code and a link to open it on your phone. To ask for a refund, the assistant takes your reason to the shop and the owner decides; only the buyer can ask (from the browser that paid, or signed in with that PayPal), so a shared link only shows the order. Your receipt links to the page, and the panel's Orders tab lists your orders wherever you are on the site.
- On another phone or computer, open My orders and sign in with the PayPal account you paid with. There's no Sayso account: PayPal tells Sayso who you are, and you see every order that account paid for, in every shop.
Shop from your assistant
One MCP server covers every shop on Sayso. No account or key needed.
https://sayso-ovph.onrender.com/api/shopping/mcp- Add it as a connector in your assistant: in ChatGPT, follow the steps below; in any other MCP client, add a remote server with this URL.
- Ask for what you want, for example “a green hand-thrown mug, shipped to Austin”.
- Your assistant builds the cart with the shop's real prices, shipping and tax. ChatGPT shows it as a card with a Pay with PayPal button; other clients give you a PayPal link. You approve in PayPal.
- Later, ask “where is my order?” or “it arrived broken, ask for a refund”. Refund requests go to the shop owner, who decides.
Add Sayso to ChatGPT
About a minute, once. After that any chat can shop at Sayso's shops.
- In ChatGPT, open Settings, then Plugins (Apps or Connectors in some versions and plans). Press Add and choose a custom MCP server. If it asks, turn on Developer mode under Advanced.
- Name it Sayso, set authentication to No authentication, and paste this as the server URL:
https://sayso-ovph.onrender.com/api/shopping/mcp- Tick the box that says you trust it, then press Create plugin.
- In a new chat, ask it to use Sayso: “Use Sayso to find me a handmade mug under $40.” It searches every shop, builds the cart and shows it with a Pay with PayPal button.
Shop owners connect their own agent from Agents in their dashboard: see Run your shop with your agent. Rather not set anything up? Shop on this site, with a cart or Sayso's assistant.
Pay without a link each time
Ask your assistant to set up PayPal (it calls connect_paypal). You get a Sayso page where you choose two limits, then approve once in PayPal.
| Inside your limits | Your assistant pays on its own. The shop still checks stock before charging. |
| Over a limit | Nothing is charged. You get a normal PayPal link to approve that one order. |
| Changing limits | Only by disconnecting and approving again. Your assistant can't raise them. |
| Disconnecting | From the same page, at any time. PayPal forgets the saved account. |
After approving, you see a personal shopping URL once. Use it as your connector instead of the plain one and your assistant can pay inside your limits in any chat. Treat it like a password.
Run your shop with your agent
- Upload photos of your pieces: Sayso drafts each listing and suggests a price from similar items. Check the draft on the same page (names, prices, stock, shipping) and confirm every price, then Publish with PayPal: signing in claims the shop and publishes it. Signing in with PayPal is the only thing that approves money moves; no agent key can.
- In your dashboard, open Agents and press Connect an agent. For ChatGPT or Claude, add the address below as a custom connector: the app sends you to Sayso to allow it and gets a key of its own (OAuth), so there is nothing secret to copy. Any other MCP app, a script or the terminal gets a key you copy once.
https://sayso-ovph.onrender.com/api/mcpYour agent can now check orders, refund, add tracking, invoice custom orders, change prices and stock, plan made-to-order work, and propose rules. Anything over your limits waits for you on your phone, and the agent is told so. Revoke its key in Agents and it stops working at once.
Your dashboard's Overview shows the week against the one before (revenue, orders, average order, refund rate), what your agents did with your money, the latest orders and where they came from, and an in-depth report of every request, sale and money move, each checked against PayPal. Ask about your shop, at the bottom right of every owner page, answers questions about your own shop (sales, refunds and net for any period, a month-end estimate, what waits for you) and only reads. Orders, Catalog, Making and Activity hold the rest.
Get paid into your PayPal
Signing in with PayPal only tells Sayso who you are. To have sales paid into your account, press Set up payments in your dashboard and allow Sayso two things in PayPal: to take payments for you, and to refund them. From then on every sale lands in your account directly; Sayso never holds your money.
Refunds of those sales come out of your account, still only inside your rules or with your OK. Sayso checks with PayPal which account you connected and what you allowed before it relies on either. Each order shows which account it was paid into.
The sayso CLI
The same tools from a terminal, for you or for a coding agent. Node.js 22.18 or later, no install: run it from the repository.
node cli/sayso.ts login --url https://sayso-ovph.onrender.com --key sk_agent_...| Command | What it does |
|---|---|
| sayso status | Orders, what is waiting for you, low stock, what shoppers could not get |
| sayso orders | Recent orders; sayso order SAY-... for one |
| sayso refund SAY-... 10.00 --reason "..." | Refund through your rules |
| sayso track SAY-... USPS 9400... | Add shipment tracking in PayPal |
| sayso invoice <email> "Custom vase" 62.00 --deposit 31.00 | Invoice a custom order through PayPal |
| sayso invoices | Invoices with their live status |
| sayso price <variant> 38.00 | Change a price |
| sayso stock <variant> 4 | Set stock |
| sayso approvals | What is waiting for you (read-only) |
| sayso policy propose "..." | Draft new rules; they apply after you approve |
| sayso policy earned | Rules your own approvals support, with the decisions behind them |
| sayso audit | Every money move with its hash-chain check |
| sayso mcp | Serve the tools to a local MCP client over stdio |
Add --json to any command for machine-readable output. Exit codes: 0 done, 3 waiting for the owner, 4 refused, 1 error, 2 usage. The repository also ships an agent skill (skills/sayso/SKILL.md) that teaches an agent to drive the CLI.
How your money is protected
Every refund, charge and rule change goes through the same steps: simulated against the live PayPal payment, checked against your rules, sent once, read back from PayPal, and written to a log that shows any later edit.
- AloneRefunds and charges inside your rules, tracking, prices and stock.
- Asks youAnything over your limits, the first invoice to someone who has never paid you, every refund a buyer asks for, and every change to your rules.
- NeverAn agent approving its own request, raising its own limits, or seeing your PayPal credentials.
Write your rules in plain words, for example “refunds over $30 need my OK; invoices to new clients always need my OK”. They become exact rules you can read in Rules, and the rules decide, not the AI.
When you approve the same kind of request three times, Sayso suggests letting your agent handle those alone, up to a limit your approvals support (rounded up to the next $10) and never past anything you turned down. Your agent can ask for that rule too, but only you can say yes: agents earn autonomy, they never take it.
Money can also move in PayPal itself: you refund from your PayPal account, PayPal reverses a payment, a hold runs out, a buyer opens a dispute. PayPal tells Sayso through its webhooks; Sayso checks the signature, reads what changed back from PayPal and records it, so your orders, sales and Activity always match PayPal. Disputes show on the order with their deadline, and you answer them in PayPal.
PayPal's merchant-cart API
Every shop also implements PayPal's Agentic Commerce merchant-cart API, for any platform or agent that speaks that spec:
https://sayso-ovph.onrender.com/api/shops/<shop>/merchant-cartPOST creates a priced cart, PUT /{id} replaces it, POST /{id}/checkout completes it after the buyer approves. Problems come back as validation issues with resolution options an agent can apply.
To find shops and products over plain HTTP, use GET /api/shops and GET /api/shops/{shop}/products?query=. The whole API is described in an OpenAPI spec. From it, APIMatic generates the developer portal (reference, try-it console and guides) and typed SDKs for TypeScript and Python, in the repository's sdk/ folder.
Reference
| MCP endpoint | Who | Tools |
|---|---|---|
| /api/shopping/mcp | Shoppers, every shop | list_shops, search_products, create_cart, update_cart, get_cart, request_refund, connect_paypal, wallet_status, pay_with_paypal |
| /api/shopping/mcp/<wallet key> | Shoppers with saved PayPal | The same, paying inside their limits |
| /api/shops/<shop>/mcp | Shoppers, one shop | The shopping tools for that shop only |
| /api/mcp | The owner's agent, OAuth or a bearer key | shop_overview, sales_summary, list_products, update_product, update_variant, price_check, production_board, plan_job, finish_job, list_orders, get_order, refund_order, add_tracking, send_invoice, list_invoices, list_approvals, get_say_so, get_policy, propose_policy, rule_suggestions, propose_rule_suggestion, audit_log |
| /api/mcp/<agent key> | The owner's agent, personal URL | The same, for apps that only take a URL |
MCP over Streamable HTTP, protocol 2025-11-25 (also 2025-06-18 and 2025-03-26). Clients that send headers can use /api/mcp and /api/shopping/mcp with Authorization: Bearer <key>. Full details in the README.