AdSlotKit is a micro SaaS for newsletter operators who want to sell direct sponsorship slots without stitching together a Google Doc, inbox threads, and a spreadsheet.
- Public sponsorship media kit at
/m/[slug] - Private dashboard at
/dashboard - Supabase email/password authentication
- Supabase Postgres database with RLS policies
- Sponsorship package builder
- Public sponsor inquiry form
- Sponsor lead status tracking
- Stripe Checkout subscription for Pro
- Stripe webhook to unlock Pro access
- Stripe Billing Portal for subscription management
- Free: one media kit, 2 active sponsorship packages, lead capture
- Pro: $19/month, unlimited active sponsorship packages and full lead workflow
The app expects these values:
NEXT_PUBLIC_APP_URL=
NEXT_PUBLIC_SUPABASE_URL=
NEXT_PUBLIC_SUPABASE_ANON_KEY=
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY=
SUPABASE_SERVICE_ROLE_KEY=
STRIPE_SECRET_KEY=
STRIPE_PUBLISHABLE_KEY=
STRIPE_WEBHOOK_SECRET=
OPENAI_API_KEY=
COMPOSIO_API_KEY=
OPENAI_AGENT_MODEL=
COMPOSIO_ALLOWED_TOOLKITS=
COMPOSIO_ALLOWED_TOOLS=NEXT_PUBLIC_APP_URL must be set to the production Vercel URL after deploy so Stripe redirects and Supabase email links resolve correctly.
OPENAI_AGENT_MODEL is optional and defaults to gpt-4.1.
COMPOSIO_ALLOWED_TOOLKITS is optional and defaults to apollo,linkedin,gmail,hubspot; use a comma-separated list to allow different toolkits.
COMPOSIO_ALLOWED_TOOLS is optional; use a comma-separated list to limit the exact Composio tools exposed to the agent.
Run the SQL in supabase/schema.sql in the Supabase SQL editor, or via a trusted SQL client connected to the Supabase Postgres database.
The schema creates:
profilesmedia_kitssponsorship_packagessponsor_leads- indexes, triggers, and row-level security policies
The app uses Stripe Checkout with inline recurring price_data, so it does not require a pre-created Stripe Price ID.
Configure a webhook endpoint:
POST https://YOUR_DOMAIN/api/stripe/webhook
Subscribe to these events:
checkout.session.completedcustomer.subscription.updatedcustomer.subscription.deleted
Copy the webhook signing secret into STRIPE_WEBHOOK_SECRET.
npm install
npm run devOpen http://localhost:3000.
Authenticated users can run the OpenAI Agents SDK through a Composio hosted MCP session:
POST /api/agents/composio
Example body:
{
"prompt": "Find 5 sponsor prospects, verify LinkedIn context, create Gmail drafts, and log each lead in HubSpot.",
"toolkits": ["apollo", "linkedin", "gmail", "hubspot"]
}The dashboard includes a sponsor prospecting agent that uses the current media kit and packages as context. The agent is instructed to create Gmail drafts only, not send emails or activate outreach campaigns without an explicit request.
npm run typecheck
npm run lint
npm run build
npm run test:security- Visitor lands on the homepage.
- Visitor creates a free account.
- User creates a media kit with newsletter metrics and proof points.
- User adds up to 2 active sponsorship packages on Free.
- User shares
/m/[slug]with sponsor prospects. - Sponsor submits an inquiry.
- User tracks the lead in the dashboard.
- User upgrades to Pro through Stripe to publish more packages.
- Stripe webhook updates
profiles.plantopro.
See docs/acquisition/first-customers.md for target profiles, keywords, Reddit communities, ethical outreach scripts, and conversion workflow.
See docs/research/idea-selection.md for the 10-idea evaluation and why AdSlotKit was selected.
Last updated: 2026-06-04