Skip to main content

Knowledge > Runbooks > Business Ops > Change Pricing Across the Portfolio

Change Pricing Across the Portfolio

Apply a pricing change correctly so it propagates through the canonical knowledge system, Stripe, Vercel env vars, marketing pages, and the product_knowledge table — in one coordinated update.

Prerequisites

  • Founder has approved the pricing change (confirm before doing anything in live mode)
  • Current prices known from knowledge/data/pricing.yaml (the single source of truth)
  • STRIPE_LIVE_SECRET_KEY from knowledge/.env for live mode Stripe operations
  • Feature branch checked out in churchwiseai-web (or the relevant codebase)

The Golden Rule

Update knowledge/data/pricing.yaml first. Every other file derives from it. Never edit derived files directly.

Steps

1. Update the Canonical Pricing Source

Edit C:\dev\knowledge\data\pricing.yaml:

# Open the file and update the price value(s)
# Example: change Pro Chat monthly from $34.95 to $39.95

Fields to update in the YAML:

  • price_monthly or price_annual
  • stripe_price_id_test and stripe_price_id_live (after creating new Stripe prices)

Do NOT update PRICING.md or pricing.ts directly — the derive pipeline generates those.

2. Run Derive to Propagate Changes

cd /c/dev/knowledge
pnpm derive

This updates:

  • pricing.ts (used by the Next.js apps)
  • PRICING.md (human-readable reference)
  • product_knowledge table entries that reference pricing
  • Marketing page verification targets

Review the diff output to confirm the right files changed.

3. Create the New Stripe Price (Do NOT Delete Old Prices)

In Stripe, prices are immutable once created — you cannot change the amount. Create a new price on the existing product.

Test mode first:

stripe prices create \
--product prod_EXISTING_PRODUCT_ID \
--unit-amount 3995 \
--currency usd \
--recurring[interval]=month \
--nickname "Pro Chat Monthly v2"

Live mode (after founder confirms test mode works):

stripe prices create \
--product prod_EXISTING_PRODUCT_ID \
--unit-amount 3995 \
--currency usd \
--recurring[interval]=month \
--nickname "Pro Chat Monthly v2" \
--api-key $STRIPE_LIVE_SECRET_KEY

Archive the old price (do NOT delete):

stripe prices update price_OLD_ID --active=false --api-key $STRIPE_LIVE_SECRET_KEY

4. Update Price IDs in pricing.yaml and Re-Derive

Add the new Stripe price IDs to knowledge/data/pricing.yaml:

pro_chat:
price_monthly: 39.95
stripe_price_id_test: price_new_test_id
stripe_price_id_live: price_new_live_id

Then re-run pnpm derive to propagate the new IDs.

5. Update Vercel Environment Variables

# Update the price ID env var for each relevant codebase
echo "price_new_live_id" | vercel env add STRIPE_PRICE_PRO_CHAT_MONTHLY production

# Verify
vercel env ls | grep STRIPE_PRICE_PRO_CHAT

Repeat for any other env vars that reference the old price ID.

6. Update product_knowledge for the New Price

If the derive pipeline didn't catch all product_knowledge entries:

UPDATE product_knowledge
SET answer = REPLACE(answer, '$34.95', '$39.95'), updated_at = now()
WHERE answer ILIKE '%34.95%'
AND category IN ('churchwiseai', 'billing', 'getting_started');

Review the results before running. Use REPLACE carefully — check that it only touches pricing references.

7. Audit Marketing Pages for Hardcoded Prices

Search for any hardcoded price strings across the codebase:

grep -r "\$34.95" /c/dev/churchwiseai-web/src/
grep -r "34\.95" /c/dev/churchwiseai-web/src/

Update any hardcoded references to use the canonical pricing source (or update the value if it's not dynamic).

8. Deploy and Verify the Checkout Flow

# Trigger a production deployment to pick up new env vars
cd /c/dev/churchwiseai-web
vercel --prod

After deployment, test the checkout flow with the Stripe test card 4242 4242 4242 4242:

  1. Navigate to the pricing page
  2. Click the plan that changed
  3. Confirm the Stripe checkout session shows the new price
  4. Complete a test purchase (test mode only)

9. Notify Existing Customers if Their Price is Changing

If the price change affects existing subscribers:

  • Draft a notification email for founder review
  • Give at least 30 days notice for price increases (best practice)
  • In Stripe, you can schedule the price change on existing subscriptions

Do NOT send notifications without founder approval.

10. Document in DECISION_LOG.md

- 2026-03-25: Changed Pro Chat monthly from $34.95 to $39.95. Rationale: [reason]. Existing subscribers: [notified/grandfathered/affected immediately].

Verification

  • pnpm derive --check passes with no drift
  • Stripe checkout shows the new price amount
  • product_knowledge table no longer references the old price
  • No hardcoded old prices in marketing page source

Rollback

If the price change needs to be reversed:

  1. Create another new Stripe price at the original amount
  2. Archive the failed new price
  3. Update pricing.yaml with the reverted amounts and original price ID
  4. Re-run pnpm derive
  5. Update Vercel env vars back to original price IDs
  6. Redeploy

Never restore the old archived price — always create a fresh one.

See Also