A subscriptions app that reacts to Shopify rather than racing it.
Miko Subscribe & Save sells recurring orders on any product, gives customers a passwordless portal to run themselves, recovers failed payments and scores churn from each store's own history. This page is about how it was built and what that means if you need something similar.
Subscriptions are won and lost after the sign-up
Most subscription tooling is built around acquisition: put a widget on the product page, capture the recurring order, count the win. But almost all of the revenue in a subscription programme is in month four and month nine, and that is decided by things nobody builds for. A card expires. Someone wants to skip once and cannot work out how. A customer drifts for six weeks with every signal sitting in the data unread.
So the brief was inverted: build the retention machinery first and treat the sign-up widget as the easy part. That decision shaped everything below.

Four decisions that shaped the build
Shopify owns the clock
The app does not decide when to charge. Shopify owns the subscription contract and the billing attempts, so the app is a state machine reacting to billing events. Every retry is keyed to Shopify's attempt and is idempotent against it, which is what stops a restarted worker charging twice.
No password, on purpose
The customer portal is a signed, short-lived, single-use link scoped to one contract. There is no credential to steal and a leaked link expires. Requiring an account puts a login in front of somebody who wants to skip one delivery, and that is exactly where cancellations happen instead.
Churn models are per store
Subscription behaviour in coffee looks nothing like supplements, so a shared model would be confidently wrong for most stores. Scoring runs on each store's own history, and where there is not enough history yet the app says so rather than showing an invented number.
The AI never sends anything
It drafts save offers and clusters cancellation reasons; a human approves before a customer sees anything. An AI emailing your customers unsupervised is a brand risk we were not prepared to ship, in our product or a client's.
Assistant access is scoped
The MCP server lets merchants run subscription tasks from ChatGPT, Claude or Copilot. The interesting part is scoping: narrow read and write permissions rather than a general admin token, because a broad token sitting behind a chat interface is a liability.
Safe to run twice
The rule the whole billing path is held to. Any handler must be safe to execute a second time on the same event, because in production it eventually will be. That single constraint removed an entire class of duplicate-charge bug before it existed.
The same problems turn up in client work
Recurring billing, a customer-facing self-service surface, and an automated decision that needs human approval before it reaches a customer. If your project has any of those shapes, this architecture transfers directly.
Shopify App Development
Public and private apps built to App Store standards: OAuth, verified webhooks, privacy endpoints and Polaris UI.
Shopify Plus Development
Checkout Extensibility, Shopify Functions and native B2B for brands that have outgrown the standard platform.
ERP Integration
Shopify to Odoo and Shopify to ERP sync with real error recovery, built on the same idempotency rules.
Questions we get about this build
Why build a subscriptions app when several already exist?
Because the ones that exist mostly optimise for signing customers up, and the money in subscriptions is almost entirely in keeping them. We wanted the retention machinery, payment recovery, save flows and churn signals, to be the product rather than an upsell tier bolted on later.
What is genuinely hard about subscriptions on Shopify?
You do not own the schedule. Shopify owns the subscription contract and the billing attempts, and your app reacts to them. That inverts the usual design: the app is a state machine responding to Shopify's billing events, not a cron job deciding when to charge. Getting that boundary wrong is the single most common source of duplicate charges in subscription apps.
How do you handle failed payments without double charging?
Every retry is keyed to Shopify's billing attempt, not to our own timer, and each attempt is idempotent against that key. If our worker restarts mid-cycle it re-reads state from Shopify rather than assuming what it did last. The rule we hold to is that the app must be safe to run twice on the same event.
The customer portal has no password. How is that secure?
It is a signed, single-use magic link with a short expiry, scoped to one subscription contract. There is no account to breach because there is no credential to steal, and a leaked link expires. The trade-off is that the link must be re-requested rather than bookmarked, which is the correct trade for a page a customer visits a few times a year.
Why not just use Shopify customer accounts for the portal?
For merchants already on new customer accounts we do. But requiring an account creates a login step in front of a customer who wants to skip one delivery, and that step is where cancellations happen instead. The magic link exists to remove a decision point, not to avoid building auth.
How does the churn scoring actually work?
It scores from the store's own order and engagement history rather than a global model, because subscription behaviour in coffee looks nothing like subscription behaviour in supplements. A shared model would be confidently wrong for most stores. The cost is that a new store needs some history before the scores mean anything, and we say so in the app rather than showing a made-up number.
Does the AI contact customers on its own?
No, and that was a deliberate constraint. It drafts save offers and clusters cancellation reasons, and a human approves before anything is sent. An AI that emails your customers unsupervised is a brand risk we were not willing to ship, for our own product or a client's.
What is the MCP server for?
It exposes subscription operations to AI assistants, so a merchant can ask ChatGPT, Claude or Copilot to look up a subscriber or move a delivery date. The engineering interest is in scoping: the assistant gets narrowly-scoped read and write access rather than a general admin token, because a broad token behind a chat interface is a liability.
Can you build something like this for us?
Yes, and this is the point of the page. If your problem involves recurring billing, a customer-facing self-service surface, or a workflow where an automated decision needs human approval before it reaches a customer, the architecture here transfers directly.
Do you build private apps as well as public ones?
Yes. A public App Store listing forces a higher bar on OAuth, webhooks, billing and privacy, so we build private apps to the same standard whether or not they are ever listed. The listing is a forcing function, not the goal.
How long does an app like this take to build?
A focused app with a defined scope is typically 8 to 16 weeks to a first public release. Subscriptions sits at the longer end because the billing edge cases and the recovery flows carry real money and cannot be shipped half-done.
What happens to the code if we commission an app?
It is yours. The app transfers to your Partner account, the repository comes with its history, and there is no licence fee to keep running it. We do not resell a client's custom build to the next client.
Do you handle Shopify's app review process?
Yes, including the parts that surprise people: mandatory privacy webhooks, billing that survives an audit, and listing assets that meet the image and wording rules. We have been through it repeatedly and know where submissions get sent back.
Can you work on an existing app rather than building new?
Yes. Taking over an app someone else built is common, and it starts with a read-only audit of what actually exists rather than what the previous team documented. You get that assessment in writing before any remediation is quoted.
What if we already have a subscriptions app and just want it fixed?
Then say so and we will look at it before proposing anything. If the honest answer is that your current app is fine and the problem is configuration, that is what we will tell you, even though it is worth less to us than a build.
How do we start a conversation about an app build?
Send the problem rather than the spec. What the business does, what is breaking, and what success would look like in numbers. You get a written response with a fixed-price range and a timeline, at no cost and with no obligation.
Have a recurring billing problem this shape?
Send the problem rather than the spec: what the business does, what is breaking, and what success looks like in numbers. You get a written response with a fixed-price range and a timeline. No discovery fee, no obligation.