Solana Subscriptions: The Integrator's Field Guide
A practitioner's field guide to Solana's native subscriptions & allowances program — the Cantina-audited on-chain primitive for bounded, revocable pull payments. Every recipe in the cookbook compiles against the published @solana/subscriptions SDK, it ships a single-file reference implementation of the puller layer the program deliberately leaves to integrators, and it flags one thing the official docs get wrong: the SDK rejects six token-extension mint types the docs imply are supported.

@solana/subscriptions SDKWhat this program is, in three sentences
Solana Subscriptions is a standalone, Cantina-audited on-chain program — program ID De1egAFMkMWZSN5rYXRj9CAdheBamobVNubTsi9avR44 — built by Moonsong Labs with the Solana Foundation and live on mainnet since roughly June 3, 2026. It lets a user grant a bounded, revocable permission for someone else to pull tokens from their wallet — fixed allowances, recurring delegations, or merchant subscription plans — without the user signing each payment. The program enforces every limit on-chain at transfer time, but it never initiates anything: somebody (you, the integrator) has to run the infrastructure that actually triggers each pull.
See the cap enforced — on every pull
The program never trusts the puller. It re-checks the per-period cap on-chain, at transfer time, and reverts anything over the line — returning AmountExceedsLimit (300) no matter who submitted it. Drag a pull amount and submit one:
Enable JavaScript for the interactive simulator. The idea: a recurring delegation carries a hard per-period cap (here, $50). A puller may submit any amount it likes — but the program rejects, on-chain, anything that would exceed the cap remaining this period, returning AmountExceedsLimit (300). No off-chain trust required.
What an integration actually looks like
The SDK ships as a @solana/kit plugin, so every flow is one instruction builder away. Here's a merchant collecting one period's charge — lifted straight from the cookbook, where every snippet is compile-checked against @solana/subscriptions@0.3.0:
// A puller collects one period's charge. Before a single token moves, the
// program re-checks the cap, the destination allowlist, expiry, and that the
// subscription is still active — on-chain, at transfer time.
const result = await client.subscriptions.instructions
.transferSubscription({
amount: 9_990_000n, // base units, <= the plan's per-period cap
delegator: SUBSCRIBER,
planPda: PLAN_PDA,
subscriptionPda: SUBSCRIPTION_PDA,
receiverAta: TREASURY_ATA, // must be on the plan's destination allowlist
tokenMint: USDC_MINT,
tokenProgram: TOKEN_PROGRAM_ADDRESS,
})
.sendTransaction();
console.log('pulled, sig:', result.context.signature);
Three ways to grant a pull

Fixed Allowance
One cumulative cap that never refills — a hard budget for an AI agent or a one-shot spend limit. Fixed Allowances →

Recurring Delegation
A capped amount that refreshes each period — payroll, contractors, revenue shares. Recurring Delegations →

Subscription Plan
Merchant-published terms a customer subscribes to once — SaaS-style recurring billing. Merchant Quickstart →
Who this guide is for
- Merchants and SaaS teams wiring up recurring billing in stablecoins — start with the Merchant Quickstart.
- Teams paying out — payroll, contractors, revenue shares — see Recurring Delegations.
- AI-agent builders giving an agent a hard spending budget — see Fixed Allowances.
- Infrastructure operators who will actually run the pull side — the page nobody else writes: Running a Puller.
Common misconceptions — read this before anything else
Most early coverage of this program got at least one of these wrong:
- It is not a Token-2022 extension. It's a standalone program that works with SPL Token and Token-2022 via CPI. Don't confuse it with the
PermanentDelegateextension. - It did not require a SIMD or any protocol change. It's an ordinary userspace program deploy — unrelated to Alpenglow or any consensus upgrade.
- There is no built-in scheduler or crank. The program validates pulls; it never triggers them. If nobody submits the pull transaction, no payment happens. (Clockwork, the old keeper network, is dead — this gap is yours to fill. We document how.)
- "Unlimited approval" is not unlimited spending. Yes, the program's PDA takes a
u64::MAXtoken approval — and yes, that's gated by hard per-delegation caps enforced on every transfer. The full explanation. - It does not support native SOL. Token accounts only; wrap to wSOL if you must.
Find your way
-
Concepts
The mental model: who authorizes what, the three PDAs, and the three delegation primitives.
The Authorization Model · Accounts & PDAs · The Three Primitives
-
Guides
End-to-end walkthroughs with real SDK calls — plans, payroll, AI budgets, and running pull infrastructure.
-
Reference
Instruction discriminators, events, failure modes, and the token-compatibility matrix.
-
Security
What actually stops over-pulling, what merchants can and cannot do, and the precise audit status.
Still have questions? The FAQ & Glossary answers the sharp ones.
Sources for every claim on this page: About → Sources.