Build, Secure, and Monetize Your First ChatGPT Plugin (June 2026 Launch)
Introduction
The ChatGPT plugin marketplace exploded in June 2026, turning OpenAI’s chat interface into a full‑blown app store. Within weeks, developers logged 1.3 M installs and the top‑10 plugins earned $12 M. If you want to ride this wave, you need a clear, hands‑on roadmap that takes you from a blank repo to a revenue‑generating, security‑hardened listing in the official store.
Below you’ll find:
- The exact folder structure and manifest file OpenAI expects
- Minimal, copy‑and‑paste code to spin up a working endpoint (Node.js & Python examples)
- Proven monetization patterns and the API calls required to share revenue with OpenAI
- A security checklist that mitigates the three known plugin‑specific attack vectors
- Real‑world case studies, launch checklist, cost estimates, and a concise FAQ
Read on, copy the snippets, and launch your plugin today.
1. Architecture at a Glance
my-plugin/
├─ manifest.json # OpenAI‑required metadata
├─ server/
│ ├─ app.js (Node) # or app.py (Flask)
│ └─ utils/
│ └─ validate.py # input sanitisation
├─ .env # API keys (never committed)
└─ README.md
- manifest.json tells the store where your API lives, what scopes you need, and whether the plugin is free or paid.
- server/ hosts a lightweight HTTPS service that the OpenAI runtime calls.
- utils/validate centralises all prompt‑injection defenses.
2. Step‑by‑Step: Get a Working Plugin Running
2.1 Create the manifest
{
"schema_version": "v1",
"name_for_human": "Smart Calendar",
"name_for_model": "smart_calendar",
"description_for_human": "Add, move, and view events in Google Calendar.",
"description_for_model": "Provides functions to list, create, and modify calendar events for a user.",
"auth": {
"type": "service_http",
"authorization_type": "Bearer",
"verification_tokens": {
"openai": "YOUR_OPENAI_VERIFICATION_TOKEN"
}
},
"api": {
"type": "openapi",
"url": "https://your-domain.com/openapi.yaml",
"has_user_authentication": true
},
"logo_url": "https://your-domain.com/logo.png",
"contact_email": "dev@your-domain.com",
"legal_info_url": "https://your-domain.com/terms"
}
Replace YOUR_OPENAI_VERIFICATION_TOKEN with the token shown in the OpenAI developer console.
2.2 Minimal Node.js endpoint
npm init -y
npm install express axios dotenv
// server/app.js
require('dotenv').config();
const express = require('express');
const axios = require('axios');
const { sanitize } = require('./utils/validate');
const app = express();
app.use(express.json());
app.post('/list-events', async (req, res) => {
// 1️⃣ Validate user input
const safeQuery = sanitize(req.body.query);
if (!safeQuery) return res.status(400).json({error: 'Invalid query'});
// 2️⃣ Call Google Calendar API (example)
const response = await axios.get('https://www.googleapis.com/calendar/v3/calendars/primary/events', {
headers: { Authorization: `Bearer ${process.env.GOOGLE_TOKEN}` },
params: { q: safeQuery }
});
// 3️⃣ Return a clean JSON payload for the model
res.json({ events: response.data.items });
});
app.listen(3000, () => console.log('Plugin server listening on :3000'));
2.3 Equivalent Flask snippet (Python)
pip install flask requests python-dotenv
# server/app.py
import os
from flask import Flask, request, jsonify
from dotenv import load_dotenv
import requests
from utils.validate import sanitize
load_dotenv()
app = Flask(__name__)
@app.route("/list-events", methods=["POST"])
def list_events():
data = request.get_json()
safe_query = sanitize(data.get("query"))
if not safe_query:
return jsonify(error="Invalid query"), 400
resp = requests.get(
"https://www.googleapis.com/calendar/v3/calendars/primary/events",
headers={"Authorization": f"Bearer {os.getenv('GOOGLE_TOKEN')}"},
params={"q": safe_query},
)
return jsonify(events=resp.json().get("items", []))
if __name__ == "__main__":
app.run(port=3000)
2.4 Deploy
- HTTPS required – use Vercel, Fly.io, or a managed Kubernetes ingress with a free Let’s Encrypt cert.
- Set
OPENAI_API_KEYand any third‑party tokens in the platform’s secret store; never commit.env.
3. Monetization Models
| Model | How to implement | Revenue‑share handling |
|---|---|---|
| Free + In‑app subscription | Add a /checkout endpoint that creates a Stripe Checkout Session and returns the session URL. |
After payment, store a plan_id in your DB and call POST /v1/marketplace/revenue with {plugin_id, amount, user_id} to credit OpenAI. |
| Pay‑per‑use | Count API calls (req.headers['openai-plugin-id']) and multiply by a rate (e.g., $0.001 per call). |
At the end of each billing cycle, batch‑send usage data to the Marketplace Revenue API. |
| One‑time purchase (store‑listed) | Set "pricing": {"type":"one_time","price_usd":4.99} in the manifest’s metadata (store‑only field). |
OpenAI automatically deducts 15 % and pays you the net amount via your linked bank account. |
Sample Revenue API call (Node)
await axios.post(
'https://api.openai.com/v1/marketplace/revenue',
{ plugin_id: 'smart_calendar', amount_usd: 4.99, user_id: userId },
{ headers: { Authorization: `Bearer ${process.env.OPENAI_API_KEY}` } }
);
4. Security Checklist (Mitigating the 3 Known Vectors)
| Threat | Mitigation | Where to apply |
|---|---|---|
| Manifest tampering | Sign the manifest with a SHA‑256 hash stored in an environment variable; verify on startup. |
server/app.js before loading routes. |
| OAuth token leakage | Store tokens only in server‑side secret managers; never echo them in logs or responses. | All backend code; use process.env / os.getenv. |
| Prompt injection | 1️⃣ Run every user‑provided string through OpenAI’s moderation endpoint. 2️⃣ Whitelist allowed intents (list, create, delete). 3️⃣ Enforce a max‑length of 256 characters. |
utils/validate.sanitize. |
// utils/validate.js (Node)
const axios = require('axios');
async function sanitize(input) {
if (!input || typeof input !== 'string' || input.length > 256) return null;
const resp = await axios.post(
'https://api.openai.com/v1/moderations',
{ input },
{ headers: { Authorization: `Bearer ${process.env.OPENAI_API_KEY}` } }
);
return resp.data.results[0].flagged ? null : input.trim();
}
module.exports = { sanitize };
5. Real‑World Case Studies
| Plugin | Niche | Launch Strategy | First‑Month Revenue |
|---|---|---|---|
| DocsGPT | Enterprise documentation search | Beta‑only invite → collect 200 enterprise emails → publish paid version | $8,200 |
| FitTrack | Personal health data aggregation | Free tier + Stripe subscription for premium analytics | $3,600 |
| LegalBrief | Contract clause extraction | One‑time store purchase, SEO‑optimized description, Google indexing | $5,100 |
Key takeaways: early beta programs create user‑generated content that boosts store rankings; SEO‑friendly descriptions (include target keywords) drive organic traffic from Google’s plugin index.
6. Launch Checklist
- [ ] Manifest passes OpenAI validation (
openai plugins validate manifest.json). - [ ] HTTPS endpoint reachable from the public internet (test with
curl -v https://your-domain.com/list-events). - [ ] Rate limiting (e.g., 60 req/min per user) via Cloudflare Workers or Express‑Rate‑Limit.
- [ ] Moderation integrated for every user‑supplied string.
- [ ] Billing flow tested end‑to‑end (Stripe webhook → revenue API).
Herramienta mencionada: GitHub Copilot
Top comments (0)