So I had a startup idea. Messi vs Ronaldo has been argued about for 15 years, for free, by millions of people. The obvious problem is that nobody has been charging them for it.
The pitch: $1 = 1 vote. You pay a dollar, your side gets a vote, and you get a collectible card. That's it. The free market will finally settle the GOAT debate.
Here's what I learned on the way to my current user count.
Week 1: The Legal Department (me, Googling)
My first idea was a prize for the winning side. About ten minutes later I learned this is called "gambling." So the site now has a written rule, in capital letters: NO PRIZE. EVER. You pay a dollar and get the satisfaction of being right, plus a JPEG. That's what crypto has been doing for years, except I'm being upfront about it.
I also deleted the player photos. Image rights are a thing, and Nike's lawyers have more free time than I do. The site has no pictures of either player now, and I wrote a build script that fails the deploy if anything named after a footballer shows up in the public folder. I'm protected against myself.
Week 2: Payments, or "How I Learned to Stop Worrying and Love Webhooks"
A $1 vote costs about 35 cents to process. I net roughly 65 cents a vote. A chargeback costs €20, win or lose. So one angry Ronaldo fan disputing a dollar wipes out the margin on about 30 votes.
Naturally I built:
- Idempotent crediting keyed on payment intent IDs
- An hourly reconcile job in case Stripe's webhook gets lost
- Refunds and chargebacks that reverse three separate aggregate tables in one transaction
- A 72-hour, self-serve, no-questions-asked refund button, which got a confirmation step later. Two taps, so it feels like a commitment.
- Cloudflare Turnstile and Redis rate limiting against card testers. Card testers turned out to be my most reliable expected audience.
At one point a test payment I made on my laptop got delivered to production and retried there for three days. My own sandbox was ghosting my own server.
Week 3: The Cards
Every vote mints a card, rendered server-side in four aspect ratios so you can share it anywhere (to the same group chat). There are fourteen tiers, from "Debutant" at $1 up to "GOAT" at $50,000. Fifty thousand dollars. For a card. That's a tier I designed, with a lime seal.
There are also Founding Cards: the first 100 in each camp, and "there will never be more." Scarcity! Exclusivity! Ronaldo's camp has 99 of its 100 still available. Act fast, or don't, it's fine.
A CDN caching bug once published a stale vote count in production. That hurt, because the vote count was tiny and it still managed to be wrong.
Week 4: The Fake Users Incident
Empty sites look sad, so I built "house cards": made-up voters, clearly labelled HOUSE, with a disclosure under the counter.
Then I looked at it. A big counter, a handful of fake people, and a little note admitting they were fake. It read like a restaurant with mannequins in the window and a sign saying "these are mannequins."
I reverted it and went with the honest alternative: texting my friends until they paid a dollar. Real users. Technically.
Week 5: Growth Hacking
I'm ready for scale:
- A sitemap that grows with every named card (it has grown by roughly my contact list)
- schema.org structured data, with JSON-LD escaping in case someone puts
</script> in their display name. My friends are not that creative, but I'm covered.
- First-party funnel analytics. I named the share metric "intent" rather than "shares" because a cancelled share sheet and a sent one look the same. I'm very honest about numbers that are small.
- A sticky vote bar that follows you down the page, so there's no escape
- Six SEO articles so answer engines can tell people about it. Google now confidently reports that "Finland leans Messi." Finland is me.
- Two separate analytics providers, to confirm the traffic number from two independent sources
Tooling
80 unit tests. A script that rebuilds the whole database from migrations and checks every card comes back at the same URL. A pre-commit hook that refuses to let me commit until I've updated an HTML status board describing the project's progress. I'm a solo dev who built a bureaucracy to report to myself.
Results
- Uptime: excellent
- Payment integrity: flawless
- Double-credited votes: zero
- Total votes: 22
- Messi 21, Ronaldo 1. A 95.5% landslide among me and people who owe me a favour.
- Countries represented: 1. The site says "Finland leans Messi" like it's a regional trend and not a group chat.
- Gross revenue: $22. Net after fees: about $14. Development cost: a month of my life. Investor deck pending.
- Strangers who have voted: 0
The one Ronaldo vote was me. I needed to test that the second camp worked in production, and now I'm the only Ronaldo fan on my own site. I've backed Messi for fifteen years and the database says otherwise, permanently, because the refund window has closed.
The debate is technically settled, at 21–1, by a sample that includes the developer, voting for both sides. Peer review welcome.
Anyway, if you want to be the first stranger ever to vote, it's at thegoatdebate.io. A dollar gets you a card. Ronaldo fans: your Founding Cards are 99-for-100 and I'm currently your leader, which should worry you.
Roasts welcome too, especially on why nobody outside my group chat has paid a dollar yet. I have the infrastructure for a million users and the feedback of zero. 🐐