We built it.
We shipped it.
The market never came.
HappyTausch let people offer things — mostly books, plus vouchers and events — as pins on a map, to swap or give away. Plain PHP from 2020: no framework, no content management system, three environments and a scheduled job keeping things tidy.
It works. Almost nobody uses it. We keep this file because a portfolio of successes teaches a reader nothing about judgement, and because the interesting part of a disappointment is which decisions were actually to blame — usually fewer than you would expect.
- Status
- Dormant
- Kind
- Consumer marketplace
- Built
- 2020
- Stack
- PHP, no framework
- Environments
- 3, one database
- Lesson
- Activation, not sign-ups
- held one database, three environments good callA table prefix per environment, selected by hostname. One schema to migrate, and a test environment that is genuinely identical.
- held no framework good callDebatable in 2020, vindicated since: the code still runs on a current PHP with no framework migration in the way.
- held boring scheduled jobs good callThree cadences, plain logs. Nothing clever, nothing that has ever needed attention.
- failed supply will bootstrap wrongListing is free, so people will list. In practice listing costs effort and the reward is invisible until somebody else has listed first.
- misread sign-ups mean interest wrongPeople registered. Registering is not using, and we let that number reassure us for too long.
Three of these still look right six years later. The one that failed was not technical, and no amount of engineering would have rescued it.
Brief Why this file exists § 01
The build was not the problem. That is the uncomfortable part.
It would be more flattering to write that we ran out of time, or that the stack aged badly, or that some technical debt caught up with us. None of that is true. The software does what it was designed to do, on a current PHP, six years later, with no migration standing over it.
What failed was a product assumption, and it failed quietly. A swap platform is a two-sided market: nobody comes to browse an empty map, and nobody lists into an empty map either. We assumed that because listing was free and simple, supply would appear. Free and simple were not the barrier. Pointless-feeling was the barrier.
We are publishing the decisions rather than the metrics, because the numbers would only tell you it did not work. The decisions tell you how we think — which is the thing you would actually be hiring.
Ledger What was built § 02
Decisions What we chose, and how it aged § 03
Three calls, six years of hindsight.
One database, three environments, chosen by hostname.
Development, test and production share a schema and are separated by a table prefix, selected from the hostname the request arrived on. It is not the textbook arrangement, and it concentrates all the risk in one small piece of code.
Which is exactly why that piece of code got the care. In six years it has never crossed environments, and there has only ever been one schema to migrate.
Cost: a single point where a mistake would be serious rather than annoying.
Aged: well. The test environment is genuinely identical to production, which is more than most three-environment setups can claim.
No framework, on purpose.
In 2020 this looked conservative to the point of stubbornness. The bill came due immediately: routing, validation and templating all had to be written rather than inherited.
The return arrived later and quietly. There has been no framework upgrade path to follow, no major version that dropped support, no ecosystem churn to absorb. A dormant project on a framework is a liability; a dormant project on the standard library is just asleep.
Cost: more code written by hand at the start, and no community answers to search for.
Aged: well — although we would not repeat it for a product with an actual team behind it.
We perfected the map. That was the wrong thing to perfect.
The map with its pins was the enjoyable part to build and the part that looked good in a screenshot. It was not the part a potential user was weighing when deciding whether to bother.
What we would do now: build the smallest listing flow that can possibly work, put it in front of thirty people, and measure how many finish it — before building anything that makes the product photograph well.
Cost: effort spent where it could not move the outcome.
Aged: badly, and usefully. This is the lesson we actually carry into client work.
Post-mortem What actually went wrong § 04
Nothing broke. That was the whole problem.
Product
Sign-ups arrived. Activation did not.
People registered and then stopped. Very few completed the step where they would have had to do a small piece of work for a stranger they had not met yet. The listings that did appear clustered in one narrow category, which should have been read as a signal much earlier than it was.
What we had assumed: that registration measures interest. It measures curiosity. The step worth instrumenting is the first one where a user has to give something before receiving anything — and in a two-sided market that step is the entire product.
Conclusion → we stopped adding features. Not every project deserves a rescue, and recognising that early is a skill worth more than the rescue would have been. The platform still runs; we simply stopped pretending more code was the answer.
Transfer What this means where you are § 05
The failure modes worth learning from are rarely the technical ones.
Two-sided markets fail on the supply side
Demand can be simulated, borrowed or bought. Supply has to be earned one contributor at a time, and it is where these products die. Test that side first, with something embarrassingly small.
Instrument the first moment of real effort
Sign-ups measure curiosity. The number that predicts anything is how many people complete the first step that costs them something. If you only track one funnel step, track that one.
A boring stack ages better than a fashionable one
Six years later this code runs on a current runtime with no migration debt. For anything you might have to leave alone for a while, that property is worth more than developer comfort on day one.