Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Get paid from day one. Payments, subscriptions, billing portal, webhooks, metered billing, Stripe Connect. The complete guide to implementing Stripe correctly, including all the edge cases that will bite you at 3am. This isn't just API calls - it's the full payment system: handling failures, managing subscriptions, dealing with dunning, and keeping revenue flowing. Use when: stripe, payments, subscription, billing, checkout.
.claude/skills/davila7-stripe-integration/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-03 | ✗→✓ | ▲ Improved | 30% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 53% | 0% |
| case-16 | ✓→✗ | ▼ Worse | 39% | 0% |
| case-02 | ✓→✓ | = Same ✓ | 67% | 0% |
| case-04 | ✓→✓ | = Same ✓ | 57% | 0% |
You are a payments engineer who has processed billions in transactions. You've seen every edge case - declined cards, webhook failures, subscription nightmares, currency issues, refund fraud. You know that payments code must be bulletproof because errors cost real money. You're paranoid about race conditions, idempotency, and webhook verification.
Use idempotency keys on all payment operations to prevent duplicate charges
Handle webhooks as state transitions, not triggers
Use Stripe test mode with real test cards for all development
| Issue | Severity | Solution | |-------|----------|----------| | Not verifying webhook signatures | critical | # Always verify signatures: | | JSON middleware parsing body before webhook can verify | critical | # Next.js App Router: | | Not using idempotency keys for payment operations | high | # Always use idempotency keys: | | Trusting API responses instead of webhooks for payment statu | critical | # Webhook-first architecture: | | Not passing metadata through checkout session | high | # Always include metadata: | | Local subscription state drifting from Stripe state | high | # Handle ALL subscription webhooks: | | Not handling failed payments and dunning | high | # Handle invoice.payment_failed: | | Different code paths or behavior between test and live mode | high | # Separate all keys: |
Works well with: nextjs-supabase-auth, supabase-backend, webhook-patterns, security
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 18,928 | 15,202 | -20% | 1 | 1 | 0% | 3,993 | 3,225 | -19% | 0 | 0 | — |
case-02 | pass→pass | 10,465 | 14,692 | +40% | 1 | 1 | 0% | 2,019 | 3,368 | +67% | 0 | 0 | — |
case-03 | fail→pass | 14,654 | 16,392 | +12% | 1 | 1 | 0% | 2,755 | 3,589 | +30% | 0 | 0 | — |
case-04 | pass→pass | 12,019 | 14,969 | +25% | 1 | 1 | 0% | 2,107 | 3,309 | +57% | 0 | 0 | — |
case-05 | fail→pass | 6,645 | 7,633 | +15% | 1 | 1 | 0% | 1,316 | 2,013 | +53% | 0 | 0 | — |
case-06 | pass→pass | 10,994 | 14,802 | +35% | 1 | 1 | 0% | 1,966 | 3,239 | +65% | 0 | 0 | — |
case-07 | pass→pass | 11,099 | 8,202 | -26% | 1 | 1 | 0% | 2,177 | 2,129 | -2% | 0 | 0 | — |
case-08 | pass→pass | 12,658 | 12,832 | +1% | 1 | 1 | 0% | 2,354 | 2,760 | +17% | 0 | 0 | — |
case-09 | pass→pass | 12,415 | 12,967 | +4% | 1 | 1 | 0% | 1,885 | 2,212 | +17% | 0 | 0 | — |
case-10 | pass→pass | 11,054 | 15,075 | +36% | 1 | 1 | 0% | 1,857 | 3,083 | +66% | 0 | 0 | — |
case-11 | pass→pass | 4,813 | 7,475 | +55% | 1 | 1 | 0% | 919 | 1,815 | +97% | 0 | 0 | — |
case-12 | pass→pass | 12,451 | 13,111 | +5% | 1 | 1 | 0% | 2,029 | 2,986 | +47% | 0 | 0 | — |
case-13 | fail→fail | 12,234 | 17,403 | +42% | 1 | 1 | 0% | 2,329 | 3,888 | +67% | 0 | 0 | — |
case-14 | pass→pass | 12,127 | 11,902 | -2% | 1 | 1 | 0% | 2,370 | 2,847 | +20% | 0 | 0 | — |
case-15 | pass→pass | 8,042 | 12,122 | +51% | 1 | 1 | 0% | 1,697 | 2,814 | +66% | 0 | 0 | — |
case-16 | pass→fail | 13,763 | 16,933 | +23% | 1 | 1 | 0% | 2,654 | 3,683 | +39% | 0 | 0 | — |
case-17 | pass→pass | 6,573 | 9,549 | +45% | 1 | 1 | 0% | 1,264 | 2,240 | +77% | 0 | 0 | — |
case-18 | pass→pass | 12,396 | 14,357 | +16% | 1 | 1 | 0% | 2,011 | 2,971 | +48% | 0 | 0 | — |
case-19 | pass→pass | 10,598 | 12,735 | +20% | 1 | 1 | 0% | 1,991 | 2,684 | +35% | 0 | 0 | — |
case-20 | pass→pass | 9,943 | 13,692 | +38% | 1 | 1 | 0% | 2,022 | 3,239 | +60% | 0 | 0 | — |
case-21 | pass→pass | 9,888 | 4,635 | -53% | 1 | 1 | 0% | 1,000 | 1,104 | +10% | 0 | 0 | — |
case-22 | pass→pass | 10,298 | 10,422 | +1% | 1 | 1 | 0% | 2,050 | 2,412 | +18% | 0 | 0 | — |
case-23 | pass→pass | 14,667 | 16,840 | +15% | 1 | 1 | 0% | 2,870 | 3,856 | +34% | 0 | 0 | — |
case-24 | pass→pass | 10,883 | 11,722 | +8% | 1 | 1 | 0% | 1,902 | 2,585 | +36% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 24 cases were attempted. The headline lift of +4 percentage points is the difference between those two pass rates over the 24 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.