Skip to content

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.

A bounded pull payment: tokens flow from a wallet to a recipient, but only up to a hard cap the on-chain program enforces on every transfer.

8cookbook recipes — every one compiles against the live @solana/subscriptions SDK
10on-chain gates each pull must clear before a single token moves
1single-file reference puller — the off-chain layer the program leaves to you
6token-extension mint types the SDK rejects that the docs imply work

What 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:

interactive — submit a pull against a $50/period cap

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);

See all eight recipes →

Three ways to grant a pull

Fixed allowance

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

Recurring Delegation

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

Subscription plan

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:

  1. 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 PermanentDelegate extension.
  2. It did not require a SIMD or any protocol change. It's an ordinary userspace program deploy — unrelated to Alpenglow or any consensus upgrade.
  3. 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.)
  4. "Unlimited approval" is not unlimited spending. Yes, the program's PDA takes a u64::MAX token approval — and yes, that's gated by hard per-delegation caps enforced on every transfer. The full explanation.
  5. It does not support native SOL. Token accounts only; wrap to wSOL if you must.

Find your way

Still have questions? The FAQ & Glossary answers the sharp ones.


Sources for every claim on this page: About → Sources.