2.7 KiB
Tiered Pricing Setup
Tiered pricing assigns different Stripe prices based on customer count.
Stripe MCP (Cursor)
Stripe MCP is configured in .cursor/mcp.json. It loads STRIPE_SECRET_KEY from .env so you can use Stripe tools in Cursor chat (create customers, prices, search docs, etc.).
Enable MCP: Stripe Dashboard → Settings → MCP — enable for test and/or live mode.
Restart Cursor after adding/updating .env so the MCP picks up keys.
Automated Setup Script
Create products and prices from your .env keys:
./scripts/stripe-setup.sh # uses .env, prints IDs
./scripts/stripe-setup.sh --apply # creates prices and updates .env
./scripts/stripe-setup.sh .env.prod --apply # prod: use prod keys, update .env.prod
Then redeploy: export $(grep -v '^#' .env | xargs) && docker stack deploy -c stack.yml atlas
- First 10 (FREE_TIER_LIMIT): $0 for 3 months, auto-cancels at end
- Next 40 (11–50, YEAR_TIER_LIMIT): $20/year, then $100/month after first year
- 51+: $200/month
Stripe Prices to Create
In Stripe Dashboard → Products → create one product with four prices:
- $0/month – recurring monthly, amount 0
- Used for first 10 signups; subscription is scheduled to cancel in 3 months
- $20/year – recurring yearly, amount 2000
- $100/month – recurring monthly, amount 10000
- $200/month – recurring monthly, amount 20000
Copy each price ID (starts with price_).
Messaging (env vars)
Customize the subscribe page copy without rebuilding:
LANDING_TAGLINE="Your own workspace, ready in minutes."
LANDING_FEATURES="Dedicated environment|Secure login|Set up automatically|Cancel anytime"
Features use | as separator.
Environment Variables
STRIPE_PRICE_ID_FREE=price_xxx # $0/3mo
STRIPE_PRICE_ID_YEAR=price_xxx # $20/year
STRIPE_PRICE_ID_MONTH_100=price_xxx # $100/month
STRIPE_PRICE_ID_MONTH_200=price_xxx # $200/month
FREE_TIER_LIMIT=10
YEAR_TIER_LIMIT=50
MAX_SIGNUPS=0
STRIPE_PRICE_ID remains as a fallback if tier-specific prices are not set.
Webhook Events
Enable these in Stripe Dashboard → Developers → Webhooks:
checkout.session.completed– provisions user, schedules free-tier cancelcustomer.subscription.deleted– deprovisions stackcustomer.subscription.updated– status changesinvoice.paid– migrates $20/year subscriptions to $100/month on renewal
Migration Flow
When a customer with a $20/year subscription has their first renewal (after 1 year), the invoice.paid webhook switches the subscription to $100/month for the next billing cycle.