Skip to content

chore(helm): update Architect Stripe price IDs to $199/mo#6787

Merged
beastoin merged 2 commits intomainfrom
fix/architect-price-199
Apr 17, 2026
Merged

chore(helm): update Architect Stripe price IDs to $199/mo#6787
beastoin merged 2 commits intomainfrom
fix/architect-price-199

Conversation

@beastoin
Copy link
Copy Markdown
Collaborator

Summary

Update Architect plan Stripe price IDs in prod Helm values (backend-listen + pusher). Price changed from $400/mo to $199/mo in Stripe dashboard.

Changes

  • backend-listen prod: STRIPE_ARCHITECT_MONTHLY_PRICE_IDprice_1TAfBB1F8wnoWYvw8XBFM1dX, STRIPE_ARCHITECT_ANNUAL_PRICE_IDprice_1TLFac1F8wnoWYvwtPxZhtzE
  • pusher prod: same price IDs

No code changes needed — prices are fetched dynamically from Stripe.


Deployment Steps

Step 1: Set Cloud Run env vars (BEFORE code deploy)

Prod — 3 Cloud Run services (backend, backend-sync, backend-integration):

# backend
gcloud run services update backend --region us-central1 --project based-hardware \
  --update-env-vars STRIPE_ARCHITECT_MONTHLY_PRICE_ID=price_1TAfBB1F8wnoWYvw8XBFM1dX \
  --update-env-vars STRIPE_ARCHITECT_ANNUAL_PRICE_ID=price_1TLFac1F8wnoWYvwtPxZhtzE

# backend-sync
gcloud run services update backend-sync --region us-central1 --project based-hardware \
  --update-env-vars STRIPE_ARCHITECT_MONTHLY_PRICE_ID=price_1TAfBB1F8wnoWYvw8XBFM1dX \
  --update-env-vars STRIPE_ARCHITECT_ANNUAL_PRICE_ID=price_1TLFac1F8wnoWYvwtPxZhtzE

# backend-integration
gcloud run services update backend-integration --region us-central1 --project based-hardware \
  --update-env-vars STRIPE_ARCHITECT_MONTHLY_PRICE_ID=price_1TAfBB1F8wnoWYvw8XBFM1dX \
  --update-env-vars STRIPE_ARCHITECT_ANNUAL_PRICE_ID=price_1TLFac1F8wnoWYvwtPxZhtzE

Step 2: Merge PR to main

Step 3: Deploy Helm (GKE)

# Backend-listen Helm
gh workflow run gcp_backend_listen_helm.yml -f environment=prod -f branch=main

# Pusher Helm
gh workflow run gcp_backend_pusher.yml -f environment=prod -f branch=main

Step 4: Verify

# Check GKE env vars
kubectl get deployment -n prod-omi-backend prod-omi-backend-listen -o json | python3 -c "
import json, sys
data = json.load(sys.stdin)
for e in data['spec']['template']['spec']['containers'][0]['env']:
    if 'ARCHITECT' in e.get('name',''):
        print(f'{e[\"name\"]}={e[\"value\"]}')"

# Check Cloud Run env vars
gcloud run services describe backend --region us-central1 --project based-hardware --format=json | python3 -c "
import json, sys
data = json.load(sys.stdin)
for e in data['spec']['template']['spec']['containers'][0]['env']:
    if 'ARCHITECT' in e.get('name',''):
        print(f'{e[\"name\"]}={e[\"value\"]}')"

Rollback

Revert env vars to old price IDs:

  • Monthly: price_1TN7vz1F8wnoWYvwXbVLEX0Y
  • Annual: price_1TN7vz1F8wnoWYvwkrqXVn5t

🤖 Generated with Claude Code

beastoin and others added 2 commits April 17, 2026 23:30
Monthly: price_1TAfBB1F8wnoWYvw8XBFM1dX
Annual: price_1TLFac1F8wnoWYvwtPxZhtzE

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Monthly: price_1TAfBB1F8wnoWYvw8XBFM1dX
Annual: price_1TLFac1F8wnoWYvwtPxZhtzE

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@beastoin beastoin merged commit ccc89fe into main Apr 17, 2026
3 checks passed
@beastoin beastoin deleted the fix/architect-price-199 branch April 17, 2026 23:32
@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps bot commented Apr 17, 2026

Greptile Summary

This PR updates the Stripe Architect plan price IDs in both prod Helm charts (backend-listen and pusher) to reflect a price reduction from $400/mo to $199/mo, reactivating older price IDs that previously existed on the plan. The two changed files are consistent with each other.

  • P1 — subscription.py must be updated alongside this Helm change. The retired $400/mo price IDs (price_1TN7vz1F8wnoWYvwXbVLEX0Y / price_1TN7vz1F8wnoWYvwkrqXVn5t, shown as rollback targets in the PR description) are not in LEGACY_PRICE_MAP. Once the Helm change is live, Stripe webhook events for any subscriber still on the old $400/mo price will cause get_plan_type_from_price_id to raise ValueError, making _build_subscription_from_stripe_object return None, and the Firestore subscription record will not be updated — most critically, cancellations will be silently ignored and those users will retain paid-tier access indefinitely.

Confidence Score: 4/5

Safe to merge only if subscription.py is updated to add the retired $400/mo price IDs to LEGACY_PRICE_MAP before or alongside this Helm deployment.

The Helm config change itself is clean and consistent between both charts. However, the accompanying code change in subscription.py (adding the retired price IDs to LEGACY_PRICE_MAP) was not included, and that omission will cause silent data integrity failures for existing $400/mo subscribers when their Stripe webhook events are processed post-deployment.

backend/utils/subscription.py — LEGACY_PRICE_MAP needs two new entries for the retired $400/mo Architect price IDs before this Helm change goes live.

Important Files Changed

Filename Overview
backend/charts/backend-listen/prod_omi_backend_listen_values.yaml Updates STRIPE_ARCHITECT_MONTHLY_PRICE_ID and STRIPE_ARCHITECT_ANNUAL_PRICE_ID to new $199/mo price IDs; values are consistent with the pusher chart but the retired $400/mo IDs are missing from LEGACY_PRICE_MAP in subscription.py.
backend/charts/pusher/prod_omi_pusher_values.yaml Same Architect price ID updates as backend-listen; values are consistent between both charts.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[Stripe Webhook Event\ncustomer.subscription.updated/deleted] --> B[_build_subscription_from_stripe_object]
    B --> C{get_plan_type_from_price_id}
    C --> D{Check active env vars\nSTRIPE_ARCHITECT_*}
    D -->|Found: new $199 IDs| E[Return PlanType.architect ✓]
    D -->|Not found| F{Check LEGACY_PRICE_MAP}
    F -->|Found: old $199 IDs in map| G[Return PlanType.architect ✓]
    F -->|Not found| H[⚠️ ValueError raised]
    H --> I[_build returns None]
    I --> J[Firestore NOT updated\nCancellation silently ignored]

    style H fill:#ff6b6b,color:#fff
    style J fill:#ff6b6b,color:#fff
    style E fill:#51cf66,color:#fff
    style G fill:#51cf66,color:#fff

    K[old $400/mo IDs\nprice_1TN7vz...] --> F
    L[MISSING from LEGACY_PRICE_MAP\nafter this PR] -.->|gap| K
Loading

Comments Outside Diff (1)

  1. backend/utils/subscription.py, line 71-78 (link)

    P1 Missing legacy entries for the retired $400/mo price IDs

    The old Architect price IDs (price_1TN7vz1F8wnoWYvwXbVLEX0Y monthly, price_1TN7vz1F8wnoWYvwkrqXVn5t annual — listed as rollback targets in the PR description) are being removed from the active env vars by this Helm change but are not added to LEGACY_PRICE_MAP. Any existing subscriber still on the $400/mo price will trigger a ValueError in get_plan_type_from_price_id, causing _build_subscription_from_stripe_object to return None on their webhook events (lines 85–88 of payment.py). The if new_subscription: guard at line 642 of payment.py then skips the Firestore update, so cancellation and renewal events for those users are silently dropped — cancellations leave the user with unrevoked access indefinitely.

    LEGACY_PRICE_MAP = {
        # Old Unlimited ($19.99/mo, $199.99/yr) → PlanType.unlimited (now Neo)
        'price_1RtJPm1F8wnoWYvwhVJ38kLb': PlanType.unlimited,
        'price_1RtJQ71F8wnoWYvwKMPaGlGY': PlanType.unlimited,
        # Old Pro ($199/mo, $1999/yr) → PlanType.architect
        'price_1TAfBB1F8wnoWYvw8XBFM1dX': PlanType.architect,
        'price_1TLFac1F8wnoWYvwtPxZhtzE': PlanType.architect,
        # Old Architect ($400/mo, $4000/yr) — active before this PR, still fires on renewals/cancellations
        'price_1TN7vz1F8wnoWYvwXbVLEX0Y': PlanType.architect,
        'price_1TN7vz1F8wnoWYvwkrqXVn5t': PlanType.architect,
    }

Reviews (1): Last reviewed commit: "chore(helm): update Architect price IDs ..." | Re-trigger Greptile

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant