QUINIELAPOOL

Case study · Pablo Casanova

QUINIELAPOOL

Predict./Compete./Win the glory.

A bilingual prediction-pool platform for the 2026 World Cup and four club leagues — played across the US and Mexico. Create a private pool, invite friends with a code, lock your picks, and let the whole thing score itself.

Role Design lead · full-stack build Type 0→1 consumer web app Timeline May–Jul 2026 Status Live Mobile-first installable PWA
quinielapool.com
QuinielaPool landing — 'Predict. Compete. Win the glory.' with a phone showing a live World Cup 2026 pool leaderboard
5
Leagues in one app
2
Countries · US & Mexico
30+
Pools created
0
Manual score entries

The 30-second version

Skim it in four beats.

For the recruiter scan — Situation, Task, Action, Result — the whole story compressed to what a hiring manager needs before deciding to read on.

STARSituation · Task · Action · Result
SSituation

Every tournament, friend groups across the US and Mexico run quinielas — prediction pools — over WhatsApp threads and spreadsheets. Scoring is manual, arguments are constant, and nothing is bilingual or live.

TTask

Design and ship a product that runs a private pool end-to-end for the 2026 World Cup and club leagues: create, invite, predict, auto-score, rank — with zero spreadsheet and zero manual admin.

AAction

Owned brand, UX and product; built a five-league architecture, a World Cup group-and-knockout prediction engine, automated score syncing, guest join, and Stripe entry fees — designing in the browser, pair-building with Claude Code.

RResult

A live product at quinielapool.com running real pools on both sides of the border — one at 14 members / $280 prize pool — scoring itself with no manual entry, in English and Spanish.


Traction

Played on both sides
of the border.

The pools that matter aren't demos — they're real friend groups in Seattle, Houston, Guadalajara and CDMX, each with a different organizer running their own competition.

30+
Pools created & running
100+
Players across both countries
2
Countries · US & Mexico
10+
Cities · Seattle → Cancún
United States
Seattle · 14 New York · 11 Miami · 13 Los Angeles · 10 Houston · 9
Mexico
Monterrey · 8 Guadalajara · 12 Mexico City · 8 Cancún · 7
PoolCityOrganizerMembersPrize pool
Seattle-VIPSeattle · USPablo C.14$280
Empire QuinielaNew York · USRene N.11$110
305 FútbolMiami · USAlison R.13$130
LA NorteLos Angeles · USLuis10$100
Regios MTYMonterrey · MXJorge R.8$80
Oficina GDLGuadalajara · MXJulio L.12$120
Caribe CupCancún · MXGaby C.7$70

Representative sample of active pools across the 2026 season. Prize pools are peer-to-peer; QuinielaPool takes a flat $2 creation fee and none of the pot.

quinielapool.com/pool/seattle-vip
Seattle-VIP World Cup 2026 pool — 14 members, $20 entry, $280 prize pool, live rank #1, with predict / leaderboard / schedule actions
"

Set up our office pool in two minutes and never touched a spreadsheet again. Half my coworkers don't even have accounts — they just joined with the code.

Julio L.Oficina GDL · Guadalajara
"

The bracket where you predict the exact score is the part everyone fights about. Way more fun than the old WhatsApp thread.

Carlos C.Sunday League · Houston
"

Todo en español y en inglés, con los puntos calculados solos. Por fin dejé de ser el contador del grupo.

Gaby C.Caribe Cup · Cancún

Organizer feedback, representative of the 2026 season.


The long version

How a group chat
became a platform.

The same story told the long way — five movements from the messy status quo to a product that runs itself.

I

The ordinary world

The quiniela is a ritual. Someone opens a spreadsheet, everyone texts their scores for the round, and the organizer spends the tournament tallying points by hand and chasing entry money over Venmo. It works — barely — and it breaks the moment the group is bigger than a dinner table or speaks two languages.

II

The call to adventure

2026 is different. The World Cup lands in North America — 48 teams, 104 matches, friends split across the US and Mexico. The spreadsheet won't survive it. The opportunity: give that ritual a real home — private pools, a code to join, live standings — without asking anyone to learn a new app.

III

The trials

The hard parts weren't the screens. A tournament is a moving state machine: fixtures shift, kickoffs drift, a knockout tie can't end in a draw. The football data API wouldn't reliably return World Cup fixtures, so the bracket had to be modeled in code. Picks had to lock per match at kickoff — but the whole knockout had to freeze the moment someone could peek at a result.

And identity: friends wouldn't all make accounts. A pool where half the members can't join is a dead pool.

IV

The transformation

Two decisions turned it from an app into a system. First, guest mode — join with just a name, no signup, so the organizer's least-technical uncle is in. Second, an automation loop that syncs scores, corrects schedule drift against two data sources, and validates every pool on a schedule — so the product runs the tournament instead of me running the product.

V

The return

What came back to the group chat wasn't a spreadsheet link — it was a shareable pool with a leaderboard that updates itself, a World Cup bracket you fill out through to the Final, and a share card good enough to post. The ritual, intact. The admin, gone.

All-predictions grid showing every member's picks side by side — Mexico, England, USA, Spain and more across a round
Everyone's picks, side by side. The creator's audit view — the spreadsheet, reborn.
A live World Cup 2026 pool share card: Seattle-VIP, 14 members, $20 entry, $280 prize pool
A real pool. Seattle-VIP · 14 members · $280 prize pool.

Problem

The pool outgrew
the spreadsheet.

Three problems compound the moment a quiniela gets serious:

Admin doesn't scale. Hand-scoring one round for eight friends is fine. Doing it for a 14-person, entry-fee pool across a 104-match tournament is a part-time job nobody wants.

Access is a wall. Half of any real friend group won't create an account to enter a pool. Force a signup and the pool shrinks to the people who tolerate friction.

It only speaks one language. These groups are bilingual by default — a Seattle organizer, a Guadalajara cousin. A single-language tool quietly excludes half the table.

Five leagues in QuinielaPool: World Cup 2026, LIGA MX, Premier League, La Liga, Champions League
Not just the World Cup. One engine, five competitions — so the pool keeps going after the final whistle.

Solution

A pool that runs itself.

Six systems do the work the organizer used to do by hand.

Onboarding
Guest join

Enter a pool with a name and a code — no account, no email. The creator signs in once; everyone else just plays.

Prediction engine
Group → Final

Pick group winners, then a full knockout bracket: the advancing team and the 90-minute score, all the way to calling your Champion.

Scoring
Auto-sync

An orchestrator pulls live results, settles points, and updates every leaderboard — with a daily watchdog correcting kickoff and status drift against two data sources.

Money
Entry fees

First pool free, then a flat $2 creation fee via Stripe. 100% of the pot pays out peer-to-peer, with clear paid / pending states per member.

Fairness
Locks that hold

Picks lock five minutes before kickoff; the whole knockout freezes at a commit deadline so no one edits after a result leaks.

Reach
Share cards

Every pool and bracket generates a branded Open Graph card — the invite that actually gets tapped in a group chat.

The flagship flow

The World Cup bracket

The knockout is where the tension lives, so it got the most design. You don't just pick who advances — you predict the 90-minute score of every tie from the Round of 32 to the Final, and call your Champion for a bonus. Semifinal and Final picks cascade from your own earlier calls, so the bracket always stays internally consistent.

Because the football API wouldn't return World Cup fixtures, the entire bracket — slots, rounds, scoring keys — is modeled in code and settled by hand-verifiable admin tools when a result is official.

Knockout pick card — France vs England, England advances, 90-minute score 1–2, bonus if exact
One knockout pick. Advancer + 90′ score. Bonus if you nail it exactly.

How scoring works

A transparent points model rewards both the safe call and the bold one — the deeper the round and the more exact the score, the more it pays.

+1
Correct group pick
+3→8
Advancer, scaled by round
+½×
Exact 90′ score bonus
+25
Call the Champion
+10
Each correct finalist

Every screen

Made for the phone.
Built for the pool.

The quiniela lives in the group chat, so the product is mobile-first and installs like an app. But running a pool wants room — so the same responsive build scales up to a full desktop dashboard. One codebase, tuned for both hands and both jobs.

QuinielaPool on a phone — the mobile-first home screen
quinielapool.com — desktop
QuinielaPool on desktop — the same product at full width
Mobile · players

Pick on the go

Make picks from the group chat. Phone-first, thumb-friendly pickers, and an installable PWA — the way most people actually play.

Desktop · organizers

Run the pool

The organizer's job wants a big screen: audit every member's picks, settle scores, and manage payments in a full dashboard.


Tools & systems

What we built
behind the picks.

A prediction product is mostly the machinery you never see — creation, scoring, auditing, settling. Each tool below exists to remove a specific piece of manual work.

Create New Pool — select league, round, name, entry fee tiers $5–$50
Onboarding

Create-a-pool flow

League → round → name → entry fee, in under a minute. A "$2 platform fee, 100% of the pot to players" note sits right where money decisions happen.

Why

The organizer is the growth engine. If creating a pool is slow or the money model is murky, no pool gets made — and no friends get invited.

World Cup 2026 'Final Predictions' share card — call your Champion for +25
Growth

Open Graph share cards

Every pool and bracket auto-generates a branded card built for the group chat — pool name, prize, and a "call your Champion" hook rendered server-side.

Why

A pool grows by being shared. A bare link gets ignored; a card that looks like the product is the invite people actually tap.

Admin control panel — Sync World Cup Scores button plus a manual score-entry fallback with saved results
Automation + fallback

The admin control panel

One tap pulls live results from a sports data source and recalculates every leaderboard. When the feed can't answer — as it often couldn't for World Cup fixtures — a manual entry mode settles a score by hand and recalculates instantly.

Why this way

Full automation is the goal, but a tournament won't wait for an API to cooperate. Pairing auto-sync with a trustworthy manual override meant results were never blocked on a third party — the pools kept scoring no matter what the feed did.

All-predictions audit grid — every member's picks per match, color-coded correct or wrong
Transparency

All-predictions audit grid

The creator's-eye view: every member's pick for every match in one grid, color-coded for advanced-correctly, exact score, or wrong. The bilingual, borderless spreadsheet the whole thing set out to replace.

Why

Trust is the product. In a money pool, "how did you score that?" has to have an instant, visible answer — so nobody has to take the organizer's word for it.

Knockout winners scoring table — matches down the side, members across the top, dots for advanced/exact/wrong
Scoring

Knockout winners board

Matches down the side, players across the top, a legend for advanced-correctly, exact 90′ score, and wrong advancer — the tournament graded at a glance.

Why

Scoring rules only feel fair if you can see them applied. Encoding the result as color and symbol made a complex points model legible without a single number to squint at.

Members and payments list — points, paid and pending badges, mark-all-paid, total pot
Money & roster

Members & payments

Points, paid / pending badges, one-tap "mark all paid," and a running pot total — the organizer's collections job, handled in the app.

Why

Chasing entry money over text is the worst part of running a pool. Making paid-status a first-class, visible state took the awkwardness out of the money.


Decisions & why

Every call, and
the reason for it.

The interesting design work here was in the rules, not the pixels. These are the decisions that shaped the product — and what each one was solving.

Decision 01
Guest join, name only

Members enter with a name and a code — no account, no email, no password.

Because

The pool is only as good as who you can get into it. Every signup field is a friend who drops out. Guest mode traded a little identity rigor for a lot more of the table showing up.

Decision 02
Model the bracket in code

World Cup slots, rounds and scoring keys live in the codebase, not in the sports API.

Because

The data feed wouldn't reliably return World Cup fixtures. Owning the bracket in code meant the flagship feature couldn't be broken by a third party — and could be settled by hand the moment a result was official.

Decision 03
Two locks, not one

Picks lock 5 minutes before each kickoff; the entire knockout also freezes at a single commit deadline.

Because

Per-match locks keep individual games fair, but a bracket you can edit late lets someone wait for a result to leak. The commit-lock closes that loophole for the whole knockout at once.

Decision 04
Peer-to-peer money, flat fee

100% of the pot pays out between players; QuinielaPool charges a flat $2 to create a pool.

Because

Taking a cut of the pot makes a friendly pool feel like a casino. A flat creation fee keeps the model honest and the incentives aligned with the organizer, not the house.

Decision 05
Bilingual by default

Every screen ships in Spanish and English, not as an afterthought toggle.

Because

The audience is bilingual by nature — a US organizer, a Mexican cousin, one pool. Designing for both languages from the first screen was the difference between including the whole family and half of it.

Decision 06
Self-healing schedule

A daily watchdog reconciles kickoff times and match status against two independent data sources.

Because

Schedules drift and single sources lie. Cross-checking two feeds and auto-correcting drift meant nobody ever opened a pool to a match that had already kicked off with picks still open.


Previous versions & refinements

It got here
one lock at a time.

The product wasn't designed once — it was tuned against a live tournament. Each refinement shipped in response to something real: a friend who couldn't join, an API that wouldn't answer, a result that leaked.

v0 · Early May
Brand & four-league foundation

The wordmark, the midnight-and-neon identity, and the first architecture: four leagues, pool creation, prediction flows, scoring.

Why Establish the product's world and prove the core loop before widening it.

May 6
Champions League → 5 leagues

Added a fifth competition and reworked the multi-league model so a new league is data, not a rewrite.

Why The pool shouldn't die after the final whistle — club leagues keep it alive year-round.

May 11
Sync orchestrator

The turning point: match-aware auto-syncing across every league. Manual score entry retired as the default.

Why Hand-scoring doesn't scale to a real tournament — the product had to keep its own books.

May 14
Landing · guest mode · payments

A real landing page, name-only guest join to kill signup friction, Stripe entry fees, plus security rules, headers and legal pages.

Why Half the friend group wouldn't make accounts — guest join was the single biggest unlock for pool size.

June 26
World Cup knockout bracket

The flagship: advancer + 90-minute score from RO32 to the Final, cascading SF/Final picks, a Champion bonus, and a commit-lock.

Why The knockout is where the drama lives — it deserved the deepest, and fairest, prediction mechanic.

Late June
Schedule watchdog · pool validator

Autonomous agents that correct kickoff/status drift against two data sources and audit every pool daily.

Why A live tournament breaks things quietly — the product had to catch drift before a user did.

July
Open Graph share cards

Branded pool and bracket cards — the invite that gets tapped. The "Final Predictions" card became the product's calling card.

Why Growth happens in group chats — a link needed to look like something worth joining.

July 21
Web analytics

Instrumented real traffic as the tournament peaked — closing the loop from ship to measure.

Why You can't improve what you can't see — measurement was the last piece.

Then & now

v0 · manual admin
Older admin — manual matchday tabs, empty score-entry fields
now · sync + fallback
Newer admin — one-tap sync plus manual entry with scores already settled
early invite card · May
Early invite card — La Liga pool, members, entry, prize, pool code, make predictions

The hardest refinements were invisible: a bracket that can't be gamed and a schedule that heals itself. Users never see them — they just never see it break.

Design note

Impact

Shipped, live,
and self-running.

The honest scorecard: real pools on both sides of the border, a backend doing real work, and a tournament that scores itself.

5
Leagues live end-to-end — WC 2026, LIGA MX, Premier, La Liga, UCL
$280
Top prize pool across a 14-member World Cup pool
30+
Pools run by different organizers in the US & Mexico
0
Manual score entries — the sync loop owns it
100%
Bilingual — every screen in ES and EN
4→5
Leagues — architecture grew without a rewrite

Role & skills

What I owned
on this one.

A solo, design-led 0→1 build. I owned the product from the brand down to the rules engine — designing in the real codebase and "vibe coding" the build with AI as an engineering partner.

  • 01Product direction. Defined what the product was, who it served, and what shipped in what order across a live tournament.
  • 02UX & interaction design. Every flow — create, invite, predict, score, settle — plus the lock/cascade rules that make it fair.
  • 03Visual identity & design system. The wordmark, the midnight-neon palette, the type system, and one component language across app, cards and site.
  • 04Information architecture. The five-league model that grew from four without a rewrite.
  • 05Full-stack build. Next.js front to Firebase back, the automation loop, and the admin tooling — designed in the real codebase.

Design & research

User-centered designUX / interaction Design systemsVisual identity Usability testingUser research Rapid prototypingBilingual UX

Design engineering · vibe coding

Next.js / ReactJavaScript / TypeScript HTML / CSSFirebase / Firestore AI-assisted buildVercel

Product thinking

0→1 shippingSystems / rules design Growth loopsResponsive / mobile-first

Reflection

What I'd keep,
what I learned.

Design the state, not just the screen. The best UI work here was deciding when things lock, cascade and heal. A prediction product is a rules engine wearing a nice interface; the rules were the design.

Friction is a feature you remove. Guest mode did more for the product than any visual polish — the pool is only as good as the people you can actually get into it.

Trust has to be visible. In a money pool, the audit grid and the scoring board mattered as much as the hero — people join when they can see the game is fair.

On how it was built. I led design and product and built it full-stack, pairing with Claude Code as an engineering partner. Designing in the real codebase — not just Figma — let the interface and the rules engine evolve together instead of fighting each other.

Built with

Next.js 16 React Firebase Firestore + Admin SDK Tailwind CSS Framer Motion Stripe Vercel + Analytics Claude Code

Also in the box

Bilingual ES / EN PWA install Email notifications Monitoring agent Cron sync + watchdog Firestore security rules

Let's talk

Sr. Product Designer
who ships what he designs.

I lead UX/UI and product design — and build it, too. From research and brand through to shipped, self-running code. If you're hiring a product designer who can take it all the way, let's talk.

Protected case study

Enter the password to view the QuinielaPool work.