The short answer
Something counts as shipped when a stranger could reach it without your help, and something is different for them once they do. Both halves are required. A live coming-soon page fails the second. A finished feature behind a switched-off flag fails the first. Shipped is not the same as deployed, which happens on your servers, or launched, which is the marketing act of pointing people at something you already shipped.
Every builder community has the same argument on a loop. Someone posts "shipped!" with a screenshot of a domain pointing at a blank page, someone else replies that this is not shipping, and forty comments later nobody has changed their mind.
It looks like a fight about a word. It is not. The definition you adopt decides what you do with your Tuesday. If connecting a domain counts, you will spend Tuesdays on things that feel like progress. If only paying users count, you will spend them polishing in private, waiting to earn the right to say the word. Both are expensive. So this post takes a position, tests it against twelve real examples, and gives you the words to use when a case is genuinely in between.
What is the "what counts as shipping" argument actually about?
It is about which half of shipping you think matters: the act of making something public, or the effect on the person who receives it. Each side has a good point and a blind spot, and stating both fairly is the fastest way to see where the line really sits.
The wide definition
"If it is public, it shipped."
Right about: A low bar builds momentum. Founders who wait for a perfect release never release anything, and a domain going live is a real, scary step.
Wrong about: It lets a coming-soon page count as a product. You can run a hundred-day streak and never hand anyone anything.
The narrow definition
"If nobody uses it, it did not ship."
Right about: Shipping is for someone. Code no person touches has not changed anything in the world, however hard it was to write.
Wrong about: It makes the verdict depend on traffic you do not control. By that rule a good tool with no audience yet has never shipped, which is absurd.
The wide camp is protecting momentum, and it is right to. Most side projects die in private, not in public. The narrow camp is protecting meaning, and it is also right. A streak of "ships" that never touched another human is a streak of busywork with good branding. Anyone who has run a shipping streak knows the pull: when the number is the goal, the definition quietly widens until it fits whatever you did today.
The mistake both sides make is tying the verdict to the wrong thing. The wide camp ties it to your action. The narrow camp ties it to other people's behavior, which you do not control. The workable line sits in between, on something you do control: whether the door is open and whether there is anything behind it.
What counts as shipping? The definition that survives contact with reality
It shipped if a stranger could reach it and something is different for them. That is the whole rule. It has two tests, and a change has to pass both.
- The reach test. Could a person you have never met get to it today, without you sending them a private link, adding them to a list, or flipping a switch for them? Public URL, public app store listing, a package anyone can install: yes. Staging server, invite-only build, feature flag set to off: no.
- The difference test. Once they are there, can they do, see or understand something they could not before? A clearer label passes. A fixed bug passes. A blank page with your logo on it does not, however nice the logo is.
Notice what the rule leaves out. It does not ask whether anyone actually came. Usage depends on distribution, and distribution is a separate problem with separate fixes. If you shipped something real and nobody arrived, you do not have a shipping problem. You have a launch problem, and pretending otherwise sends you back to the codebase when you should be out talking to people.
The rule also ignores size. Renaming a button counts. So does answering a common question with a help article. This is deliberate. Small ships are how a product actually improves, and a definition that only honors big releases trains you to batch everything into rare, risky ones.
Does it count? Twelve real examples, judged
A definition is only useful if it gives the same answer twice. Here it is applied to twelve things builders really call "shipping", including the ones that start the arguments. Each gets a verdict, the two tests, and the reason.
| What you did | Stranger can reach it | Different for them | Verdict |
|---|---|---|---|
Renamed a confusing button in production Tiny, and still a stranger now reads a clearer label than yesterday. Small ships are ships. | shipped | ||
Connected a domain to a coming-soon page Anyone can reach it, but nothing is different for them. You bought an address, not a product. | not shipped | ||
Fixed a bug a paying customer reported The clearest case there is. A real person could not do something, and now they can. | shipped | ||
Published a landing page with no product behind it You shipped a waitlist, not the product. Say that. It is a real step, just not the one people will assume. | say it plainly | ||
Merged a feature behind a flag that is still off The code is in production and nobody can reach it. Deployed, not shipped. | not shipped | ||
Put the new version on a staging URL only you know A stranger could not find it even if they tried. Useful for testing, invisible to the world. | not shipped | ||
Turned the flag on for a slice of real users Strangers are using it now. A partial rollout is still a ship, to the people it reached. | shipped | ||
Wrote a help article for an existing feature If users can find it from the app or search, it changes what they can do. Docs are product. | shipped | ||
Refactored the billing code, nothing visible changed Real work, worth doing, and not a ship. Call it done. If it made checkout faster, that part shipped. | not shipped | ||
Sent a test build to three friends Something changed for them, but a stranger cannot get in. Call it a private beta. | say it plainly | ||
Published an open-source package with a working README Anyone can install it and use it without asking you. That is the whole test, passed. | shipped | ||
Posted a demo video of a feature that is not live You announced it. Announcing is marketing, and it is fine, but the feature has not left your laptop. | not shipped |
Three patterns jump out. First, most of the arguments are about rows that pass one test and fail the other: the domain, the landing page, the friends-only build. Second, the least glamorous rows (a renamed button, a help article, a customer's bug) are all clean ships, while the most exciting-sounding one, a demo of a feature that is not live, is not a ship at all. Third, the refactor is the row people get defensive about, so it is worth saying plainly: work that makes no difference to anyone outside is still valuable. It is just called done, not shipped.
If you keep a public log, this table is a decent filter for what goes in it. The guide to shipping in public every day separates the small real change from the public post about it, which is exactly the gap these rows live in.
What is the difference between shipped, launched and released?
They are different events that happen to different audiences. Released means switched on for some users. Shipped means any stranger can reach it and get something from it. Launched means you deliberately pointed an audience at something already shipped. Deployed sits underneath all three and is not a user-facing event at all.
| Event | What happened | Who can tell | Worth announcing? |
|---|---|---|---|
Deployed | New code is running on your servers. | You and your logs. | No. Nobody outside can tell it happened. |
Released | The change is switched on for some users. | The users in the rollout. | Only to those users, if it affects them. |
Shipped | Any stranger can reach it, and it changes something for them. | Anyone who finds it. | Yes, as a log entry or a short update. |
Launched | You deliberately pointed an audience at something you shipped. | Everyone you told. | That is the whole point of a launch. |
The split between deploy and release is standard practice on engineering teams. Martin Fowler's long piece on feature toggles and release toggles describes teams putting unfinished code into production as latent code that may never be turned on. That is the whole reason "it is in prod" and "it shipped" cannot mean the same thing. Code can live in production for months while no user ever sees it.
The split between shipped and launched matters more for solo founders, because it is where the marketing lives. You should ship often and launch rarely. Each launch spends attention, yours and your audience's, so it should point at something that has already passed both tests. The continuous launch strategy post covers how often that can be without wearing people out, and the build in public playbook covers what to say in the stretches between.
Why is the deploy the wrong milestone to celebrate publicly?
Because your audience cannot use a deploy. Celebrating one asks people to be excited about something they have no way to touch, and it trains you to feel finished at the moment the part that matters to them has not started.
Deploys are a great private metric. The DORA software delivery metrics count deployment frequency as a measure of a team's throughput, and a founder who deploys often is usually a founder whose releases are small and safe. Keep counting them. Just do not mistake the throughput measure for the outcome it is meant to support.
Hacker News makes the same point from the audience side. Its Show HN guidelines say a Show HN is for something you have made that other people can play with, and that landing pages and sign-up pages do not qualify because they cannot be tried. That is the reach and difference test written by a community that has seen every flavor of premature "launch". When the most demanding builder audience online draws the line there, it is a good sign the line is in the right place.
So celebrate the moment a stranger can get in. That is also the moment you can put your work somewhere people will actually find it. A product listing on the Favors.dev apps directory only makes sense once the door is open, and it is a small, honest test of your own ship: if you cannot write a listing that tells a stranger what they can do today, you have not shipped yet.
What should you call it when you are not sure it counts?
Call it what it is, in plain words. Hedging is not weakness here. It is accuracy, and people trust builders who describe their own work precisely more than builders who round everything up to "shipped".
Live for early users
Shipped to a small group you chose, with the door not fully open yet.
Private beta
Real users, invite only. Strangers cannot get in.
Soft launch
Shipped and public, but you have not pointed an audience at it yet.
Waitlist open
The page is live. The product is not.
Deployed, not released
It is in production and switched off. Mostly a note to yourself.
These terms also protect the word. If "shipped" in your updates reliably means a stranger can use it today, people start clicking when they see it. If it sometimes means a waitlist and sometimes means a staging URL, they learn to ignore it, and your real ships get the same shrug as your fake ones.
One practical habit: before you type "shipped", open the thing in a private browser window, logged out, from a link you found the way a stranger would. If you get in and something is there, post it. If you hit a login wall or a blank page, pick a more honest word from the list above.
And once it passes, give it strangers. That is the other half of why I built Favors.dev. It is a founder marketing co-op where builders earn points in a points economy by doing verified favors for each other's launches (trying a product, leaving honest feedback, sharing it) and spend those points when their own work needs eyes. Put your next real ship on the launch calendar and the first strangers through the door are founders who will tell you what they found.
Frequently asked questions
What counts as shipping?
Something counts as shipped when a stranger could reach it without your help and something is different for them once they do. Both conditions matter. A coming-soon page is reachable but changes nothing, so it has not shipped. A finished feature behind a flag that is switched off changes something but nobody can reach it, so it has not shipped either.
What is the difference between shipping and launching?
Shipping makes a change available to real people. Launching is the marketing act of deliberately pointing an audience at something you already shipped. You can ship many times without launching, and you should. A launch without a ship behind it is an announcement, and it tends to disappoint the people who arrive.
Does deploying code count as shipping?
Not on its own. A deploy puts code on your servers, and it can sit there switched off indefinitely. Continuous delivery teams deploy code to production behind flags on purpose, precisely so they can decide later when users see it. It counts as shipped at the moment a stranger can reach the change.
Is it shipping if nobody uses it?
Yes, as long as someone could. The test is whether a stranger could reach it and get something from it, not whether anyone has yet. Usage depends on distribution, which is a separate problem. If you shipped something and nobody came, you have a launch and distribution problem, not a shipping problem.
Does a landing page count as shipping a product?
A landing page ships a landing page. If it only collects emails for a product that does not exist yet, you have shipped a waitlist, which is a real step but not the product. Hacker News draws the same line: its Show HN guidelines ask for something people can try and rule out landing pages and sign-up pages.
