Official AI agent skills from Dodo Payments for integrating payments, subscriptions, billing, and more into your applications.
Install skills using the skills CLI:
npx skills add dodopayments/skillsOr install individual skills:
npx skills add dodopayments/skills/dodo-payments/dodo-best-practices
npx skills add dodopayments/skills/dodo-payments/webhook-integration
npx skills add dodopayments/skills/dodo-payments/subscription-integrationAdd the marketplace:
/plugin marketplace add dodopayments/skills
Install a plugin:
/plugin install dodo-best-practices
/plugin install webhook-integration
/plugin install subscription-integration
Skills are automatically available when configured in your OpenCode settings.
| Skill | Description |
|---|---|
| dodo-best-practices | Orientation guide: SDKs, environments, auth, core concepts, and the canonical integration path |
| framework-adapters | Official adapter packages for Next.js, Express, Hono, Astro, Remix, SvelteKit, Nuxt, Fastify, TanStack, Bun, and Convex |
| testing-and-go-live | Test mode, test payment methods, webhook testing, and the production launch checklist |
| Skill | Description |
|---|---|
| checkout-integration | Creating checkout sessions, payment links, and overlay checkout |
| subscription-integration | Subscription lifecycle, trials, plan changes, proration, and on-demand charging |
| mobile-checkout | In-app checkout for React Native, Flutter, iOS, and Android |
| webhook-integration | Receiving and verifying webhooks with the Standard Webhooks specification |
| Skill | Description |
|---|---|
| credit-based-billing | Credit entitlements, balances, ledger, rollover, overage, and meter-based deduction |
| usage-based-billing | Metered billing with meters, event ingestion, and per-unit pricing |
| license-keys | License key activation, validation, and instance management |
| Skill | Description |
|---|---|
| product-catalog-management | Products, pricing, add-ons, collections, images, and digital product delivery |
| discounts-and-promotions | Discount codes, eligibility rules, stacking, and subscription-cycle limits |
| localized-pricing | Localized pricing, adaptive currency, and purchasing power parity |
| Skill | Description |
|---|---|
| customer-management | Customers, the self-service portal, payment methods, and wallets |
| refunds-and-disputes | Issuing refunds, handling disputes and chargebacks, reconciling access |
| Skill | Description |
|---|---|
| billing-sdk | BillingSDK React components for pricing tables and billing UI |
| better-auth-integration | The @dodopayments/better-auth plugin for customer sync, checkout, and portal |
Skills are reusable capabilities for AI agents. They provide procedural knowledge that helps agents accomplish specific tasks more effectively. Think of them as plugins that enhance what your AI agent can do when working with Dodo Payments.
Skills are pasted verbatim into an agent's context and reproduced as-is, so a wrong field name propagates exactly as reliably as correct code — and usually fails silently rather than loudly. Four checks run in CI and should be run locally before opening a PR:
npm install
npm run check # validate + typecheck (TypeScript, Go, Python)npm run validate enforces structural rules: real API hostnames, correct dodo_test_/dodo_live_ key
formats, no hand-rolled webhook HMAC, no deprecated SDK calls, no type suppression, and agreement between
each skill's directory name, its frontmatter, marketplace.json, and the README table.
npm run typecheck extracts every TypeScript block from every SKILL.md and compiles it against the
real dodopayments types — plus the @dodopayments/* framework adapters, so adapter examples are checked
rather than degrading to any. This is what catches wrong field and parameter names.
npm run typecheck:go and npm run typecheck:python do the same for Go and Python examples, using
go build against dodopayments-go and pyright against the real Python SDK. The Python check creates a
virtualenv on first run and reuses it afterwards.
Blocks that are deliberate counter-examples are skipped, but only when explicitly labelled — a bolded
**Wrong:**-style marker, or an <!-- typecheck: skip --> comment. Inferring "this is meant to be broken"
from surrounding prose silently removed coverage from correct blocks, so opting out is now deliberate and
greppable.
When you add or change an example, prefer fixing the field name over casting to any — the point of the
check is that the published example actually compiles.
MIT