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​