Use when you have a written implementation plan to execute in a separate session with review checkpoints
npx skills add phrazzld/claude-config --skill "stripe-verify"
Install specific skill from multi-skill repository
# Description
|
# SKILL.md
name: stripe-verify
description: |
End-to-end verification of Stripe integration. Deep testing including
real checkout flows, webhook delivery, and subscription state transitions.
Stripe Verify
Comprehensive end-to-end verification. Go deep β billing bugs are expensive.
Objective
Prove the integration works. Not "looks right" β actually works. Test real flows, verify real state changes, confirm real webhook delivery.
Process
1. Configuration Verification
Before functional tests, verify all configuration:
# Env vars exist
npx convex env list | grep STRIPE
npx convex env list --prod | grep STRIPE
vercel env ls --environment=production | grep STRIPE
# Webhook URL accessible
curl -s -o /dev/null -w "%{http_code}" -I -X POST "$WEBHOOK_URL"
# Must be 4xx or 5xx, not 3xx
# Stripe CLI connected
stripe listen --print-json --latest
2. Checkout Flow Test
Create a real test checkout session:
# Trigger checkout (via app or API)
# Complete with Stripe test card: 4242 4242 4242 4242
# Verify:
# - Session created successfully
# - Redirect works
# - Success page loads
# - Webhook received (check logs)
# - Subscription created in Stripe Dashboard
# - User state updated in database
3. Webhook Delivery Test
Verify webhooks are actually delivering:
# Check pending webhooks
stripe events list --limit 5 | jq '.data[] | {id, type, pending_webhooks}'
# Resend a recent event
stripe events resend <event_id> --webhook-endpoint <endpoint_id>
# Watch logs for delivery
vercel logs <app> --json | grep webhook
All recent events should have pending_webhooks: 0.
4. Subscription State Transitions
Test each state transition:
New β Trial
- Create account
- Verify trial starts
- Verify trial end date correct
Trial β Active
- Complete checkout during trial
- Verify remaining trial honored (trial_end passed to Stripe)
- Verify local state updated
Active β Canceled
- Cancel subscription (via customer portal or API)
- Verify access continues until period end
- Verify state reflects cancellation
Canceled β Resubscribed
- Resubscribe after cancellation
- Verify new subscription created
- Verify billing starts immediately (no new trial)
Trial Expired
- Let trial expire (or simulate)
- Verify access revoked
- Verify proper messaging to user
5. Edge Case Testing
Webhook Idempotency
- Resend the same webhook event twice
- Verify no duplicate processing
- Verify no state corruption
Out-of-Order Webhooks
- If possible, simulate events arriving out of order
- Verify system handles gracefully
Payment Failure
- Use Stripe test card for decline: 4000 0000 0000 0002
- Verify subscription goes to past_due
- Verify access policy for past_due state
6. Access Control Verification
Test that access control actually works:
- Active subscriber β can access features
- Trial user β can access features
- Expired trial β blocked
- Canceled (in period) β can access
- Canceled (past period) β blocked
- Past due β depends on policy (usually grace period)
7. Business Model Compliance
Verify against business-model-preferences:
- Single pricing tier? (no multiple options)
- Trial honored on upgrade? (check Stripe subscription has trial_end)
- No freemium logic? (expired trial = no access)
8. Subscription Management UX
Verify against stripe-subscription-ux requirements:
Settings Page Exists:
- [ ] Settings page has subscription section
- [ ] Current plan name displayed
- [ ] Subscription status with visual indicator
- [ ] Next billing date shown
- [ ] Payment method displayed (brand + last4)
Stripe Portal Integration:
- [ ] "Manage Subscription" button exists
- [ ] Button creates portal session and redirects
- [ ] Return URL configured correctly
Billing History:
- [ ] Past invoices displayed
- [ ] Invoice PDFs downloadable
- [ ] Payment statuses shown
State-Specific UX:
- [ ] Trial banner shows for trialing users
- [ ] Canceled state shows period end date
- [ ] Past due state shows payment update CTA
- [ ] Active state shows "all good" indicator
This is a hard requirement. If subscription management UX is missing,
verification fails. Users must be able to manage their billing.
Output
Verification report:
STRIPE VERIFICATION REPORT
=========================
CONFIGURATION
β All env vars present
β Webhook URL responds correctly
β Stripe CLI connected
CHECKOUT FLOW
β Session creates
β Payment succeeds
β Webhook received
β State updated
SUBSCRIPTION STATES
β Trial β Active
β Active β Canceled
β Canceled β Resubscribed
β Trial expiration: not tested (would require waiting)
EDGE CASES
β Idempotent webhook handling
β Payment decline handled
β Out-of-order webhooks: not testable
ACCESS CONTROL
β Active: access granted
β Trial: access granted
β Expired: access denied
β Canceled in-period: access granted
BUSINESS MODEL
β Single tier
β Trial completion on upgrade
β No freemium
SUBSCRIPTION MANAGEMENT UX
β Settings page has subscription section
β Plan name and status displayed
β Next billing date shown
β Payment method displayed
β Manage Subscription button works
β Billing history accessible
β Trial banner for trialing users
β Canceled state messaging
β Past due state: not tested
---
STATUS: VERIFIED (with minor gaps)
When to Run
- After
stripe-setup(new integration) - After
stripe-reconcile(fixes applied) - Before production deployment
- Periodically as health check
Deep Mode
This skill defaults to deep verification. Don't skip tests to save time. Billing bugs cost more than the time spent testing.
# Supported AI Coding Agents
This skill is compatible with the SKILL.md standard and works with all major AI coding agents:
Learn more about the SKILL.md standard and how to use these skills with your preferred AI coding agent.