Series: Replatforming a Subscription Platform · Part 2 of 10
- The Monolith Tipping Point: 6 Signs Your Platform Needs More Than a Patch
- Build vs Buy for Subscription E-Commerce: A Detailed Cost Analysis
- Transaction Fees: The Hidden Cost That Makes Platform Economics Counterintuitive
- How to Run a CTO Infrastructure Review That Stakeholders Actually Trust
- Multi-Repo vs Monorepo: A Practical Decision Framework for Small Teams
- TypeORM vs Prisma: Choosing Your ORM for a TypeScript Migration
- Platform Replatforming at Freddie's Flowers: The Decision Framework
- PHP to TypeScript: Why We Migrated a Production Subscription Platform
- Core Web Vitals as a Replatforming Success Metric: Real Before and After Numbers
- Serverless vs Containers vs EC2: Choosing Infrastructure for a Lean Engineering Team
Contents
The Question Every Growing E-Commerce CTO Eventually Faces
At some point in the lifecycle of any subscription e-commerce business, the architecture review becomes unavoidable. The original platform (whether Shopify, WooCommerce, or a custom build from the early days) starts showing structural limits. Features take longer. Workarounds accumulate. Engineers start dreading certain parts of the codebase.
The question that follows is almost always framed incorrectly: "Should we rebuild, or stick with what we have?" The better question is: "What is the right architecture for the business we are now, and the business we plan to be?"
This post documents how I've approached that question, including a detailed cost comparison that often surprises people.
Why Standard Retail E-Commerce Platforms Don't Fit Subscription Models
The fundamental problem with retail-focused platforms (Shopify being the dominant example) for subscription businesses is that the entire platform is designed around a different mental model.
Retail e-commerce is transaction-first: customer browses, selects, pays, done. The relationship ends at the confirmation email.
Subscription e-commerce is relationship-first: the customer signs up, and then you manage an ongoing, evolving relationship across dozens of interactions: skips, pauses, swaps, gift redemptions, dunning, reactivations, plan changes. The subscription lifecycle is the product.
This manifests in concrete capability gaps:
| Subscription Requirement | Platform Limitation | Consequence |
|---|---|---|
| Customer-based delivery scheduling | Not native: custom app required | Custom dev cost on top of platform fees |
| Skip / pause / swap / opt-in logic | Third-party plugins with limited flexibility | Plugin constraints, workarounds, multiple vendor dependencies |
| Zone-based routing and fulfilment | No concept exists natively | Entire workflow needs a custom app |
| B2B portal with custom pricing | Separate solution required | Additional SaaS cost and integration complexity |
| Weekly product cycle management | Static catalogue model | Misalignment with buying/operations workflows |
The Cost Analysis
In 2023, I ran a detailed cost comparison between a Shopify Plus + plugin stack and a hybrid bespoke solution (custom core + best-in-class SaaS for commodity capabilities). The specific numbers belong to the business, but the structure of the comparison is what matters:
| Cost Component | Shopify + Plugins | Hybrid Bespoke |
|---|---|---|
| Platform / infrastructure | Platform subscription | Cloud hosting (e.g. AWS) |
| Subscription management | Subscription app (e.g. Recharge) | Part of the custom build |
| CMS / landing pages | Theme and page-builder apps | Headless CMS |
| Fulfilment, referrals, cancellation flows | A separate app for each | Part of the custom build |
| A/B testing | Testing app | Experimentation tool |
| Transaction fees | A percentage of every order (third-party gateway) | None |
| Engineering | Smaller team, configuring and integrating | Larger team, building and maintaining the core |
The pattern that decided it: the custom build costs more in engineering, and that cost stays roughly flat as the business grows. The platform route costs less in engineering but adds a stack of plugin subscriptions and a transaction fee that grows with revenue. Past a certain scale, the fees alone outweigh the extra engineering, and the gap keeps widening.
The "Hybrid" Framing Is Important
The word "bespoke" triggers alarm in experienced CTOs, and rightly so. Fully bespoke systems are expensive, slow to build, and accumulate debt. The key is the hybrid model: build only what differentiates you, buy everything that doesn't.
| Capability | Approach | Rationale |
|---|---|---|
| Payment processing | Stripe + Braintree (SaaS) | Best-in-class, PCI-compliant: no competitive advantage in building this |
| Subscription / delivery logic | Custom | Core business logic: must be owned and controlled |
| CMS / landing pages | Builder.io (SaaS) | Marketing must move without engineers in the critical path |
| Email / SMS | Brevo (SaaS) | Commodity communications |
| Feature flags (frontend) | Statsig (SaaS) | Built-in statistical significance for A/B tests |
| Customer support | Dixa (SaaS) | Specialist tooling, integrated via API |
| Admin / ops tooling | Custom | Unique operational workflows requiring bespoke tooling |
The result is a system where engineering effort is concentrated on genuinely differentiated capabilities, while commodity capabilities are delegated to vendors who do them better.
When Platform Wins
To be fair: for businesses where the subscription model is simple (basic recurring billing, standard catalogue, no fulfilment complexity), Recharge on Shopify is a perfectly viable choice. If your model is "ship the same box every month", the platform economics look different.
The decision framework:
- Map your business model's capabilities that are not standard e-commerce
- For each, evaluate whether a platform plugin can meet your requirements without workarounds
- Build a genuine cost model including transaction fees. These are usually underestimated
- Make the decision on data, not instinct
The "just use Shopify" instinct is correct for many businesses. For subscription businesses with genuine operational complexity, it's usually wrong, and the numbers show it.
