# Stripe Subscription System Setup Guide This guide will help you set up Stripe for the AutoForm subscription system. ## Overview The AutoForm subscription system includes three tiers: - **Free Tier**: $0/month, 25 credits - **Pro Tier**: $20/month, 500 credits - **Ultra Tier**: Custom pricing, 1000 credits ## Prerequisites - A Stripe account (create one at https://stripe.com) - Stripe CLI for webhook testing (optional but recommended) ## Step 1: Create Products and Prices in Stripe ### 1.1 Log in to Stripe Dashboard Go to https://dashboard.stripe.com and log in to your account. ### 1.2 Create Products Navigate to **Products** → **Add Product** and create three products: #### Free Tier - **Name**: AutoForm Free - **Description**: Free tier with 25 credits per month - **Pricing**: - Price: $0.00 - Billing period: Monthly - Note: This is for tracking only, users won't be charged #### Pro Tier - **Name**: AutoForm Pro - **Description**: Professional tier with 500 credits per month - **Pricing**: - Price: $20.00 - Billing period: Monthly (recurring) #### Ultra Tier - **Name**: AutoForm Ultra - **Description**: Ultra tier with 1000 credits per month - **Pricing**: - Price: $29.99 (or your preferred amount) - Billing period: Monthly (recurring) ### 1.3 Get Price IDs After creating each product, Stripe will assign a **Price ID** to each. They look like: - `price_1234567890abcdef` (this is an example) Copy these Price IDs - you'll need them for the environment variables. ### 1.4 Get Product IDs (Optional) You can also copy the **Product IDs** if you want to store them. They look like: - `prod_1234567890abcdef` ## Step 2: Get API Keys ### 2.1 Get Secret Key 1. Navigate to **Developers** → **API Keys** 2. Copy your **Secret key** (starts with `sk_test_` for test mode or `sk_live_` for live mode) 3. Keep this key secure - never commit it to version control! ### 2.2 Get Webhook Secret 1. Navigate to **Developers** → **Webhooks** 2. Click **Add endpoint** 3. Set the endpoint URL to: `https://your-domain.com/api/payment/webhook` - For local testing, you can use the Stripe CLI (see Step 3) 4. Select the following events to listen for: - `checkout.session.completed` - `customer.subscription.updated` - `customer.subscription.deleted` - `invoice.payment_succeeded` - `invoice.payment_failed` 5. After creating the endpoint, click to view it and copy the **Signing secret** (starts with `whsec_`) ## Step 3: Configure Environment Variables Create or update your `backend/.env` file with the following variables: ```env # Stripe Configuration STRIPE_SECRET_KEY=sk_test_your_secret_key_here STRIPE_WEBHOOK_SECRET=whsec_your_webhook_secret_here # Stripe Price IDs STRIPE_FREE_PRICE_ID=price_free_tier_id STRIPE_PRO_PRICE_ID=price_pro_tier_id STRIPE_ULTRA_PRICE_ID=price_ultra_tier_id # Stripe Product IDs (optional) STRIPE_FREE_PRODUCT_ID=prod_free_tier_id STRIPE_PRO_PRODUCT_ID=prod_pro_tier_id STRIPE_ULTRA_PRODUCT_ID=prod_ultra_tier_id # Frontend URL for redirects FRONTEND_URL=http://localhost:5173 ``` ### Example format (replace with your actual values from Stripe Dashboard): ```env STRIPE_SECRET_KEY=sk_test_YOUR_ACTUAL_SECRET_KEY_FROM_STRIPE_DASHBOARD STRIPE_WEBHOOK_SECRET=whsec_YOUR_ACTUAL_WEBHOOK_SECRET_FROM_STRIPE_DASHBOARD STRIPE_FREE_PRICE_ID=price_YOUR_FREE_PRICE_ID STRIPE_PRO_PRICE_ID=price_YOUR_PRO_PRICE_ID STRIPE_ULTRA_PRICE_ID=price_YOUR_ULTRA_PRICE_ID FRONTEND_URL=http://localhost:5173 ``` ## Step 4: Initialize Database and Plans ### 4.1 Automatic Initialization (Recommended) The application will automatically create database tables and initialize plans on startup if `AUTO_MIGRATE=1` in your `.env` file. Just start your backend server: ```bash cd backend uvicorn app.main:app --reload ``` ### 4.2 Manual Initialization You can also manually initialize plans using the provided script: ```bash cd backend python -m app.scripts.init_plans --create-tables ``` Options: - `--create-tables`: Create database tables if they don't exist - `--force`: Force update of existing plans with new values ## Step 5: Test with Stripe CLI (Local Development) For local testing, use the Stripe CLI to forward webhook events: ### 5.1 Install Stripe CLI Follow instructions at: https://stripe.com/docs/stripe-cli ### 5.2 Login to Stripe CLI ```bash stripe login ``` ### 5.3 Forward Webhooks to Local Server ```bash stripe listen --forward-to localhost:3001/api/payment/webhook ``` This will give you a webhook signing secret (starts with `whsec_`). Use this in your `.env` file for local testing. ### 5.4 Test a Payment ```bash stripe trigger checkout.session.completed ``` ## Step 6: Verify Setup ### 6.1 Check Plans Endpoint Visit: `http://localhost:3001/api/plans` You should see all three plans with their configurations. ### 6.2 Check Credit Balance (Authenticated) Create a test user by logging in via Google OAuth, then check: `GET http://localhost:3001/api/credits/balance` Headers: ``` Authorization: Bearer YOUR_JWT_TOKEN ``` ### 6.3 Test Checkout Flow 1. Log in to your application 2. Navigate to the subscription/pricing page 3. Click on a plan (Pro or Ultra) 4. Complete the checkout using Stripe's test card: `4242 4242 4242 4242` - Use any future expiration date - Use any 3-digit CVC - Use any ZIP code ## Step 7: Go Live When ready to go live: 1. Switch to **Live mode** in Stripe Dashboard 2. Create new products and prices in live mode 3. Get new live API keys (`sk_live_...`) 4. Create a new webhook endpoint for your production URL 5. Update your production `.env` with live keys 6. Test thoroughly before announcing! ## Troubleshooting ### Webhook Events Not Received 1. Check that your webhook endpoint is accessible from the internet 2. Verify the webhook signing secret in your `.env` file 3. Check Stripe Dashboard → Webhooks → Your endpoint for delivery logs 4. For local testing, ensure Stripe CLI is running ### Credits Not Resetting - Check webhook logs for `invoice.payment_succeeded` events - Verify the event is being handled correctly in logs - Check credit transaction history via `/api/credits/history` ### Plans Not Showing - Run the initialization script: `python -m app.scripts.init_plans` - Check database for subscription_plans table - Verify AUTO_MIGRATE is enabled ## Environment Variables Reference | Variable | Required | Description | Example | |----------|----------|-------------|---------| | `STRIPE_SECRET_KEY` | Yes | Stripe API secret key | `sk_test_...` or `sk_live_...` | | `STRIPE_WEBHOOK_SECRET` | Yes | Webhook signing secret | `whsec_...` | | `STRIPE_FREE_PRICE_ID` | Yes | Price ID for Free tier | `price_...` | | `STRIPE_PRO_PRICE_ID` | Yes | Price ID for Pro tier | `price_...` | | `STRIPE_ULTRA_PRICE_ID` | Yes | Price ID for Ultra tier | `price_...` | | `STRIPE_FREE_PRODUCT_ID` | No | Product ID for Free tier | `prod_...` | | `STRIPE_PRO_PRODUCT_ID` | No | Product ID for Pro tier | `prod_...` | | `STRIPE_ULTRA_PRODUCT_ID` | No | Product ID for Ultra tier | `prod_...` | | `FRONTEND_URL` | Yes | Frontend URL for redirects | `http://localhost:5173` | | `AUTO_MIGRATE` | No | Auto-create DB tables on startup | `1` (default) | ## Support For issues or questions: 1. Check Stripe Dashboard logs 2. Check application logs 3. Review webhook event details in Stripe Dashboard 4. Consult Stripe documentation: https://stripe.com/docs ## Security Notes ⚠️ **Important Security Reminders:** - Never commit API keys to version control - Use environment variables for all sensitive data - Always verify webhook signatures - Use HTTPS in production - Rotate keys if compromised - Use different keys for test/live environments - Implement rate limiting on payment endpoints - Monitor webhook delivery for anomalies