A social proof notification SaaS that shows "John from NYC just signed up" style popups on websites to boost conversions. Revenue target: $1000/month.
- Production: https://proofpulse-six.vercel.app
- GitHub: https://github.com/AndyBodnar/proofpulse
- Hero section with value proposition
- Feature highlights (Easy Setup, Customizable, Real-time API)
- Pricing tiers: Starter ($0), Pro ($19), Business ($49)
- Call-to-action buttons
- Login page:
src/app/(auth)/login/page.tsx - Signup page:
src/app/(auth)/signup/page.tsx - NextAuth config:
src/lib/auth.ts - API routes:
src/app/api/auth/[...nextauth]/route.ts,src/app/api/auth/signup/route.ts
- View all sites
- Add new sites
- Site detail modal with:
- Enable/disable widget
- Copy embed code
- View API key
- Add test notifications
- View recent notifications
- Self-contained JavaScript file
- Shows animated notification popups
- Customizable position, colors, timing
- Cycles through recent notifications
- Usage:
<script src="https://proofpulse-six.vercel.app/widget.js" data-key="YOUR_API_KEY"></script>
| Endpoint | Method | Purpose |
|---|---|---|
/api/sites |
GET | List user's sites |
/api/sites |
POST | Create new site |
/api/sites/[siteId] |
GET | Get site details |
/api/sites/[siteId] |
PATCH | Update site/settings |
/api/sites/[siteId] |
DELETE | Delete site |
/api/sites/[siteId]/notifications |
GET | List notifications |
/api/sites/[siteId]/notifications |
POST | Create notification |
/api/widget?key=API_KEY |
GET | Get widget data (public) |
/api/widget?key=API_KEY |
POST | Track new event (public) |
- Type: PostgreSQL on DevCollective VPS
- Host: 5.78.98.98:5432
- Database: proofpulse
- User: dbadmin
- Connection String:
postgresql://dbadmin:dani2025@5.78.98.98:5432/proofpulse
Schema (prisma/schema.prisma):
User: id, email, password, name, createdAt, updatedAt
Site: id, name, domain, apiKey, userId, createdAt, updatedAt
SiteSettings: id, siteId, position, displayDuration, delayBetween, bgColor, textColor, accentColor, borderRadius, showIcon, enabled
Notification: id, siteId, type, name, location, message, imageUrl, createdAt
Stripe packages already installed (stripe, @stripe/stripe-js). Need to create:
src/lib/stripe.ts- Stripe client configsrc/app/api/stripe/checkout/route.ts- Create checkout sessionssrc/app/api/stripe/webhook/route.ts- Handle subscription eventssrc/app/api/stripe/portal/route.ts- Customer billing portal
Add to User model in prisma/schema.prisma:
stripeCustomerId String? @unique
stripeSubscriptionId String?
stripePriceId String?
stripeCurrentPeriodEnd DateTime?
plan String @default("free") // free, pro, business- Create products in Stripe:
- Pro Plan: $19/month (price_xxx)
- Business Plan: $49/month (price_xxx)
- Get API keys (publishable + secret)
- Set up webhook endpoint pointing to
/api/stripe/webhook - Add env vars to Vercel:
STRIPE_SECRET_KEYSTRIPE_PUBLISHABLE_KEYSTRIPE_WEBHOOK_SECRETSTRIPE_PRO_PRICE_IDSTRIPE_BUSINESS_PRICE_ID
Modify src/app/page.tsx to call Stripe checkout on button click instead of just linking to /signup.
TIP: Use the Stripe MCP plugin (enabled via /plugin) to create products and manage Stripe setup.
- Check user's plan before allowing site creation
- Starter: 1 site max
- Pro: 3 sites max
- Business: Unlimited
- Add notification limits for Starter plan (100/month)
D:\startup\proofpulse\
├── prisma/
│ └── schema.prisma # Database models
├── public/
│ └── widget.js # Embeddable notification widget
├── src/
│ ├── app/
│ │ ├── (auth)/
│ │ │ ├── login/page.tsx
│ │ │ └── signup/page.tsx
│ │ ├── (dashboard)/
│ │ │ └── dashboard/page.tsx
│ │ ├── api/
│ │ │ ├── auth/[...nextauth]/route.ts
│ │ │ ├── auth/signup/route.ts
│ │ │ ├── sites/route.ts
│ │ │ ├── sites/[siteId]/route.ts
│ │ │ ├── sites/[siteId]/notifications/route.ts
│ │ │ └── widget/route.ts
│ │ ├── layout.tsx
│ │ └── page.tsx # Landing page
│ ├── components/
│ │ └── SessionProvider.tsx
│ ├── generated/prisma/ # Prisma client (auto-generated)
│ ├── lib/
│ │ ├── auth.ts # NextAuth config
│ │ └── prisma.ts # Prisma client with PG adapter
│ └── types/
│ └── next-auth.d.ts # Type extensions
├── .env # Local env vars
├── package.json
└── PROJECT_OVERVIEW.md # This file
NEXTAUTH_SECRET- Session encryptionNEXTAUTH_URL- https://proofpulse-six.vercel.appDATABASE_URL- postgresql://dbadmin:dani2025@5.78.98.98:5432/proofpulse
STRIPE_SECRET_KEY- Stripe secret keySTRIPE_PUBLISHABLE_KEY- Stripe publishable keySTRIPE_WEBHOOK_SECRET- Stripe webhook signing secretSTRIPE_PRO_PRICE_ID- Stripe price ID for Pro planSTRIPE_BUSINESS_PRICE_ID- Stripe price ID for Business plan
# Development
cd D:\startup\proofpulse
npm run dev # Start dev server at localhost:3000
# Database
npx prisma studio # Open database GUI
npx prisma db push # Push schema changes
npx prisma generate # Regenerate client after schema changes
# Deployment
vercel # Deploy preview
vercel --prod # Deploy to production
vercel env ls # List env vars
vercel logs # View deployment logs
# Git
git add . && git commit -m "message" && git push| Plan | Price | Customers Needed for $1000/mo |
|---|---|---|
| Pro | $19/mo | 53 customers |
| Business | $49/mo | 21 customers |
| Mix | ~$30 avg | 34 customers |
-
Set up database- DONE! Using PostgreSQL on VPS - Use Stripe MCP plugin to create products/prices
- Create Stripe API routes (checkout, webhook, portal)
- Update Prisma schema with subscription fields
- Update pricing page with Stripe checkout buttons
- Add plan enforcement logic
- Test full flow: signup -> subscribe -> create site -> embed widget
- Deploy final version
Tell the next Claude:
"Read D:\startup\proofpulse\PROJECT_OVERVIEW.md - I need to finish Stripe integration for ProofPulse. Use the Stripe MCP plugin to set up payments."
Last updated: January 10, 2026