Publishing & approval
The marketplace uses the agents.status column as the publish gate. Four values, three of which are observable to end-users.
| Status | Public catalog | Detail page | Pricing | OAuth | Notes |
|---|---|---|---|---|---|
draft | Hidden | 404 to non-admins | N/A | Works (lets you test) | Admins only |
coming_soon | Shown with "Coming soon" badge | Loads (locked CTA) | Hidden, replaced with waitlist | Works | Captures emails into agent_waitlist |
active | Shown | Loads | Visible, checkout enabled | Works | Production state |
inactive | Hidden | 404 | N/A | Disabled at OAuth client level | Soft delete |
Status transitions
There's no separate "review queue" or two-step approval. The transition is a single POST /agents/:id mutation with the new status. Only platform_admin can do it.
Checklist before flipping to coming_soon
- Agent record created (Track B Step 1) — ✓
- Pricing tiers seeded (Track B Step 5) — ✓
- Capabilities + steps + screenshots all present — ✓
iconUrlis a real CDN URL (not localhost) — ✓productDomainandredirectUrispoint to your production origin — ✓- Marketing copy has been reviewed — ✓
comingSoonagent card renders correctly in the marketplace UI — ✓
Then:
POST /agents/<agentId>
{
"status": "coming_soon"
}
Checklist before flipping to active
In addition to the above:
- Track A is deployed to production (not staging).
- Stripe Products + Prices are created (auto on tier create — verify
stripeProductIdpopulated). - Stripe webhooks are pointing to the prod marketplace backend.
- End-to-end checklist all green.
- At least one internal user has completed a full checkout on the paid tier.
- Quota arithmetic has been exercised against the real backend.
- Audit logs are flowing to PostHog.
Then:
POST /agents/<agentId>
{
"status": "active"
}
The agent is now publicly purchasable.
Going inactive
If you need to take an agent down (deprecation, compliance issue, abuse):
DELETE /agents/<agentId>
This is soft-delete — sets status: 'inactive' and disables the OAuth client. Existing subscriptions stay in the DB. Stripe subscriptions are not auto-cancelled — do that separately if needed.
To re-enable, POST /agents/:id with status: 'active'. The OAuth client is reactivated.
Communicating the launch
The marketplace doesn't auto-broadcast a launch. Recommended steps:
- Add a changelog entry for v1.0.0 via
POST /agents/:id/changelog. - Add a homepage feature placement: set
featured: trueandisNew: trueon the agent. - Email anyone on the waitlist (export from
agent_waitlist). - Post to the marketplace team's Slack via the existing channels.
What success looks like 7 days post-launch
| Signal | Where to look |
|---|---|
| Installs | GET /agents/:id returns installs > 0 |
| Subscriptions | POSTHOG → query event = 'subscription_created' |
| Reviews | GET /agents/:id/reviews |
| Errors | audit_logs rows where result = 'failure' |
| Stripe failures | stripe_events.errorMessage IS NOT NULL |
If any of those look off, jump to Troubleshooting.