About autumn-best-practices
autumn-best-practices is an integration guide for the Autumn billing SDK, aimed at developers using TypeScript or Python for subscriptions, usage billing, and credits. It covers common billing flows, React hooks, and framework handler imports.
Key features
- 01Subscription and usage billing patterns
- 02Credits and trial support
- 03Customer, checkout, and subscription methods
- 04React hooks reference
- 05Handler imports for multiple frameworks
Use cases
- 01Check feature access and record usage on the backend
- 02Implement Stripe checkout and purchase confirmation
- 03Show customer and pricing information in a React interface
Install
Copy the command and run it in a terminal.
$
npx skills add https:/ / github.com/ useautumn/ skills --skill autumn-best-practicesAfter installing, type/autumn-best-practicesin Claude Code to confirm it loaded.
Details
From the project READMEAutumn Integration Guide
Always consult docs.useautumn.com for code examples and latest API.
Autumn is a TypeScript-first billing SDK supporting subscriptions, usage-based pricing, credits, trials, and more via Stripe.
Quick Reference
Environment Variables
AUTUMN_SECRET_KEY- API key (required). Get one at app.useautumn.com
Installation
npm install autumn-js # Node.js
pip install autumn-py # Python
Core Methods
| Method | Purpose |
|---|---|
customers.create | Create or get customer (idempotent) |
checkout | Get Stripe URL or payment preview |
attach | Confirm purchase (card on file) |
cancel | Cancel subscription |
check | Verify feature access |
track | Record usage |
products.list | Get products with billing scenarios |
Core Config Options
| Option | Notes |
|---|---|
secretKey | Required. From env AUTUMN_SECRET_KEY |
baseURL | Optional. Defaults to https://api.useautumn.com |
Billing Patterns
Check → Work → Track
Always follow this order for protected actions:
const { data } = await autumn.check({ customer_id, feature_id: "api_calls" });
if (!data.allowed) return { error: "Limit reached" };
const result = await doWork();
await autumn.track({ customer_id, feature_id: "api_calls", value: 1 });
return result;
Two-Step Checkout
const { data } = await autumn.checkout({ customer_id, product_id: "pro" });
if (data.url) return redirect(data.url); // New customer → Stripe
// Returning customer → show confirmation, then:
await autumn.attach({ customer_id, product_id: "pro" });
Product Scenarios
Use products.list to get scenarios. Don't build custom logic.
| Scenario | Meaning |
|---|---|
new | Not subscribed |
active | Currently on plan |
scheduled | Scheduled for future |
upgrade | Higher tier available |
downgrade | Lower tier available |
renew | Cancelled, can reactivate |
Feature Types
| Type | Behavior |
|---|---|
boolean | Access granted or denied |
metered | Usage tracked against limit |
credit_system | Pool for multiple features |
React Hooks
| Hook | Purpose |
|---|---|
useCustomer | Get customer, checkout, attach, check |
usePricingTable | Get products with scenarios |
import { AutumnProvider } from "autumn-js/react";
<AutumnProvider>{children}</AutumnProvider>
Handler Imports
| Framework | Import |
|---|---|
| Next.js | autumn-js/next |
| React Router | autumn-js/react-router |
| Hono | autumn-js/hono |
| Express | autumn-js/express |
| Fastify | autumn-js/fastify |
| Generic | autumn-js/backend |
Common Gotchas
- URL field - Checkout URL is
data.url, notdata.checkout_url - Frontend checks - For UX only. Always enforce on backend
- Track after success - Only track usage after work completes
- Credit systems - Track metered features, not the credit system itself
- Cancel via free plan - Prefer
attach({ product_id: "free" })overcancel() - Idempotent creation -
customers.createreturns existing customer if ID exists
Resources
Comments
Markdown supported