Skip to content

Google Cloud Secrets - Payment Flow Configuration

Date: 2026-01-29 Feature: Mandatory Subscription Payment Flow Single Source of Truth: Google Cloud Secret Manager


⚠️ CRITICAL: Secrets Management Workflow

  1. Update Google Cloud Secrets (single source of truth)
  2. Regenerate .env files from GCloud secrets
  3. NEVER edit .env files directly

New Secrets to Add to Google Cloud Secret Manager

Backend Secrets (bayit-backend-production)

Payment Flow Feature Flags

yaml
# Secret: REQUIRE_PAYMENT_ON_SIGNUP
# Description: Master switch for payment-required signup flow
# Type: boolean
# Default: false (safe default - feature disabled)
# Production: Set to true when ready to enable
REQUIRE_PAYMENT_ON_SIGNUP=false

# Secret: REQUIRE_PAYMENT_ON_SIGNUP_PERCENTAGE
# Description: Percentage of new signups requiring payment (0-100)
#              Used for gradual rollout: 0% → 5% → 25% → 50% → 100%
# Type: integer (0-100)
# Default: 0 (disabled)
# Rollout Plan:
#   - Phase 1: 5% (monitoring and testing)
#   - Phase 2: 25% (scaling validation)
#   - Phase 3: 50% (majority testing)
#   - Phase 4: 100% (full rollout)
REQUIRE_PAYMENT_ON_SIGNUP_PERCENTAGE=0

Payment Configuration

yaml
# Secret: SIGNUP_TRIAL_PERIOD_DAYS
# Description: Free trial duration for new signups (Stripe subscription trial)
# Type: integer
# Default: 7
# Options: 0 (no trial), 7, 14, 30 days
# Note: Card required upfront, charged after trial
SIGNUP_TRIAL_PERIOD_DAYS=7

# Secret: PAYMENT_SUCCESS_PATH
# Description: Frontend path for successful payment redirect from Stripe
# Type: string (URL path)
# Default: /payment/success
PAYMENT_SUCCESS_PATH=/payment/success

# Secret: PAYMENT_CANCELLED_PATH
# Description: Frontend path for cancelled payment redirect from Stripe
# Type: string (URL path)
# Default: /payment/cancelled
PAYMENT_CANCELLED_PATH=/payment/cancelled

# Secret: PAYMENT_STATUS_POLL_INTERVAL_MS
# Description: Backend polling interval for payment status checks (milliseconds)
# Type: integer
# Default: 5000 (5 seconds)
# Note: Frontend also has its own polling interval
PAYMENT_STATUS_POLL_INTERVAL_MS=5000

# Secret: PAYMENT_PENDING_CLEANUP_DAYS
# Description: Days before deleting abandoned payment_pending users
# Type: integer
# Default: 7
# Note: Users who register but never complete payment are cleaned up
PAYMENT_PENDING_CLEANUP_DAYS=7

# Secret: PAYMENT_CHECKOUT_SESSION_TTL_HOURS
# Description: Stripe checkout session expiration time (hours)
# Type: integer
# Default: 24
PAYMENT_CHECKOUT_SESSION_TTL_HOURS=24

Rollback Configuration

yaml
# Secret: PAYMENT_CONVERSION_THRESHOLD
# Description: Minimum acceptable payment conversion rate (0.0-1.0)
#              Triggers automatic rollback if conversion falls below threshold
# Type: float (0.0 to 1.0)
# Default: 0.40 (40% conversion minimum)
# Note: If signup-to-payment conversion < 40%, alert and consider rollback
PAYMENT_CONVERSION_THRESHOLD=0.40

Frontend Secrets (bayit-plus-web)

yaml
# Secret: REACT_APP_PAYMENT_STATUS_POLL_INTERVAL_MS
# Description: Frontend polling interval for checking payment status (milliseconds)
# Type: integer
# Default: 5000 (5 seconds)
# Note: Uses exponential backoff (doubles after 10 attempts)
REACT_APP_PAYMENT_STATUS_POLL_INTERVAL_MS=5000

Deployment Steps

1. Add Secrets to Google Cloud

bash
# Backend secrets
gcloud secrets create REQUIRE_PAYMENT_ON_SIGNUP \
  --data-file=- <<< "false"

gcloud secrets create REQUIRE_PAYMENT_ON_SIGNUP_PERCENTAGE \
  --data-file=- <<< "0"

gcloud secrets create SIGNUP_TRIAL_PERIOD_DAYS \
  --data-file=- <<< "7"

gcloud secrets create PAYMENT_SUCCESS_PATH \
  --data-file=- <<< "/payment/success"

gcloud secrets create PAYMENT_CANCELLED_PATH \
  --data-file=- <<< "/payment/cancelled"

gcloud secrets create PAYMENT_STATUS_POLL_INTERVAL_MS \
  --data-file=- <<< "5000"

gcloud secrets create PAYMENT_PENDING_CLEANUP_DAYS \
  --data-file=- <<< "7"

gcloud secrets create PAYMENT_CHECKOUT_SESSION_TTL_HOURS \
  --data-file=- <<< "24"

gcloud secrets create PAYMENT_CONVERSION_THRESHOLD \
  --data-file=- <<< "0.40"

# Frontend secret
gcloud secrets create REACT_APP_PAYMENT_STATUS_POLL_INTERVAL_MS \
  --data-file=- <<< "5000"

2. Grant Secret Access to Service Accounts

bash
# Backend service account
gcloud secrets add-iam-policy-binding REQUIRE_PAYMENT_ON_SIGNUP \
  --member="serviceAccount:bayit-backend-production@PROJECT_ID.iam.gserviceaccount.com" \
  --role="roles/secretmanager.secretAccessor"

# Repeat for all secrets...

3. Regenerate .env Files

bash
# Run your secrets sync script
./scripts/sync-gcloud-secrets.sh

# Or manually regenerate
gcloud secrets versions access latest --secret="REQUIRE_PAYMENT_ON_SIGNUP" >> backend/.env
# ... etc

4. Restart Services

bash
# Backend
kubectl rollout restart deployment/bayit-backend-production

# Frontend
kubectl rollout restart deployment/bayit-plus-web

Gradual Rollout Plan

Phase 1: Monitoring (5% rollout)

bash
gcloud secrets versions add REQUIRE_PAYMENT_ON_SIGNUP --data-file=- <<< "true"
gcloud secrets versions add REQUIRE_PAYMENT_ON_SIGNUP_PERCENTAGE --data-file=- <<< "5"
  • Duration: 48 hours
  • Monitor: Conversion rate, error rate, support tickets
  • Rollback if: Conversion < 40%, error rate > 5%

Phase 2: Scaling (25% rollout)

bash
gcloud secrets versions add REQUIRE_PAYMENT_ON_SIGNUP_PERCENTAGE --data-file=- <<< "25"
  • Duration: 72 hours
  • Monitor: Same as Phase 1
  • Rollback if: Same thresholds

Phase 3: Majority (50% rollout)

bash
gcloud secrets versions add REQUIRE_PAYMENT_ON_SIGNUP_PERCENTAGE --data-file=- <<< "50"
  • Duration: 1 week
  • Monitor: Same as Phase 1

Phase 4: Full Rollout (100%)

bash
gcloud secrets versions add REQUIRE_PAYMENT_ON_SIGNUP_PERCENTAGE --data-file=- <<< "100"
  • Duration: Ongoing
  • Monitor: Weekly reviews

Emergency Rollback

Disable Feature Immediately

bash
gcloud secrets versions add REQUIRE_PAYMENT_ON_SIGNUP --data-file=- <<< "false"

# Regenerate .env and restart
./scripts/sync-gcloud-secrets.sh
kubectl rollout restart deployment/bayit-backend-production

Revert Users to Viewer

bash
poetry run python backend/scripts/rollback_payment_pending.py --execute

Monitoring Alerts

Set up alerts in Google Cloud Monitoring:

  1. Low Conversion Rate:

    • Metric: signup_payment_completed / signup_payment_required
    • Threshold: < 0.40
    • Action: Alert ops team
  2. High Payment Pending Queue:

    • Metric: payment_pending_queue_size
    • Threshold: > 500
    • Action: Investigate bottleneck
  3. Webhook Failures:

    • Metric: webhook_processing_errors
    • Threshold: > 5%
    • Action: Check Stripe integration


Notes

  • All secrets use safe defaults (feature disabled)
  • Gradual rollout via percentage-based bucketing
  • Hash-based user assignment (consistent across restarts)
  • Automatic rollback trigger at 40% conversion threshold
  • Prometheus metrics track all key indicators

Released under the MIT License.