Recurring payments · on Ethereum

Stripe subscriptions,
on-chain.

Card-style autopay for crypto: your customer authorises once, then you charge a fixed amount each period — straight from their wallet. Non-custodial, censorship-resistant, and final. No processor, no chargebacks, no middleman holding the funds.

Try the live demo → Read the docs
Coming to mainnet in v2 · pending re-audit · live on Sepolia to try
How it works

Three moving parts

Nothing is escrowed. The money stays in the customer's wallet until each charge — exactly like a card on file.

01

Authorise once

The customer approves the amount and signs up for the plan — a one-time on-chain authorisation. The merchant address is fixed and can never be changed.

02

Charge each cycle

Each period the merchant pulls the fixed amount from the customer's wallet. Charge upfront or on a set date; a future start makes a built-in free trial.

03

Cancel or renew anytime

The customer cancels whenever they want; the merchant can extend the term to renew. A fixed term is required up front (no forever-authorisations).

Familiar

Everything you expect from a subscription

The card mental model maps one-to-one — without a card network in the middle.

Subscription featureHow Vektes does it
Card on fileThe customer authorises once with a standing on-chain allowance — no card, no vault.
Charge on a scheduleThe merchant charges a fixed amount each period, pulled from the customer's wallet.
Free trialSet the first charge in the future — the trial period is built in.
Fixed term & renewalEvery plan has a required end date; the merchant can extend it to renew.
Declined payment → retryIf a wallet is short one cycle, the charge is resumable — it collects what it can and retries next time.
No runaway back-chargesA grace cap means a long-dormant plan can never be drained for months of arrears at once.
Cancel anytimeThe customer cancels on-chain; unclaimed cycles are forfeited — no surprise final bill.
Why on-chain

What a processor can't give you

Non-custodial

Funds never leave the wallet early

No processor or escrow holds the money. Each charge moves value directly from customer to merchant, at charge time.

Final

No chargebacks, no clawbacks

Settlement is final. A collected charge can't be reversed by a third party — predictable revenue, no dispute roulette.

Open

Censorship-resistant

No account to freeze, no gatekeeper to de-platform you. It's a public smart contract anyone can integrate.

Global

Anyone with a wallet

No merchant onboarding, no card-network geography, no chargeback reserves. Stablecoins in, settled on Ethereum.

Transparent

Every charge on-chain

Auditable billing by construction — plans, charges, cancellations are all verifiable events, not a black-box dashboard.

Composable

A primitive, not a silo

Any app can create plans and charge them. Build your own billing UX on top; the settlement layer is shared and neutral.

Straight talk

What it is — and isn't

It's a direct debit, not a credit card. Funds must exist in the customer's wallet at charge time — there's no credit line and no chargeback path. That's the trade for finality and self-custody.

Fixed price, stablecoins, one merchant. Today it's a fixed amount per period in a curated ERC-20 (or ETH), to a named recipient. Usage-based / variable billing is a future extension.

The merchant charges; the customer stays in control. The customer authorises up front, can cancel anytime, and older uncollected cycles lapse automatically — so a plan can never quietly accumulate a giant bill.

For developers

Four functions

A plain smart-contract interface — no SDK required. Create a plan, charge it each cycle, extend or cancel.

// customer authorises a plan (fixed amount per period, required end date)
createAllowance(token, merchant, amountPerPeriod, periodLength, startTime, endTime, maxArrears, planCode)

// merchant charges the cycles due (resumable, capped by maxArrears)
claimAllowance(customer, merchant, planCode)

// merchant renews by pushing the end date out
extendAllowance(merchant, planCode, newEndTime)

// customer (or merchant) cancels — no further charges
cancelAllowance(merchant, planCode)