#!/usr/bin/env bash # Create Atlas tiered pricing products and prices in Stripe. # Usage: ./scripts/stripe-setup.sh [path/to/.env] # Use sandbox .env for test mode, prod .env for live. Outputs env vars to add to .env. set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" APPLY=false ENV_FILE="$REPO_ROOT/.env" for arg in "$@"; do if [ "$arg" = "--apply" ]; then APPLY=true elif [ -f "$arg" ]; then ENV_FILE="$arg" fi done cd "$REPO_ROOT" if [ -f "$ENV_FILE" ]; then set -a # shellcheck source=/dev/null . "$ENV_FILE" set +a fi if [ -z "${STRIPE_SECRET_KEY:-}" ]; then echo "ERROR: STRIPE_SECRET_KEY not set. Usage: $0 [path/to/.env]" >&2 exit 1 fi # Detect mode from key if [[ "$STRIPE_SECRET_KEY" == sk_live_* ]]; then MODE="live" echo ">>> Stripe LIVE mode" >&2 else MODE="test" echo ">>> Stripe TEST mode" >&2 fi BASE_URL="https://api.stripe.com/v1" # Create product echo "Creating product Atlas..." >&2 PRODUCT=$(curl -s -X POST -u "${STRIPE_SECRET_KEY}:" "$BASE_URL/products" \ -d "name=Atlas" \ -d "description=Managed workspace and infrastructure") PRODUCT_ID=$(echo "$PRODUCT" | jq -r '.id // empty') if [ -z "$PRODUCT_ID" ]; then echo "Failed to create product. Response: $PRODUCT" >&2 exit 1 fi echo "Product: $PRODUCT_ID" >&2 # Create prices (recurring) create_price() { local amount="$1" local interval="$2" local nickname="$3" local out out=$(curl -s -X POST -u "${STRIPE_SECRET_KEY}:" "$BASE_URL/prices" \ -d "product=$PRODUCT_ID" \ -d "currency=usd" \ -d "unit_amount=$amount" \ -d "recurring[interval]=$interval" \ -d "nickname=$nickname") echo "$out" | jq -r '.id // empty' } echo "Creating prices..." >&2 PRICE_FREE=$(create_price 0 month "Atlas Free 3mo") PRICE_YEAR=$(create_price 2000 year "Atlas Founder Year") PRICE_100=$(create_price 10000 month "Atlas 100/mo") PRICE_200=$(create_price 20000 month "Atlas 200/mo") if [ -z "$PRICE_FREE" ] || [ -z "$PRICE_YEAR" ] || [ -z "$PRICE_100" ] || [ -z "$PRICE_200" ]; then echo "Failed to create one or more prices" >&2 exit 1 fi echo "" >&2 echo "=== Add these to your .env ($MODE mode) ===" >&2 echo "" >&2 cat << EOF # Stripe tiered pricing ($MODE) STRIPE_PRICE_ID_FREE=$PRICE_FREE STRIPE_PRICE_ID_YEAR=$PRICE_YEAR STRIPE_PRICE_ID_MONTH_100=$PRICE_100 STRIPE_PRICE_ID_MONTH_200=$PRICE_200 FREE_TIER_LIMIT=10 YEAR_TIER_LIMIT=50 EOF # If --apply passed, merge into .env if [ "$APPLY" = "true" ]; then ENV_TARGET="$ENV_FILE" [ -f "$ENV_TARGET" ] || { echo "No $ENV_TARGET to update" >&2; exit 0; } update_var() { local k="$1" v="$2" if grep -q "^${k}=" "$ENV_TARGET" 2>/dev/null; then sed -i.bak "s|^${k}=.*|${k}=${v}|" "$ENV_TARGET" else echo "${k}=${v}" >> "$ENV_TARGET" fi } update_var "STRIPE_PRICE_ID_FREE" "$PRICE_FREE" update_var "STRIPE_PRICE_ID_YEAR" "$PRICE_YEAR" update_var "STRIPE_PRICE_ID_MONTH_100" "$PRICE_100" update_var "STRIPE_PRICE_ID_MONTH_200" "$PRICE_200" rm -f "${ENV_TARGET}.bak" echo "" >&2 echo "Updated $ENV_TARGET. Redeploy: export \$(grep -v '^#' .env | xargs) && docker stack deploy -c stack.yml atlas" >&2 fi