# Rifa Teletón — Actionable build spec (meeting of 2026-06-23)

Distilled from the team call. Reconciled against the current codebase so each item says
**what changes** and **where**. Items are ordered by what unblocks the rest.

Current page order (for reference): Trust header → Hero (red band + logo + form) → HowItWorks
→ PrizeGrid → CauseImpact → BoletosCounter → InfluencerBlock(hidden) → FAQ → Footer → persistent BottomCTA.

---

## 0. The core idea the whole build hangs on: the participant journey

The user buys into ONE specific upcoming draw, but their chances live on until they win.

1. Every **S/5 = 1 chance** (already built — `BOLETO_PRICE_SOLES = 5`, multiples enforced client + server).
2. A single one-time payment enters the buyer into the **next/closest upcoming draw**. No subscription
   (the reference sites monetize via monthly subscription — that model does NOT apply to us; we are one-time pay only).
3. **If you don't win, your chances carry forward automatically to every later draw, up to the grand final.**
4. **The more tickets you buy, the more live chances you hold going into the gran sorteo final (11/12 Sep).**
5. **Hard rule: once a person wins any prize, all their chances are removed from every future draw.**
   One person cannot win twice across the campaign.

> This is the one real architectural change. The current code models each raffle as an INDEPENDENT
> event (`raffles` table, per-raffle ticket pool, winners drawn only from that raffle, no carry-forward —
> confirmed in `lib/db/schema.ts`, `lib/draw/select.ts`). The new model is a **single campaign with one
> accumulating chance pool** and 6 sequential draw dates that remove winners as they go. Decide explicitly:
> rework the pool to accumulate, or model 6 raffles and copy unwon chances forward at each draw. The
> accumulating-pool option is cleaner and matches what the team described. Person-level removal also means
> `lib/draw/select.ts` must drop ALL tickets of a winning participant before the next draw, not just the
> winning ticket.

---

## 1. Page restructure (it is a reorg, the pieces mostly exist)

The team's agreed top-to-bottom order:

1. **Logo / brand band** — first thing, Teletón "La hacemos todos" lockup. (Have it: `Hero.tsx`.)
2. **Big prize banner — the hook.** Immediately after the logo. This is what convinces people to play.
   - Aspirational, generic presentation of the headline prizes (international/national ticket, hotel
     suite night, dinner for two, breakfast — the prizes already secured).
   - **Slider that rotates ~every 5s**: current-period prizes, then previous winners, etc. (We have GSAP;
     no carousel component yet — add one. `Countdown` exists in the UI lib but is unused.)
   - Include one **inspirational image**: a beneficiary child with their companion, prizes to the side.
   - **Art is delivered by the team** (Alex + Churchill design it and send it). Build to slot their art.
3. **Cómo funciona.** (Have it: `HowItWorks.tsx`, currently the 3 steps.) Sebas sends the final copy.
   Must state: draws happen on fixed dates **with a notary present**; we raffle solidarity prizes
   (pasajes, cenas, desayunos); **the more tickets you buy the more you enter the gran sorteo final**.
4. **Prize cards (cuadritos) — the specific, dated grid.** (Have it: `PrizeGrid.tsx`.) Each card =
   one real prize + **its draw date** + a status tag. As a prize is drawn, flip the tag to **"Entregado"**.
   Keep the photo; only the tag/date text changes. The grid is the live history (shows what's drawn and
   how many dates remain). See data-model changes in §3.
5. **Planes / precios — sell the chances, briefly.** One-time only, no subscription. Just declare the
   rule plainly: **cada S/5 = 1 chance**, and "compra más para más chances". Keep it sales-oriented, not
   a wall of description. (We have `pricingTiers` data-driven: +1/+2/+3 model.)
6. **FAQ** at the very end. (Have it: `Faq.tsx`, hardcoded.) Sebas sends the question set (screenshot).

Remove the duplication: prizes appear **once aspirationally in the hero banner** and **once specifically
in the dated cuadritos**. Drop the redundant prize/impact repeat that sat below before (the generic
hero version already covers the aspirational role). Keep the cause/impact stats as their own beat, but
do not re-list prizes a third time.

---

## 2. Urgency mechanics

- **Progress bar + live counter toward a goal** (Sergio's idea — already built: `BoletosCounter.tsx` +
  `StripeProgressBar`, live cached count of paid boletos).
- **Raise the goal to 50,000 boletos.** Currently hardcoded `BOLETOS_GOAL = 5000` in
  `components/landing/data.ts`. Make it a per-campaign config value rather than a constant.
- **Countdown to the next draw** in/under the hero (sense of urgency = participation). `Countdown`
  component exists, just unused.

---

## 3. Prize-card data model changes

Prizes are already DB-driven (`prizes` table: `position, name, description, marketValueCents, imageUrl,
sponsorName, isConfirmed`). To support the dated cuadritos with an "Entregado" state, add:

- A **draw date** the card displays (either per-prize `drawDate`, or derive it from the prize's assigned
  draw/sorteo). Cleanest: associate each prize with one of the 6 draw dates.
- A **status the card can show**: por sortearse → sorteado/**entregado**. Today there is no per-prize
  drawn/delivered flag on the card; delivery is tracked only on `winners.prizeClaimedAt`. Add a card-level
  status so the grid reads as a live timeline. Keep it editable from admin (`/admin/premios` already exists).
- Goal: prizes stay **dynamic** — the team adds a car/moto/TV for the final later without code changes.

---

## 4. Floating CTA → form

- Add a **floating "Quiero participar" button** (side-anchored) that smooth-scrolls to the form.
- The form should be reachable immediately (anchor). We already have a persistent bottom CTA bar
  (`BottomCta.tsx`) and the form lives in the hero (`DonationForm.tsx`) — adapt to the side-floating
  "Quiero participar" pattern the team asked for so the first thing a user can do is open the form.

---

## 5. Draw schedule (TEAM TO FINALIZE — dates were not fully nailed on the call)

Shape agreed: **5 pre-draws, roughly every 2 weeks on Wednesdays, plus the gran sorteo final at the
Teletón on 11–12 Sep.** Working backward from the final, **skip the Fiestas Patrias week (Jul 28–29).**
Start around **mid/late July**. Each pre-draw has at least one confirmed solidarity prize:

- desayuno para dos (first/smallest draw)
- cena (Costa del Sol)
- noche de hotel
- pasaje nacional
- pasaje internacional

The exact 5 dates were debated live and not closed — the team confirms them and sends them. A notary
must be present at each draw. (Note: this supersedes the old "warm-up end of August + main 12 Sep" framing
in `PRODUCT.md`; update that doc once dates are locked.)

---

## 6. Inputs owed by the team / Sebas before build

- **Hero art** (Alex + Churchill): banner artwork with prizes to the side + the inspirational
  beneficiary image. Sent to Sebas.
- **"Cómo funciona" copy** (Sebas → this afternoon): the exact structure/text, including notary line and
  the "más tickets = gran sorteo final" message.
- **FAQ content** (Sebas: screenshot of the question set).
- **The 5 pre-draw dates + the confirmed prize per date** (team).
- **PDF of the restructure / new ideas** (team, same as last session) — the formal go-ahead to implement.

---

## 7. Open decisions to confirm (don't build until answered)

1. **Carry-forward pool**: accumulating single pool vs. 6 raffles with copy-forward. (Recommend
   accumulating pool.)
2. **Person-level win exclusion**: confirm a winner is removed from ALL future draws (not just that draw).
3. **Final goal number**: 50,000 confirmed?
4. **Does a non-winning chance enter the final automatically, or only if the buyer opts in?** (Call said
   automatic.)
5. Dates per §5.

---

## Build order (once inputs land)

1. Reorder sections (§1) — low risk, mostly moving existing components.
2. Hero prize-slider + countdown + inspirational image slot (§1.2, §2).
3. Goal → 50,000 + make configurable (§2).
4. Prize-card date + "Entregado" status (§3) + admin edit.
5. Floating "Quiero participar" → form (§4).
6. **Accumulating chance pool + person-level win exclusion (§0)** — the heavy item; do last and test hard,
   it touches `select.ts`, the draw commit/reveal flow, and the pool snapshot.
