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_KEYfromknowledge/.envfor 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_monthlyorprice_annualstripe_price_id_testandstripe_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_knowledgetable 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:
- Navigate to the pricing page
- Click the plan that changed
- Confirm the Stripe checkout session shows the new price
- 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 --checkpasses with no drift- Stripe checkout shows the new price amount
product_knowledgetable no longer references the old price- No hardcoded old prices in marketing page source
Rollback
If the price change needs to be reversed:
- Create another new Stripe price at the original amount
- Archive the failed new price
- Update
pricing.yamlwith the reverted amounts and original price ID - Re-run
pnpm derive - Update Vercel env vars back to original price IDs
- Redeploy
Never restore the old archived price — always create a fresh one.
See Also
- Knowledge Maintenance Runbook
- Monthly Reconciliation Runbook
- Canonical pricing:
C:\dev\knowledge\data\pricing.yaml - Stripe price IDs:
C:\dev\PRICING.md