From aedaf4b4b509f5fc635812bfdfa8227bab5e1522 Mon Sep 17 00:00:00 2001 From: Krystie Date: Fri, 17 Apr 2026 21:29:01 -0700 Subject: [PATCH] Document external DashCaddy billing architecture --- .env.example | 21 ++----- FILELIST.md | 6 +- README.md | 126 ++++++++++++++++++++--------------------- STRIPE_SETUP.md | 148 +++++++++++++++++++++--------------------------- 4 files changed, 137 insertions(+), 164 deletions(-) diff --git a/.env.example b/.env.example index 42ae3a4..99f8989 100644 --- a/.env.example +++ b/.env.example @@ -1,16 +1,7 @@ -# Stripe Configuration -# Get your keys from https://dashboard.stripe.com/apikeys -STRIPE_SECRET_KEY=sk_test_your_secret_key_here -NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_test_your_publishable_key_here - -# Stripe Webhook Secret -# Get this from https://dashboard.stripe.com/webhooks after creating an endpoint -STRIPE_WEBHOOK_SECRET=whsec_your_webhook_secret_here - -# Stripe Price IDs -# Create these in your Stripe Dashboard under Products > Pricing -STRIPE_PRICE_MONTHLY=price_your_monthly_price_id -STRIPE_PRICE_YEARLY=price_your_yearly_price_id - -# App URL +# DashCaddy website configuration NEXT_PUBLIC_APP_URL=https://dashcaddy.net +NEXT_PUBLIC_LICENSE_SERVER_URL=https://licenses.dashcaddy.net +NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_live_your_publishable_key_here + +# The website no longer owns Stripe secret or webhook handling. +# Stripe Checkout sessions and webhook processing live in dashcaddy-license-server. diff --git a/FILELIST.md b/FILELIST.md index c85f565..057cd57 100644 --- a/FILELIST.md +++ b/FILELIST.md @@ -12,7 +12,7 @@ | `CLAUDE.md` | Project instructions for Claude | | `FILELIST.md` | This file | | `README.md` | Project overview and setup guide | -| `STRIPE_SETUP.md` | Step-by-step Stripe configuration guide | +| `STRIPE_SETUP.md` | Billing architecture and license-server setup guide | | `eslint.config.mjs` | ESLint configuration | | `next-env.d.ts` | Next.js TypeScript declarations | | `next.config.ts` | Next.js configuration | @@ -53,8 +53,8 @@ | File | Endpoint | Purpose | |------|----------|---------| -| `src/app/api/checkout/route.ts` | `POST /api/checkout` | Creates Stripe Checkout session with 14-day trial | -| `src/app/api/webhooks/stripe/route.ts` | `POST /api/webhooks/stripe` | Handles Stripe subscription lifecycle events | +| `src/app/api/checkout/route.ts` | `POST /api/checkout` | Disabled compatibility stub; production checkout lives in dashcaddy-license-server | +| `src/app/api/webhooks/stripe/route.ts` | `POST /api/webhooks/stripe` | Disabled compatibility stub; production webhook lives in dashcaddy-license-server | ## Components (`src/components/`) diff --git a/README.md b/README.md index 45752a2..384122e 100644 --- a/README.md +++ b/README.md @@ -1,63 +1,63 @@ -# DashCaddy.net - Marketing Website - -Marketing and sales website for [DashCaddy](https://git.dashcaddy.net/sami7777/dashcaddy), the self-hosted Docker dashboard with automatic SSL, DNS, and reverse proxy configuration. - -## Tech Stack - -- **Next.js 16** with App Router and TypeScript -- **Tailwind CSS** for styling -- **Stripe** for subscription payments ($20/mo or $99/yr) - -## Getting Started - -```bash -# Install dependencies -npm install - -# Copy environment file and configure -cp .env.example .env.local - -# Run development server -npm run dev -``` - -Open [http://localhost:3000](http://localhost:3000) to see the site. - -## Pages - -| Route | Description | -|-------|-------------| -| `/` | Landing page with hero, features, app showcase | -| `/features` | Detailed feature breakdown | -| `/pricing` | Pricing plans with Stripe Checkout | -| `/docs` | Getting started guide and documentation | -| `/about` | About page and company info | -| `/success` | Post-checkout success page | - -## Stripe Integration - -See [STRIPE_SETUP.md](./STRIPE_SETUP.md) for detailed setup instructions. - -**API Routes:** -- `POST /api/checkout` - Creates Stripe Checkout session -- `POST /api/webhooks/stripe` - Handles Stripe webhook events - -## Logo Setup - -Place your `samiahmed7777-logo.png` file in `public/images/` for the footer copyright branding. - -## Deployment - -```bash -# Build for production -npm run build - -# Start production server -npm start -``` - -The site can be deployed to Vercel, your own server (with Node.js), or any platform that supports Next.js. - -## License - -Proprietary - DashCaddy +# DashCaddy.net - Marketing Website + +Marketing and sales website for [DashCaddy](https://git.dashcaddy.net/sami7777/dashcaddy), the self-hosted Docker dashboard with automatic SSL, DNS, and reverse proxy configuration. + +## Tech Stack + +- **Next.js 16** with App Router and TypeScript +- **Tailwind CSS** for styling +- **Stripe** for subscription payments ($20/mo or $99/yr) + +## Getting Started + +```bash +# Install dependencies +npm install + +# Copy environment file and configure +cp .env.example .env.local + +# Run development server +npm run dev +``` + +Open [http://localhost:3000](http://localhost:3000) to see the site. + +## Pages + +| Route | Description | +|-------|-------------| +| `/` | Landing page with hero, features, app showcase | +| `/features` | Detailed feature breakdown | +| `/pricing` | Pricing plans with Stripe Checkout | +| `/docs` | Getting started guide and documentation | +| `/about` | About page and company info | +| `/success` | Post-checkout success page | + +## Stripe Integration + +See [STRIPE_SETUP.md](./STRIPE_SETUP.md) for the current billing and license-server setup. + +**API Routes:** +- Website pricing uses the external DashCaddy license server for checkout initiation. +- Website-local Stripe routes are disabled compatibility stubs and are not the production billing path. + +## Logo Setup + +Place your `samiahmed7777-logo.png` file in `public/images/` for the footer copyright branding. + +## Deployment + +```bash +# Build for production +npm run build + +# Start production server +npm start +``` + +The site can be deployed to Vercel, your own server (with Node.js), or any platform that supports Next.js. + +## License + +Proprietary - DashCaddy diff --git a/STRIPE_SETUP.md b/STRIPE_SETUP.md index dca2f8f..41a7c93 100644 --- a/STRIPE_SETUP.md +++ b/STRIPE_SETUP.md @@ -1,83 +1,65 @@ -# Stripe Setup Guide for DashCaddy.net - -## 1. Create a Stripe Account - -Go to [stripe.com](https://stripe.com) and create an account (or log in). - -## 2. Create Your Product and Prices - -In the Stripe Dashboard: - -1. Go to **Products** > **Add Product** -2. Name: `DashCaddy Premium` -3. Description: `Premium license for DashCaddy - Self-hosting dashboard` -4. Create two prices: - - **Monthly**: $20.00 USD / month (recurring) - - **Yearly**: $99.00 USD / year (recurring) -5. Note down both **Price IDs** (they look like `price_1234...`) - -## 3. Get Your API Keys - -1. Go to **Developers** > **API Keys** -2. Copy your **Publishable key** (`pk_test_...` or `pk_live_...`) -3. Copy your **Secret key** (`sk_test_...` or `sk_live_...`) - -## 4. Set Up Webhooks - -1. Go to **Developers** > **Webhooks** -2. Click **Add endpoint** -3. URL: `https://dashcaddy.net/api/webhooks/stripe` -4. Select these events: - - `checkout.session.completed` - - `customer.subscription.updated` - - `customer.subscription.deleted` - - `invoice.payment_failed` -5. Copy the **Webhook signing secret** (`whsec_...`) - -## 5. Configure Environment Variables - -Copy `.env.example` to `.env.local` and fill in your values: - -```bash -cp .env.example .env.local -``` - -Edit `.env.local`: - -```env -STRIPE_SECRET_KEY=sk_live_your_actual_secret_key -NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_live_your_actual_publishable_key -STRIPE_WEBHOOK_SECRET=whsec_your_actual_webhook_secret -STRIPE_PRICE_MONTHLY=price_your_monthly_price_id -STRIPE_PRICE_YEARLY=price_your_yearly_price_id -NEXT_PUBLIC_APP_URL=https://dashcaddy.net -``` - -## 6. Test with Stripe CLI (Optional) - -For local development, use Stripe CLI to forward webhooks: - -```bash -stripe listen --forward-to localhost:3000/api/webhooks/stripe -``` - -Use test card `4242 4242 4242 4242` with any future date and any CVC. - -## 7. License Key Delivery - -The webhook handler at `src/app/api/webhooks/stripe/route.ts` has TODO comments -where you need to implement: - -1. **Generate license key** using the same format as DashCaddy's license-keygen - (DC-XXXXX-XXXXX-XXXXX-XXXXX-XXXXX) -2. **Store it** in a database (Stripe metadata can also hold it) -3. **Email it** to the customer (use Stripe's receipt email or a service like - SendGrid/Resend) -4. **Link it** to the Stripe subscription ID so you can manage renewals/cancellations - -## Pricing Strategy Notes - -- **Monthly ($20/mo)**: Positioned as the flexibility option -- **Yearly ($99/yr)**: ~$8.25/mo — 58% savings, this will be the primary seller -- **14-day free trial**: Enabled on both plans via `trial_period_days: 14` -- **Promotion codes**: Enabled via `allow_promotion_codes: true` +# DashCaddy Billing Setup + +DashCaddy website no longer processes Stripe webhooks locally. + +Current architecture: +- `dashcaddy.net` handles pricing UI and starts checkout by calling the external license server +- `dashcaddy-license-server` owns Stripe secret usage, webhook handling, subscription state, and license generation +- DashCaddy app instances validate/deactivate against the external license server + +## Required website environment + +```env +NEXT_PUBLIC_APP_URL=https://dashcaddy.net +NEXT_PUBLIC_LICENSE_SERVER_URL=https://licenses.dashcaddy.net +NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_live_your_publishable_key_here +``` + +## Required license server environment + +```env +PORT=3010 +APP_BASE_URL=https://licenses.dashcaddy.net +DASHCADDY_WEBSITE_URL=https://dashcaddy.net +STRIPE_SECRET_KEY=sk_live_... +STRIPE_PUBLISHABLE_KEY=pk_live_... +STRIPE_WEBHOOK_SECRET=whsec_... +``` + +## Stripe product model + +One Premium tier, four subscription cadences: +- 1 month — $25 +- 3 months — $50 +- 6 months — $65 +- 12 months — $99 + +No free trial. +7-day grace period. +Cancel at period end. +One active machine at a time. +Premium features only: `sso`, `recipes`, `swarm`. + +## Stripe webhook target + +Configure Stripe to send events to the license server, not the website. + +Recommended webhook endpoint: + +```text +https://licenses.dashcaddy.net/api/stripe/webhook +``` + +Recommended events: +- `checkout.session.completed` +- `customer.subscription.created` +- `customer.subscription.updated` +- `customer.subscription.deleted` +- `invoice.payment_failed` + +## Website behavior + +The website pricing page should start checkout via: +- `POST /api/checkout/session` on the external license server + +The website-local routes under `src/app/api/checkout` and `src/app/api/webhooks/stripe` are intentionally disabled compatibility stubs and should not be used for production billing.