Integrating Stripe Payments

Complete workflow for integrating Stripe payments (subscriptions or one-time) with Convex + Next.js. Includes hosted checkout, webhooks, UI components, and testing.

Sby Skills Guide Bot
DevelopmentIntermediate0 views0 installs3/4/2026
Claude CodeCursorWindsurf
stripepayment-processingconvexnext.jswebhooks

name: Integrating Stripe Payments description: Complete workflow for integrating Stripe payments (subscriptions or one-time) with Convex + Next.js. Includes hosted checkout, webhooks, UI components, and testing. Use when adding payment functionality to a Convex + Next.js app. version: "1.0.0" dependencies: ["stripe", "convex", "next.js"] allowed-tools: ["stripe-mcp", "convex-mcp", "file_write", "bash"]

Integrating Stripe Payments

Core Workflow

When user requests Stripe payment integration for Convex + Next.js:

1. Requirements Gathering

Ask these questions first:

  • Payment type: Subscription or one-time payment?
  • Backend: Confirm this is Convex (required for this skill)
  • Checkout preference: Hosted Stripe Checkout (recommended) or embedded?
  • Pricing: Amount, currency, billing interval for subscriptions?
  • Product: What does user get after payment?

2. API Keys & Environment Setup

CRITICAL: Gather these FIRST before proceeding - MCP tools require credentials.

  1. Get Stripe API keys from user:

    • Ask for Stripe Secret Key (starts with sk_test_ or sk_live_)
    • Add to .env.local: STRIPE_SECRET_KEY=sk_test_...
  2. Install dependencies: npm install stripe

  3. Set initial environment variables:

    • STRIPE_SECRET_KEY (from step 1)
    • NEXT_PUBLIC_SITE_URL=http://localhost:3000 (default local development)
  4. Use Stripe MCP tool to create product/price and get price ID

  5. Use Convex MCP tool to set remaining environment variables

  6. Manual fallback: Follow resources/environment-setup.md

Complete required env vars:

  • STRIPE_SECRET_KEY ✓ (set in step 1)
  • STRIPE_PRICE_ID (from Stripe MCP tool)
  • STRIPE_WEBHOOK_SECRET (set during webhook configuration)
  • NEXT_PUBLIC_SITE_URL ✓ (set in step 1)

3. Database Schema

Update convex/schema.ts with Stripe fields. See resources/database-schema.ts for complete schema.

4. Backend Implementation

Copy and customize these files:

  • convex/stripe.ts ← Use resources/convex-stripe-actions.ts
  • convex/stripeDb.ts ← Use resources/convex-stripe-db.ts
  • convex/http.ts ← Use resources/convex-webhook-handler.ts

Key customizations:

  • Update membership tier names ("pro" vs "premium")
  • Adjust auth field names (clerkId vs your auth system)
  • Set correct API version: 2025-08-27.basil
  • Enable coupon codes by setting allow_promotion_codes: true in checkout session creation

5. Frontend Components

Create UI components from resources/ui-components.tsx:

  • UpgradeButton - Shows different states based on membership
  • ManageBillingButton - Opens customer portal

UI Design Guidelines:

  • Match existing app design system
  • Use gradients and proper state management
  • Show loading states and error handling
  • Keep prices in sync with Stripe Dashboard

6. Webhook Configuration

  1. Get Convex deployment URL (use .convex.site domain)
  2. Create webhook in Stripe Dashboard: https://your-deployment.convex.site/stripe/webhook
  3. Select events: checkout.session.completed, customer.subscription.*, invoice.*
  4. Copy webhook secret to environment variables

7. Testing

Follow resources/testing-checklist.md:

  • Test successful payment flow
  • Test failed payments
  • Test customer portal
  • Verify webhook delivery
  • Use Stripe CLI for local testing

8. Production Deployment

  • Switch to live Stripe keys
  • Create production webhook endpoint
  • Configure Customer Portal and Smart Retries
  • Test with real payment (then refund)

Best Practices

Always:

  • Use hosted checkout for simplicity and security
  • Use constructEventAsync in webhooks (not constructEvent)
  • Include user metadata in checkout sessions
  • Handle missing current_period_end with fallbacks
  • Keep UI prices synchronized with Stripe prices
  • Use consistent Stripe API version across all files
  • Set allow_promotion_codes: true to enable coupon code input during checkout

Never:

  • Use .convex.cloud for webhooks (use .convex.site)
  • Skip webhook idempotency in production
  • Forget to configure Customer Portal
  • Deploy without testing webhook delivery

Common Issues

Webhook not working: Check domain (.convex.site) and webhook secret Membership not updating: Verify webhook events and metadata API errors: Ensure consistent API version usage

Documentation References

Use Stripe MCP tool for latest documentation when:

  • Checking API changes or new features
  • Troubleshooting integration issues
  • Verifying best practices

See resources/ folder for complete code examples and detailed setup instructions.

Related skills