Craft Commerce 5
Subscriptions that aren’t a Stripe feature
Craft Commerce ships with subscriptions, and they are thin: a local mirror of something Stripe is holding. The plan lives at the gateway, the schedule lives at the gateway, the retries live at the gateway, and a subscription cannot go in a cart. Subscribr does the opposite — the store owns the arrangement, and the gateway is asked one question, at renewal time: take this much money off this stored card.
Ask your gateway before you commit
Subscribr never asks whether a gateway “supports subscriptions” — that question has one affirmative answer in practice. It asks whether the gateway can charge a stored token with nobody present, which is true of very nearly every gateway written for Commerce. A gateway where it isn’t true still carries subscriptions: the renewal is raised as an unpaid order and the subscriber gets a link that drops it into your own checkout.
php craft subscribr/gateways
GATEWAY RENEWS SOURCES PURCHASE NOTE
Stripe automatic yes yes also a Commerce subscription gateway
Braintree automatic yes yes
Bank transfer manual no yes
Bank transfer: This gateway cannot store a payment method, so renewals are
raised as unpaid orders and the subscriber is emailed a link to pay them.
Features
The store owns the plan, the schedule and the retries — so all of it is yours to change, report on and reason about.
A renewal is a real order
Every cycle raises an ordinary Craft Commerce order element — not a record of one held somewhere else.
- Your tax, shipping, discounts and coupons
- Order statuses, emails and PDFs
- The order index, your reporting, refunds
- Every Commerce plugin you already run
One cart, both kinds
A recurring line is an ordinary line item carrying one option key, so a one-off purchase and a subscription go through the same basket and the same checkout.
- No bespoke cart, no second checkout
- Commerce de-duplicates on the options hash
- Trials and joining fees are adjustments, so the price stays honest
Boxes and build-a-box
Curated, subscriber-chosen or surprise. Slots with minimums, maximums and the purchasables they accept, priced by contents, flat, or base plus extras.
- Contents freeze a set number of hours before shipping
- A slot with no sources accepts anything, so nothing is silently unfulfillable
- Pro edition only
Skip, pause, swap
Self-service is mostly “do this next time”, not “do this now”. Bookings are rows consumed at the cycle boundary, which is what makes them reversible.
- Changing your mind means cancelling a booking
- A swap is pinned to one cycle and unpins itself
- Skip and swap are Pro; pause and cancel are in Lite
Proration, previewed
A plan switch shows the unused credit, the charge and the new billing date before anybody agrees to it — and the preview and the charge are the same object.
- A downgrade carries a credit rather than refunding a card nobody authorised
- The next date comes from the same Cadence the engine bills on
- Pro edition only
Dunning that recovers
Failed payments run a sequence you write, with the money currently at risk and the recovery rate on screen while it runs.
- A hard decline skips to the end instead of retrying a stolen card
- Fixing the card brings the retry forward to now
- Recovery is counted per subscription, not per attempt
Subscribr in the control panel
Real screens from a Craft 5 install running Commerce 5 — the subscriptions index, the dunning board, a subscription’s orders and ledger, and the plan that produced them.
Screenshots from a live install, not mockups.
Frequently Asked Questions
The questions worth answering before you install it.
Yes. Core Commerce asks one question of a gateway — does it implement SubscriptionGatewayInterface? — and in practice that has one affirmative answer. Subscribr doesn't use that element or that interface. It asks a smaller question: can this gateway charge a stored token with nobody present? Run php craft subscribr/gateways against your own install and it will tell you before you buy anything.
It still carries subscriptions. The renewal is raised as an incomplete order and the subscriber is emailed a link — incomplete because an incomplete order is a cart, and a cart has getLoadCartUrl(), which drops the subscriber into your own checkout with the renewal already in it. There is no bespoke payment page to build, and nothing to fix when you change gateway.
Yes, in one cart and one checkout. A recurring line is an ordinary line item carrying an option key. Commerce already de-duplicates line items on the purchasable ID plus a hash of their options, so the same product bought once and subscribed to monthly are automatically two separate lines.
Yes — a renewal is a Craft Commerce order. It appears in the order index, in Commerce's reporting, in your order status emails and PDFs, and in whatever other Commerce plugins you run. Your tax rules, shipping methods, discounts and coupons apply to it exactly as they do to any other order, because it goes through Commerce's own recalculation.
Nothing is lost and nobody is double-billed. Renewals more than renewalCatchUpDays (seven by default) past due are abandoned rather than charged, and the skipped cycles are written to the ledger. The next payment date is always computed from the date that was due rather than from now, so a sweep that runs late doesn't walk anybody's billing day forward.
No, and deliberately not. Dunning is in Lite. A store whose cards decline still needs its money, and a store that cancels on the first failed payment is throwing away customers who would happily have paid. Pro adds named sequences, so different plans can be chased differently.
Lite is a complete, working subscription plugin: plans, renewals on any gateway, mixed carts, trials and joining fees, pause, cancel and reinstate, dunning, the subscriber portal, emails, and manual renewal for gateways that can't store a card. Pro adds subscription boxes and build-a-box, skip, swap, prepaid plans, gift subscriptions, plan switching with proration, and named dunning sequences per plan.
The Pro features stop, and they stop honestly. The feature gates read the edition rather than a stored setting, so an install that can no longer edit a Pro configuration doesn't keep obeying one — a box plan whose slots had become unreachable would otherwise ship whatever it liked. The settings screen tells you which of your settings have been suppressed rather than leaving it to a support ticket.
No. Working templates for the whole portal ship with the plugin — copy them into templates/subscribr/portal/ and yours take precedence. craft.subscribr.can(subscription) returns what this subscriber may do right now, with the plan's rules, the edition and the change window already resolved, so a button is never rendered for something the controller would refuse.
Yes, by handle: php craft subscribr/plans/export and php craft subscribr/plans/import. Plans live in the database rather than project config — the same call Commerce makes for its own plans, and for the same reason: a plan can point at a box, and a box points at purchasables whose IDs mean nothing in another environment.
Two editions, both of them complete
Lite is $99 with a $79/year renewal and is a working subscription plugin on its own — plans, renewals on any gateway, mixed carts, trials, pause and cancel, dunning, the portal and emails. Pro is $199 with a $159/year renewal, and adds boxes, skip, swap, prepaid, gifts, plan switching with proration and named dunning sequences.