3.5 KiB
Academy Billing Production Rollout
Last updated: 2026-05-19
This note covers the remaining non-code steps required to move Academy Stripe billing from implemented-in-app to production-ready.
Readiness Check
Run the local readiness command before enabling the rollout flag:
php artisan academy:billing-health
php artisan academy:billing-health --json
php artisan academy:billing-health --strict
What it checks:
- Stripe publishable key, secret key, and webhook secret are configured and not placeholder values
- Academy billing price IDs are present for all configured plans
- Cashier webhook and Academy billing routes are registered
- Billing tables and Cashier user columns exist locally
- Moderation Academy billing overview route is available
--strict exits non-zero when blocking issues are found, which makes it suitable for CI or pre-deploy checks.
Environment Variables
The following values must be set with real production values before enabling Academy billing:
SKINBASE_ACADEMY_ENABLED=true
ACADEMY_BILLING_ENABLED=true
ACADEMY_STRIPE_SUBSCRIPTION_NAME=academy
STRIPE_KEY=pk_live_...
STRIPE_SECRET=sk_live_...
STRIPE_WEBHOOK_SECRET=whsec_...
CASHIER_CURRENCY=eur
CASHIER_CURRENCY_LOCALE=sl_SI
ACADEMY_CREATOR_MONTHLY_PRICE_ID=price_...
ACADEMY_PRO_MONTHLY_PRICE_ID=price_...
Do not enable ACADEMY_BILLING_ENABLED=true until the webhook endpoint and Billing Portal are configured in Stripe.
Stripe Dashboard Steps
Create these products:
- Skinbase Academy Creator
- Skinbase Academy Pro
Create these recurring prices:
creator_monthlypro_monthly
Configure the production webhook endpoint:
- URL:
https://skinbase.org/stripe/webhook - Signing secret: copy into
STRIPE_WEBHOOK_SECRET
Recommended subscribed events:
checkout.session.completedcustomer.subscription.createdcustomer.subscription.updatedcustomer.subscription.deletedcustomer.updatedcustomer.deletedpayment_method.automatically_updatedinvoice.payment_succeededinvoice.payment_failedinvoice.payment_action_required
Configure Stripe Billing Portal:
- Allow payment method updates
- Allow plan changes
- Allow cancellation
- Allow invoice history access
Deployment Sequence
- Deploy code and migrations.
- Populate production env with live Stripe values and production price IDs.
- Run
php artisan academy:billing-health --stricton the target environment. - Confirm the webhook endpoint is reachable and signature verification is active.
- Test a full Stripe test-mode or low-risk live transaction.
- Verify the subscription appears in local Cashier tables and Academy access updates from synced state.
- Verify
/moderation/academy/billingshows the expected audit event and subscription counts. - Enable
ACADEMY_BILLING_ENABLED=trueonly after the prior checks pass.
Smoke Test Checklist
After rollout:
- Guest can view Academy pricing
- Guest cannot start checkout
- Verified user can start checkout
- Success page does not grant access by itself
- Webhook sync creates or updates the local subscription rows
- Creator plan unlocks creator content but not pro content
- Pro plan unlocks creator and pro content
- Billing Portal opens and returns to
/academy/billing - Canceling a subscription keeps access during grace period and removes it after end
Operational Note
The moderation billing overview at /moderation/academy/billing is visibility-only. It is not a manual entitlement system and should not be used to bypass Stripe billing state.