This commit is contained in:
Joey Yakimowich-Payne 2026-01-22 15:10:45 -07:00
commit f622932d09
No known key found for this signature in database
GPG key ID: 6BFE655FA5ABD1E1

119
docs/STRIPE_SETUP.md Normal file
View file

@ -0,0 +1,119 @@
# Stripe Setup Guide (Development)
This guide provides step-by-step instructions for setting up a Stripe test account and configuring payments for Kaboot in your local development environment.
## Overview
Kaboot uses Stripe to manage subscriptions for "AI Pro" access. Users get 250 AI quiz generations per month with a paid subscription, while free users are limited to 5.
## Prerequisites
1. A [Stripe Account](https://dashboard.stripe.com/register).
2. [Stripe CLI](https://stripe.com/docs/stripe-cli) installed on your machine.
3. Kaboot local development environment running (see [README.md](../README.md)).
---
## 1. Stripe Dashboard Configuration
### Step 1: Enable Test Mode
Log in to your Stripe Dashboard and ensure the **Test Mode** toggle (usually in the top right) is turned **ON**.
### Step 2: Create a Product
1. Navigate to **Products** > **Add Product**.
2. **Name**: `Kaboot AI Pro`
3. **Description**: `250 AI quiz generations per month`
4. **Pricing**:
* **Price 1**: $5.00 USD, Recurring, Monthly.
* **Price 2**: $50.00 USD, Recurring, Yearly.
5. Click **Save Product**.
### Step 3: Get Price IDs
After saving, copy the **API IDs** for both prices. They look like `price_1P...`. You will need these for your environment variables.
---
## 2. Environment Configuration
Add the following variables to your `.env` file in the project root:
```env
# Stripe API Keys (Test Mode)
# Found at: https://dashboard.stripe.com/test/apikeys
STRIPE_SECRET_KEY=sk_test_51P...
# Stripe Price IDs (from Step 3 above)
STRIPE_PRICE_ID_MONTHLY=price_...
STRIPE_PRICE_ID_YEARLY=price_...
# Stripe Webhook Secret (Leave empty initially, see Section 3)
STRIPE_WEBHOOK_SECRET=whsec_...
```
> **Note**: In development, `STRIPE_SECRET_KEY` should always start with `sk_test_`.
---
## 3. Webhook Setup (Local Development)
Stripe needs to send events (like successful payments) to your local server. Since Stripe cannot access `localhost` directly, you must use the Stripe CLI to forward events.
### Step 1: Login to Stripe CLI
```bash
stripe login
```
### Step 2: Start Forwarding
Run the following command in a new terminal window:
```bash
stripe listen --forward-to localhost:3001/api/payments/webhook
```
### Step 3: Get Webhook Secret
The command above will output a **webhook signing secret** (e.g., `whsec_abc123...`).
1. Copy this secret.
2. Paste it into your `.env` file as `STRIPE_WEBHOOK_SECRET`.
3. **Restart your backend server** to apply the changes.
---
## 4. Testing the Flow
### Test Credit Card
Use Stripe's [test card numbers](https://stripe.com/docs/testing#cards). The most common is:
* **Card Number**: `4242 4242 4242 4242`
* **Expiry**: Any future date
* **CVC**: Any 3 digits
* **Zip**: Any 5 digits
### Webhook Events to Monitor
When testing, watch your `stripe listen` terminal. You should see:
- `checkout.session.completed`: When a user finishes the payment.
- `customer.subscription.updated`: When status changes.
- `invoice.paid`: When the monthly/yearly bill is settled (resets generation counts).
---
## 5. Troubleshooting
### Webhook Signature Mismatch
**Error**: `Webhook signature verification failed`
- **Solution**: Ensure `STRIPE_WEBHOOK_SECRET` in `.env` matches the secret shown in your `stripe listen` output. Each time you run `stripe listen`, a new secret might be generated if not configured as a permanent endpoint.
### Missing Keys
**Error**: `Stripe API Key not found`
- **Solution**: Verify `STRIPE_SECRET_KEY` is set in the `.env` file that the **backend** (server) is reading.
### Checkout Session Fails
**Error**: `No such price: price_...`
- **Solution**: Ensure your `STRIPE_PRICE_ID_MONTHLY` and `STRIPE_PRICE_ID_YEARLY` variables match the Price IDs in your Stripe **Test Mode** dashboard.
---
## Technical Details
- **Webhook Endpoint**: `POST /api/payments/webhook`
- **Checkout Initiation**: `POST /api/payments/checkout`
- **Billing Portal**: `POST /api/payments/portal` (Allows users to manage/cancel subscriptions)
- **Database Fields**: User subscription status is stored in the `users` table (`subscription_status`, `generation_count`, etc.).