ChatGPT Setup β Build a Custom GPT That Negotiates Prices
π― Just want to USE the GPT, not build one? A published Custom GPT is already live:
One click in any browser. Requires a ChatGPT Plus/Pro/Team account to install (free accounts can use it once installed). Skip the rest of this guide.
If you'd rather build your own (e.g., to brand it for your own store, customize the instructions, or fork the proxy logic) β keep reading.
This guide walks you through creating a Custom GPT in ChatGPT that can find negotiate.v1-compliant stores and haggle on your behalf. End state: anyone with a ChatGPT Plus/Pro/Team account installs your Custom GPT and starts negotiating in two clicks.
Total setup time: ~10 minutes, all in the GPT Builder UI. No code.
What you get
After publishing, anyone using your Custom GPT can say:
"Find me a store that sells Dyson vacuums and negotiate the V15 down to under $560."
ChatGPT calls the negotiate.v1 proxy at negotiate.pier39.ai, which:
- Searches the public store directory for matching stores
- Discovers each candidate's catalog
- Opens a chat session with the chosen store's AI sales rep
- Drives the negotiation turn by turn until the deal closes (or walks)
ChatGPT applies real shopper tactics: anchor low with comps, push for bundles, walk gracefully if the floor's too high. The merchant agent on the other side does the same in reverse.
Prerequisites
- A ChatGPT account that can build Custom GPTs. This currently requires ChatGPT Plus, Pro, Team, or Enterprise. Free accounts can use Custom GPTs but not create them.
- 5 minutes of focus. GPT Builder has a few fields to fill in.
Step 1 β Open GPT Builder
- Go to chatgpt.com and sign in.
- In the left sidebar, click Explore GPTs (or GPTs in some versions).
- Click + Create in the top-right.
You'll land in GPT Builder, which is a split-screen tool: a chat-style assistant on the left helps you configure, the right side shows a live preview of your Custom GPT.
Step 2 β Switch to the Configure tab
By default GPT Builder opens to the conversational "Create" tab. You can use that, but for this setup the Configure tab is faster. Click Configure at the top.
You'll see a form with these sections (top to bottom):
- Name
- Description
- Instructions
- Conversation starters
- Knowledge
- Capabilities
- Actions
Fill them in as below.
Step 3 β Name + Description
Name: Negotiate Agent
Description: Find AI-negotiable stores and haggle prices for you. Works at
any negotiate.v1-compliant storefront.
(Adjust the wording to taste β these are visible to anyone browsing your GPT.)
Step 4 β Instructions (the system prompt)
This is the most important field. Paste this verbatim into the Instructions text area:
You are a shopper agent that negotiates prices on behalf of the user at
negotiate.v1-compliant storefronts. You have 5 actions available:
findStores, discoverStore, listProducts, startNegotiation, sendMessage.
# When the user asks to negotiate
1. If the user names a specific product but no store, use findStores with
their search terms (e.g. findStores(query="dyson vacuum")). Pick the
most relevant store from the results and ask the user to confirm β
unless they've made it clear to just go ahead.
2. If the user names a specific store domain, skip findStores and go
straight to discoverStore(domain=...) to fetch the catalog.
3. Use listProducts (or read the products array from discoverStore) to
find the matching product. Note its `id`, `list_price`, and any
relevant fields.
4. Call startNegotiation(domain=..., product_id=...). Save the returned
session_id and the domain β you need both for every subsequent turn.
5. Read the merchant's greeting (in the response). Then craft your
opening shopper turn and call sendMessage(domain=..., session_id=...,
message=...). Pass the user's stated budget, any comps they
mentioned, and what extras they value (free shipping, warranty, etc.).
6. After each sendMessage, read the merchant's reply. Decide whether
to push back, accept, or walk. Apply real negotiation tactics:
anchor below the user's budget, justify with comps, trade
non-price concessions instead of giving on price, walk gracefully
if the merchant's floor exceeds the user's budget.
7. Keep going until sendMessage returns "closed":true. Then summarize
the deal for the user: final price, what's bundled, total
effective cost.
# Negotiation principles
- The merchant agent is also AI. It holds its floor. It's not pretending.
- Never roleplay both sides. Only the user sees your messages; only the
store's API sees the merchant's. Don't fabricate merchant replies.
- Don't reveal the user's true ceiling. If they said $500, anchor at $450.
- Free shipping, extended warranty, bundled accessories are all real
cheap concessions worth pushing for. They're often easier to get than
a price drop.
- If the merchant repeats the same number twice, that's likely their
floor. Make your final move close to it or walk gracefully.
- A walk-away has signaling power. Sometimes the merchant comes back
with a better offer through a different lever.
# Failure modes to avoid
- DO NOT roleplay the merchant's responses. If sendMessage fails or
returns an error, tell the user β don't fake a reply.
- DO NOT call sendMessage without first calling startNegotiation.
- DO NOT lose the (domain, session_id) pair across turns β they're
paired and both required.
Step 5 β Conversation starters
These are the example prompts that appear under the GPT name when users open it. Add four:
Find me a Dyson vacuum I can negotiate for, target under $560
Find me an Airwrap, target under $480, must include the gift box
Find a Dyson air purifier, target under $510 with extra filters
Find a hair dryer at a discount, ideally under $345
(These all map to the Atlas reference store today. As more stores join the directory, you'll add more diverse examples.)
Step 6 β Capabilities
Uncheck everything in the Capabilities section:
- β Web Browsing β not needed; the proxy handles all HTTP
- β DALLΒ·E Image Generation β not relevant
- β Code Interpreter & Data Analysis β not relevant
Disabling unused capabilities makes the GPT faster and cheaper.
Step 7 β Actions
This is the hookup that makes everything work. Scroll to the Actions section at the bottom of the Configure form.
- Click Create new action.
- In the Authentication dropdown, leave it as None (the proxy is public, no auth needed).
- In the Schema field, paste this URL:
https://negotiate.pier39.ai/openapi.yaml
ChatGPT fetches the OpenAPI manifest from that URL and auto-imports all 5 actions. You should see them appear in a table below: findStores, discoverStore, listProducts, startNegotiation, sendMessage.
- In the Privacy policy field, paste:
https://negotiate.pier39.ai/docs/protocol
(ChatGPT requires a privacy policy URL for actions; the protocol page works since it's about how data flows.)
- Scroll back up and confirm the Actions count says 5 actions configured.
Step 8 β Test it
GPT Builder's right-side preview is a live ChatGPT instance using your Custom GPT. Test before publishing.
In the preview chat, type:
Find me a Dyson HP07 air purifier and negotiate it down to under $510.
You should see ChatGPT:
- Call findStores with
query="dyson air purifier"β returns Atlas - Call discoverStore with
domain="negotiate.pier39.ai"β returns the catalog - Call startNegotiation with
product_id="hp07-hot-cool"β returns session_id + Chonkers's greeting - Call sendMessage with the opening shopper turn β reads the merchant's reply
- Loop on sendMessage until
closed:true
Each action call shows up as a small "Used [actionName]" line in the chat. Click any of them to expand and see the actual request/response.
If anything fails, check the error message in the response. Common causes:
directory: could not reach...β momentary GitHub raw outage; retryunknown product_idβ ChatGPT picked the wrong id; rephrase your prompt to specify the exact name
Step 9 β Publish
In the top-right of GPT Builder, click Save (or the dropdown next to Save).
Choose visibility:
- Only me β private, only your account can use it. Good for personal use.
- Anyone with a link β semi-private, share the URL with whoever you want.
- Everyone β public, listed in the GPT Store. Best for distribution.
For your launch: pick Everyone and submit it to the GPT Store. There's a category dropdown when you publish β pick Productivity or Lifestyle depending on the framing you want.
After publishing, you get a shareable URL like https://chatgpt.com/g/g-XXXXXXXXX-negotiate-agent that you can drop into your launch post, blog, social media, etc.
What this gets you
A ChatGPT-native shopping experience that competes directly with Claude Desktop's MCP install. Anyone with a ChatGPT account can install your Custom GPT in two clicks and start negotiating immediately. No Claude account required. No connector config to paste. Just "Add to ChatGPT".
That doubles the addressable shopper population overnight.
Going further
- Add the Custom GPT URL to your launch post β alongside the Claude Desktop install, the Custom GPT is the ChatGPT equivalent. Both routes converge on the same backend.
- Iterate on the instructions β once real users try it, you'll see common failure modes (e.g., ChatGPT being too aggressive, or too quick to accept). Tighten the system prompt.
- Add more conversation starters as the directory grows. Stores in different categories give you different demo prompts.
- Track usage β the GPT Builder dashboard shows how many people use your GPT, what conversations are happening (anonymized), and which actions get called most. Use this to decide what to build next.
See also
- PROTOCOL.md β the formal negotiate.v1 spec
- SHOPPER_SETUP.md β the equivalent guide for Claude Desktop users
- STORE_SETUP.md β for store owners who want to be negotiable
- openapi.yaml live β the manifest ChatGPT loads
License
The protocol and proxy are MIT-licensed. The skills are Apache 2.0.