perfectdesign.

Commerce workflows

Subscription e-commerce development

Recurring revenue is a promise you have to keep on a schedule. The build that matters is the one handling the renewal nobody is watching, not the first payment.

In short

A subscription store takes its first payment the same way any store does. Everything difficult happens afterwards and on a schedule: a renewal that has to be attempted, a card that expired since sign-up, an access period that ends at midnight, a box that ships whether or not the invoice cleared. Scope it by writing down the recurring agreement, then deciding separately what happens to billing, to access and to fulfilment when a renewal fails, a customer pauses, or somebody cancels halfway through a period they have already paid for.

Written for a business owner or e-commerce lead scoping a recurring-purchase workflow before committing to a build · 8 min read

The hard part is the lifecycle, not the checkout

The fit test for a subscription project is not whether customers buy from you repeatedly. It is whether you are agreeing to bill them again on a schedule and to deliver something for each of those periods. That agreement is the thing being built. The checkout that starts it is the smallest part of the work, and treating it as the project is why so many of these builds are finished and then quietly unusable.

A managed recurring agreement differs from repeat purchase, where the customer decides again each time, and from a saved reorder, where they press a button when they run out. It decides once and runs until somebody changes it. So the planning sequence follows the agreement: the offer, the first purchase, each recurring payment, the delivery or access for that period, the failed renewal, the pause, the cancellation and the refund.

Platform choice, catalogue structure and the shared order chain belong to e-commerce website development. This page covers the recurring workflow only. Said plainly at the start: subscription and recurring billing is a custom build scoped to how your business operates, not an off-the-shelf package we resell. If a subscription extension on the platform you already run covers what you need, that is usually the cheaper answer and we will say so.

Online banking carries Malaysian checkouts. FPX is the rail Malaysian buyers reach for first. A store that hides it behind a card form is choosing the more expensive, less familiar option for its customers. A full text version follows.

Online banking carries Malaysian checkouts

Published statistic. FPX is the rail Malaysian buyers reach for first. A store that hides it behind a card form is choosing the more expensive, less familiar option for its customers.

Source: Bank Negara Malaysia: Payment Statistics, Table T3 Payment Systems. Reviewed .

Read the graphic as text
  • 2020: 367m.
  • 2021: 639m.
  • 2022: 646m.
  • 2023: 714m.
  • 2024: 826m.
  • 2025: 956m. RM465 billion

Chart scale: FPX transactions per year, in millions.

Download this infographic (SVG)

Write the recurring agreement down before choosing features

Nearly every later argument traces back to a line nobody wrote down. Record eight things: what is subscribed, and whether that is goods, access or both; the price basis; the cadence; when it takes effect; the renewal rule; what the customer may change; what you may change and with how much notice; and how either side ends it. None of it is technical. All of it decides what gets built.

Then separate two dates people assume are one. The billing date is when you take money. The fulfilment or access date is when the customer receives something. They can be deliberately different: bill on the first, dispatch on the tenth, end access at the close of the paid period rather than the moment a card fails. That relationship is an explicit decision, not a consequence of setting up a recurring charge.

Then answer the question that shapes most of your exception handling. What happens to an order that already exists, or a period already paid for, when a future renewal is changed or cancelled? A cancellation on the twenty-eighth of a paid month is not the same event as one on the second. Both answers are defensible. Only one can be the rule your system enforces, and support has to know which.

Deliveries, access, or both

A physical subscription inherits everything a shop has and adds a schedule: what ships each cycle, whether the contents vary, how stock is reserved against a known dispatch run, and what happens when a subscriber's parcel goes missing. An access subscription adds entitlement instead, meaning the permission a paid period grants: what opens, when it closes, and what the customer sees the day after. Combined offers need both, and should not share one state.

Three things people call a subscription. Only the third commits you to billing and delivering on a schedule, and that is the build. A full text version follows.

Three things people call a subscription

Editorial framework. Only the third commits you to billing and delivering on a schedule, and that is the build.

Basis: Stripe: Subscriptions overview. Reviewed .

Read the graphic as text
  • Repeat purchase. The customer decides again every time
  • Saved reorder. They press a button when they run out
  • Recurring agreement. Decided once, runs until somebody changes it
Download this infographic (SVG)

Billing, entitlement and fulfilment are three states, not one

The most useful decision on a recurring build is to stop treating paid as a synonym for served. Give the agreement, the payment for a period, the entitlement and the dispatch each their own source of truth, then name who is accountable when they disagree. Sooner or later they will.

Stripe's subscriptions documentation, read on 19 September 2026, illustrates that separation. It states that creating a subscription which requires an immediate payment also creates an Invoice and a PaymentIntent, that the subscription starts incomplete and becomes active once the first invoice is paid, and that an active subscription creates an active entitlement for each feature of the subscribed product. Those are Stripe-specific behaviours on the day we read them, varying by provider, payment method and configuration. The structural point transfers: payment, subscription and access are separate records that can contradict one another.

WooCommerce's order documentation, read the same day, supplies the operational half: orders are usually created at checkout, can be added manually from the admin dashboard, can also be created by external systems through its REST API, and test orders matter for checking new flows and integrations. That is a WooCommerce example, not evidence about any particular build, and the shape still transfers. Every renewal creates an order somebody must be able to find, correct and test.

The table works one fictional example through that sequence, a monthly physical-product subscription. Every role, rule and response is an assumption made for illustration, and the last column lists tests still to run rather than results being claimed.

A fictional monthly physical-product subscription, worked through three steps
Workflow stepAssumed actorProposed system responseExceptionAcceptance evidence to collect
Start a subscriptionAssumed customerAgree the recurring offer and create linked subscription, payment and order recordsAn incomplete first payment must not be treated as a successful first shipmentInitial payment, subscription state and order-state tests recorded together for one customer
Renew for the next periodAssumed billing ownerReconcile that period’s recurring invoice against that period’s fulfilment decisionA failed renewal follows the agreed grace and retry policy instead of silently shipping or silently stoppingInvoice, retry and duplicate-fulfilment observations across two consecutive cycles
Cancel a future renewalAssumed customer and support ownerRecord the effective date and handle any existing order or paid period separatelyA disputed charge, or a parcel already despatched, needs the agreed exception policy and a named decision-makerCancellation timing, access-end and reconciliation tests tracing the money and the goods to one record
What a card payment costs, as published. The headline rate is half the decision. Settlement speed, the online banking fee and what a plan upgrade costs decide what you actually keep. A full text version follows.

What a card payment costs, as published

Published statistic. The headline rate is half the decision. Settlement speed, the online banking fee and what a plan upgrade costs decide what you actually keep.

Source: toyyibPay pricing plans. Reviewed .

Also: Billplz pricing.

Also: Curlec by Razorpay pricing.

Also: Stripe Malaysia pricing.

Read the graphic as text
  • toyyibPay: 1.50%. Cards carry a RM100 onboarding fee
  • Billplz: 1.80%. 1.5% on the paid plan
  • Curlec: 2.40%. 2.00% on the premium plan
  • Stripe: 3.00%. Plus RM1.00 per transaction

Chart scale: Domestic card rate on the entry-level plan, read from each gateway on 18 September 2026.

Download this infographic (SVG)

Failed renewals, and the part that is a commercial decision

A renewal fails quietly. Nobody is on your website, no error page appears, and the first to notice is usually the customer who lost access or never received a delivery. So design the failure path in advance: detect the billing result, apply the agreed retry or grace policy, tell the customer something they can act on, decide what happens to access and to delivery, then reconcile the records.

Stripe documents one version of that machinery: listen for the payment-failure event, monitor for the subscription moving to past due or unpaid, configure smart retries or custom retry rules, and choose in the failed-payment settings what happens after the final retry. It also states that when a subscription is unpaid, payments are no longer attempted and access should be revoked. That is one provider's documented behaviour, dependent on configuration and payment method, not a universal retry policy.

No documentation answers the commercial question underneath. How long do you keep serving somebody whose payment has failed? Serve too long and a dunning problem becomes a debt you will not collect. Cut too fast and you lose a good customer whose bank simply reissued a card. Write the number down, name who may override it, and let whoever answers the message see that state first.

Pause, cancel and proration are four questions, not one

Pausing collection, pausing the service, stopping future renewals and ending a period already paid for are four policies that people collapse into one word. Stripe treats pausing payment collection as its own operation and reserves its paused status for a trial that ended without a payment method, while its cancellation is terminal: the documentation says a customer who wants to resubscribe needs to supply new payment information for a new subscription. Decide your version of each, then decide which of them a customer may do at two in the morning without asking anyone.

Proration is where mid-cycle changes become expensive to explain. Stripe's prorations documentation describes the standard mechanic, a credit for unused time on the old price and a charge for the remaining time on the new one, and notes that negative prorations are not automatically refunded and positive ones are not immediately billed, although both can be done manually. It documents three settings controlling that behaviour and calculates prorations to the second. Your decision is not the setting. It is what the customer is told, because a credit they cannot see looks exactly like a billing mistake.

Some of this is ordinary self-service. Seeing the next renewal date, updating approved details and requesting a pause are account tasks; once identities, roles, documents or approvals are involved you are building accounts and portals. The stored payment method, the order record and the refund route belong with payment and checkout, and whether a gateway supports recurring charges, retries, authentication and refunds the way your plan needs has to be checked against its current documentation.

The renewal that fails quietly. How long you keep serving an unpaid customer is a commercial decision no documentation makes for you. A full text version follows.

The renewal that fails quietly

Primary-source guidance. How long you keep serving an unpaid customer is a commercial decision no documentation makes for you.

Source: Stripe: Smart retries. Reviewed .

Read the graphic as text
  • Detect. The payment failed and nobody is on the site
  • Retry. On a configured schedule, not by hand
  • Tell the customer. Something they can act on today
  • Decide access. Grace period, or revoke on the final retry
  • Reconcile. Billing, entitlement and dispatch agree again
Download this infographic (SVG)

Turning the workflow into a scope somebody can be held to

Organise the scope around what has to be agreed rather than around features: customer tasks, operational roles, each record and where it lives, the integrations and their permissions, the notifications, any migration of existing subscribers, the normal path, the exception paths, the acceptance evidence for both, and who owns each part after launch. Whether the answer is configuration, one integration or a custom build follows from those constraints rather than being decided first.

  • The recurring offer as you would explain it to a customer, including what varies between cycles.
  • Who uses it: subscribers, whoever fixes billing, whoever packs the box or grants the access.
  • What you run today, and where subscriber, payment and order records live now.
  • Your answers on grace periods, pauses, cancellation effective dates and refunds.
  • The exceptions you handle by hand today, and who decides them.
  • Any constraint that cannot move: a launch date, an existing gateway, an accounting package that has to balance.

The nearest thing in our own work is VITALE, and it is worth being exact about it. VITALE is a concept prototype of a direct-sales back office. It is not client work and it is not a subscription store: nobody buys a plan and receives a box in it. What it demonstrates is recurring machinery, which is the hard half of this page. It runs a deterministic, re-runnable commission cycle producing the same payouts every time, and carries an autoship list with next billing dates against active, paused and dunning states.

What the regulator caps a card at. Local rails are cheaper by regulation, not by luck. It is why a gateway can offer a ringgit per online banking payment and never the same on a credit card. A full text version follows.

What the regulator caps a card at

Published statistic. Local rails are cheaper by regulation, not by luck. It is why a gateway can offer a ringgit per online banking payment and never the same on a credit card.

Source: Bank Negara Malaysia: Payment Cards Framework, interchange fee ceilings. Reviewed .

Read the graphic as text
  • Domestic debit: 0.10%. Or RM0.37, whichever is lower
  • International debit: 0.27%.
  • International prepaid: 0.39%.
  • Credit card: 0.60%. Six times domestic debit

Chart scale: Interchange fee ceiling set by Bank Negara. Interchange is the largest component of what a merchant pays, not the whole of it..

Download this infographic (SVG)

Talk to us about a subscription build

Bring the offer, the people who use it, the systems you already run, what has to be delivered or unlocked each period, the exception rules you apply today and any constraint that cannot move. Send that as a scoped enquiry and we will tell you which parts look ready to build, which need a policy decision from you first, and where we would start.

What you get

What is actually delivered

01

The recurring agreement, written down

What is subscribed, the price basis, the cadence, the effective start, the renewal rule, what each side may change and the conditions on which it ends.

02

Separate billing, entitlement and fulfilment states

A source of truth for each, the transitions between them, and the accountable owner for when the payment record and the delivery record disagree.

03

A designed failure path

Detection, the agreed retry or grace policy, the customer message, the access decision, the delivery decision and the reconciliation that follows each failed renewal.

04

Pause, cancel and change rules

Pausing collection, pausing service, stopping future renewals and ending a paid period treated as four policies, with the ones a customer may apply themselves marked as such.

05

Mid-cycle change handling

Upgrades, downgrades and quantity changes with an agreed proration position, and wording that explains the resulting charge or credit in terms a customer accepts.

06

The operational side

The subscriber list your team works from, the states visible before anyone answers a message, and the manual overrides support genuinely needs.

07

Integration boundaries

What the gateway, the order records, the entitlement and any accounting system exchange, in which direction, and what happens when one of them is unavailable.

08

Acceptance evidence and handover

Two consecutive cycles exercised including a failed renewal and a cancellation, then the code, the data and every service account handed over in your business name.

How it runs

Agreement first, then the states, then the screens

Recurring builds fail on policy rather than interface. We settle the agreement and the exception rules in writing, then build the states that enforce them.

  1. 01

    Define the agreement

    We work through the offer, the cadence, what each side may change, the termination conditions and the relationship between billing dates and delivery or access dates.

  2. 02

    Map the states and their owners

    Subscription, payment, entitlement and order are separated, each given a source of truth and an accountable owner for the moments they disagree.

  3. 03

    Agree the exceptions

    Failed renewals, grace periods, pauses, cancellation effective dates, refunds and mid-cycle changes are decided as policy, including who may override each one.

  4. 04

    Prototype the journey

    You click the real sign-up, renewal, pause and cancellation on a live link, with the operator view beside it, before anything is committed.

  5. 05

    Build, then test the cycles

    We build the approved scope, connect the systems whose access and terms are confirmed, and exercise consecutive cycles including a failed renewal and a late cancellation.

  6. 06

    Hand over

    Code, data and accounts go to you, with the test traces and policy decisions documented so the next person inherits the reasoning as well as the system.

Proof

Work you can click through

VITALE is a concept prototype of a direct-sales back office that we built ourselves. It is not client work and it is not a subscription store. It appears here for the recurring machinery it genuinely demonstrates: a deterministic, re-runnable commission cycle producing repeatable payouts, and a customer autoship list carrying next billing dates against active, paused and dunning states. No client outcome is implied.

Concept prototypes are labelled as prototypes everywhere they appear. They demonstrate what we can build, not work delivered for that named client. More client work is going live and will be added as it does.

How we work

The parts people ask about before they commit

How we build

React first, other languages when a project needs them

We build in React by preference, on both web and mobile, and we work in other languages when a project genuinely calls for it.

Timeline

Project dependent, and often quicker than expected

Timelines are project dependent. A focused build can go live in about a week, while a larger platform takes longer once scope is agreed.

Ongoing care

Quoted with the project, not bolted on

For a more complex website or a system with a real backend, ongoing care starts from RM 250 a month, with the plan confirmed against what was actually launched. Care is quoted with the project, not bolted on afterwards.

Getting hold of us

Normally under one working day

We normally respond to a support request in under one working day, and we work to solve problems as fast as we can. That is how we normally work rather than a contractual guarantee, and responding is not the same as resolving. If your operation needs a formal response or resolution commitment, we can write one into your scope.

Ownership

Everything belongs to your business

You own everything we build for you: the code, the content, the domain, the hosting account and every third-party account opened for the project. There is no lock-in. If you move to another provider, everything goes with you and we help with the handover.

  • Source code, handed over in your own repository
  • Domain and DNS, registered to your business
  • Hosting and every service account, in your name
  • Analytics, search and ad accounts, with us as a manager you can remove
  • All content, media and data in the system

Questions

Asked about subscription commerce

Straight answers to what people ask before they commit. Anything else, message us.

Is this a subscription product you resell?

No. Subscription and recurring billing is a custom build scoped to your offer, your policies and the systems you already run. If a subscription extension on your current platform genuinely covers what you need, that is usually cheaper and faster, and we would rather say so while scoping than bill you for a build you did not need.

What does a subscription build cost?

Our published website and store packages are on the pricing page, and a recurring build is quoted against the scope we agree. What moves the number is how many exception rules have to be enforced, whether you deliver goods as well as access, and how many existing systems have to stay in step.

What happens when a renewal payment fails?

Whatever you decide, written down in advance. The workflow has the same shape everywhere: detect the result, apply your retry or grace policy, tell the customer, decide what happens to their access, decide what happens to their delivery, then reconcile. The part only you can answer is how long you keep serving somebody whose payment has failed, and who may override that.

Can customers pause or cancel by themselves?

They can, and it is worth deciding carefully which of those actions they hold. Pausing collection, pausing the service, stopping the next renewal and ending a period already paid for are four different policies. Self-service reduces support load and removes a conversation you might have wanted to have, so we scope it deliberately rather than by default.

How do mid-cycle upgrades and downgrades get charged?

That is a proration decision and it is yours to make. The usual mechanic credits unused time on the old price and charges for the remaining time on the new one, but whether the difference is billed immediately, held to the next invoice or waived is a policy question. The wording the customer sees matters as much as the calculation.

Can you migrate our existing subscribers?

Usually, and it needs its own planning. Live agreements, stored payment methods, renewal dates and paid-up-to dates all have to arrive intact, and stored payment credentials in particular are constrained by what your current and future providers allow. We confirm what can actually move before anything is promised.

Which gateway should we use for recurring payments?

We are provider agnostic and build against the one you choose. Check recurring support, retry behaviour, customer authentication, refunds and settlement against that provider’s current documentation, because this is the part of a gateway comparison that changes most often and a general feature list will not settle it.

Where to go next

Sources

Tell us what you need built

We will show you the closest thing we have already built, then scope the real version against your requirements.