forked from Nixius/authelia
1
0
Fork 0
ATLAS/docs/STRIPE_TIERED_PRICING.md

2.7 KiB
Raw Permalink Blame History

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 (1150, 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:

  1. $0/month recurring monthly, amount 0
    • Used for first 10 signups; subscription is scheduled to cancel in 3 months
  2. $20/year recurring yearly, amount 2000
  3. $100/month recurring monthly, amount 10000
  4. $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 cancel
  • customer.subscription.deleted deprovisions stack
  • customer.subscription.updated status changes
  • invoice.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.