DEV Community

Paul Crinigan
Paul Crinigan

Posted on

What Recurring Billing Actually Has To Handle

Subscription products look simple from the outside. A customer signs up, money arrives every month, and the same thing ships. The reason they are harder to build than they look is that almost none of that is a single event. It is a cycle, and every stage of the cycle has a failure mode that shows up as lost revenue rather than as an exception in your logs.

Subscription boxes are a useful example because the physical side makes the timing constraints obvious. The same shape applies to any recurring product.

The Billing Cycle Is A Batch Job

Normal ecommerce is event driven. An order arrives, you fulfill it, you move on. Subscriptions are not. Billing runs on a set date, usually the first or the fifteenth, and then everything downstream happens at once. In a box business that means a five to ten day window where every order for that cycle has to be picked, packed and shipped together.

That changes what your system has to be good at. Throughput matters more than latency. A queue that comfortably handles a trickle of orders will fall over when the entire subscriber base bills in the same hour. Supplier lead times have to be pinned to the billing date, not to demand. And any manual step in the pipeline gets multiplied by the number of subscribers, which is exactly the number you are trying to grow.

Design the batch first. Retrofitting a per order system into a batch system is the expensive version of this lesson.

Failed Payments Are A Product Problem

The most common way a subscriber leaves is not by clicking cancel. It is an expired card.

Involuntary churn is a real category, it is measurable, and it responds to engineering. Retry a declined charge on a schedule rather than once. Ask for a card update before the expiry date rather than after the decline. Treat a failed payment as a state the subscriber is in for a few days, not as an instant cancellation.

Every one of those is code, not marketing, and every one of them recovers revenue you already paid to acquire. If your billing logic treats a decline as terminal, you are silently canceling customers who never intended to leave.

Churn Has To Be Instrumented Early

The metric that decides whether the business works is lifetime value against acquisition cost, and you cannot compute it retroactively from a payments table alone.

Consider the arithmetic. A subscriber at $35 a month who stays eight months returns $280 from a single acquisition. If acquisition costs $25 and the goods in the box run $12 to $15, that is a healthy business. Drop average tenure to three months and the same business stops working, because nothing on the cost side moves to compensate.

So the events worth logging are the ones that predict tenure, not the ones that record it. Cohort by signup month. Track which cycle people leave on, because the drop is usually concentrated at a specific box number rather than spread evenly. Record the reason where you can capture one. A dashboard that only shows total active subscribers will look fine until the month it does not.

Fulfillment Costs Do Not Flex

The tempting assumption when modeling a subscription is that costs scale down when retention gets worse. They do not.

Curation, packaging and shipping cost the same per box whether that subscriber is on their second box or their twentieth. Packaging alone runs three to eight dollars at startup quantities because the unboxing is part of the product. Shipping is another five to ten dollars domestically. At five hundred subscribers, shipping by itself is a few thousand dollars a month.

None of that is elastic in the short term. Which is why retention is not a growth tactic bolted on later. It is the only variable in the model with real leverage.

The Takeaway

If you are building the software behind a recurring product, the useful mental model is a state machine with a clock, not a shopping cart with a repeat flag. Subscribers move between active, past due, recovered and churned, the clock moves them whether or not your code is watching, and money leaks at every transition you did not explicitly handle.

The full business side of this, the three subscription models, startup costs, sourcing, packaging, fulfillment and the recurring revenue math, is written up here: https://www.afcommerce.com/subscription-boxes/

Top comments (1)

Collapse
 
mihirkanzariya profile image
Mihir kanzariya

Sections one and three interact in a way the piece doesn't quite join up, and your state machine with a clock is what makes it visible. A decline on the 1st gets retried over the following couple of weeks, so the moment a subscriber is gone can land after the next billing date has passed. Which cycle they left on depends on which timestamp you stamp the churn with. Stamp it at the decline and you overstate churn on that cycle. Stamp it when the retries give up and you push the same subscriber into the following one. A cohort chart built without picking one deliberately shows a drop on a box number that is partly an artefact of the retry schedule.

Storing both timestamps on the subscription, first failure and finally called lost, keeps the question answerable either way. Do you treat one as canonical for reporting?