Vitamin or painkiller: the Shopify app with five stars and no revenue
August 2, 2026
Last week a developer posted a postmortem in r/shopifyDev for a Shopify app that didn't work out. Six numbered lessons, real figures attached, and the whole codebase open-sourced at the end so the next person has something to read. Most people who pay that kind of tuition never write it down.
Two of those figures sit a line apart. Thirty-one merchants use the app. Between them they pay $17.50 a month, about fifty-six cents each. It has a five-star rating.
Five of the six lessons are about tactics: Instagram DM folders, over-personalized outreach, app review delays, perfectionism, SEO rankings. The sixth is "just a vitamin, not a painkiller." It's the only one that accounts for what happened, and it's filed last.
This isn't a correction. The post already contains its answer. I just want to move it to the top and work out why it ended up at the bottom, because that part is the useful bit for anyone deciding what to build next.
Seven weeks in review, then 300 messages
Shopify announced it was killing LinkPop, its own link-in-bio product. The builder saw the gap, pivoted an existing project into a Shopify app, and submitted it. Review dragged past seven weeks, partly because the reviewers couldn't decide whether it counted as a Sales Channel. By approval, LinkPop was gone and the leads had gone cold.
They sent the 300 DMs anyway. Custom videos. Pre-built link-in-bio pages made with their own tool, so a merchant could see their own finished page before installing. Two people replied. Both of them bought.
That's where the 31 merchants came from and where they stopped.
The builder read 2-out-of-300 as a visibility problem: Instagram buries stranger DMs, and heavy personalization eats hours better spent on volume. Both true. But think about what was in those messages. Not a generic pitch, a video made for one merchant plus a working version of the product with that merchant's own products in it. When someone has a live problem, a message like that gets answered, and not politely either. People with a burning problem check weird folders. They reply to emails from strangers. They answer at midnight, because the thing is costing them money that week. A bad channel pushes a reply rate down, but it can't account for two out of three hundred on outreach that good.
And both replies converted. Two people, so the percentage is worthless, but nobody who engaged bounced off the product.
The inference is soft on its own: anyone who has run outreach on a painful problem and seen sub-1% replies would be right to push back. It holds because it doesn't stand alone: the builder later spent Shopify's $100 in ad credits, got a few installs, and watched growth stop the day the credits ran out. The revenue number agrees with both.
A visibility problem and a demand problem produce the same dashboard, which is what makes this so hard to see from the inside. Only one of them improves when you fix the channel.
Fifty-six cents a merchant
Back to those two numbers, because they measure different things and people mix them up. The rating measures whether the product works. The revenue measures whether it mattered. People like it, they'd keep it if it stayed free, and almost nobody pays real money because nothing bad happens without it.
A painkiller earns differently. Nobody agonizes over whether shipping software is worth $29 a month, because the price gets compared to orders that don't ship rather than to zero.
The builder wrote "users set it up once and forget" as a compliment, and as a product observation it is one. Here it meant nobody had a reason to think about the app again, including at renewal.
First place in an empty room
The app ranks top five for every major link-in-bio keyword and gets almost no traffic. Lesson 5 says rankings mean nothing if nobody's searching, and that deserves promotion too. Rank is a share of something, and if the something is small, first place is worth about what fifth place is worth. The builder even names the mechanism: a merchant who does feel this need reaches for Linktree, free and already on their phone.
Which brings up the trap I watch indie builders walk into most often. The category had no serious paid competitor, which reads like an opening and almost always means the opposite. If you've found an easily built, obviously useful category where nobody is charging, several people probably got there first, found that merchants would install it and not pay, and moved on without writing anything down.
Empty markets are usually empty for a reason.
Run it back with everything fixed
Lessons 1 through 5 are good observations. Instagram really does bury DMs. Over-personalizing really does burn hours and often converts worse than a short blunt hook. Seven weeks of review really did kill the LinkPop window.
So run the counterfactual. Review clears in five days, the DMs land in the primary inbox, the outreach is three lines instead of a custom video. What changes? The app arrives sooner at a market where the pain doesn't exist and the free default is already installed. More people install it, and roughly the same number pay fifty-six cents. Tactics change the slope. Demand sets the ceiling.
I'm not psychoanalyzing a stranger here, because I've written that list myself. Not that exact one, but the shape of it: a tidy set of true, fixable reasons a thing didn't work, assembled carefully enough that I never had to ask whether anyone wanted it. Every reason on it was real. The list is easy to write because tactical lessons let you keep the work. Timing, copy, onboarding, channel, each implies a better next attempt with the same asset. "I picked a market with no pain in it" implies the months are gone. The cheap conclusion gets written first and the expensive one ends up at number six.
What I check before writing code
Diagnosis after the fact is cheap.
So now I look for someone already charging money for a worse version. Not a free tool, an actual business collecting card payments for something clunkier than what I plan to build. Open the app store, filter the category, sort by review count, read the complaints on the paid plans. A complaint about a paid product is the best demand signal available, because someone already voted with a card and is annoyed enough to write about it. If everything in the category is free, that's the price the category has settled on.
Then I check search volume instead of winnable rank. Confirming I could rank for a term is easy, and it's the wrong question. What matters is how many people type it in a month, and whether they describe the problem in the words I'd use. If merchants aren't asking about it in their own language anywhere, ranking first puts you first in an empty room.
The third one needs real people to ask: what would you do on Monday morning if this vanished overnight? Painkiller answers are specific and unhappy. They miss a filing deadline, they do it by hand for two hours, they eat a fine. Vitamin answers are calm. "I'd probably go back to how I did it before" is a complete answer and it's a no. What I'm really listening for is a date or a consequence in the buyer's world: a regulator, a launch, a seasonal cutoff, an audit. If nothing forces the decision this week, it moves to next week permanently, which is how most decent products die without ever getting a real no.
My own four, honestly sorted
LabelKit clears the bar without much argument. It generates compliant ingredient and nutrition labels for wine and food merchants out of their existing product data. The alternative to buying it is regulatory exposure, and there's a date attached, because the label is needed when the product ships. "Design beautiful labels" is a vitamin sentence, and only the compliance version of it supports real money.
PickWhen is local-pickup scheduling for Shopify merchants, with wine as the lead vertical. The thing I like most about it would have discouraged me a few years ago: there's already an incumbent, Pickeasy, charging for it. Merchants pay for pickup scheduling today. That's the demand proof the saku builder never got, and I picked a category with competitors on purpose.
Retune, my iOS guitar tuner, is a vitamin, and I knew it going in. Tuning a guitar is solved, the free options are fine, and nobody's business fails because their tuner is mediocre. It was still worth building. It just means a different sport: volume, impulse pricing, and a product good enough that people mention it to a friend.
Crosshatch, a sudoku trainer, walks straight into the Linktree dynamic. Good Sudoku exists, it's excellent, and it's where people default. I went in anyway with my eyes open, because I want to build it and the economics of a small app let me. It isn't the same bet as LabelKit, and pretending otherwise is how I'd end up writing a postmortem with the real lesson at number six.
I'd rather know in month zero which kind of bet I'm making than find out in month six, when the only thing left to do about it is write the list.