Your First Hour-One Demo Funnel Snapshot CSV From Steam Wishlist Clicks in One Evening - 2026

February fest hour one: wishlists jump, Discord celebrates, and someone asks whether players are launching the demo or only clicking the store page. By hour three, #fest-ops argues about a hotfix while nobody saved a single CSV row tying wishlist clicks → demo launches → first-session quits to visible build label.
February 2027 Steam Next Fest live week needs hour-one funnel truth—not another metadata parity checklist. Steamworks reporting and partner exports moved faster than Discord anecdotes; micro-studios that filed February live week timebox caps still need a D4 pager block dedicated to this snapshot. Refund dashboards answer 48-hour lag questions—this evening answers hour-one drop-off before refunds exist.
This Tutorials & Beginner-First pipeline produces hour_one_funnel_snapshot_receipt_v1.json with gates F1–F6, a normalized hour-one-funnel-2027.csv, and jq day-over-day diffs against the prior fest day row.
Non-repetition note: Wishlist UTM tagging experiment owns source attribution over weeks. Refund signal dashboard owns refund language + build_id. Hour-one parity checklists own store metadata surfaces. This URL owns one evening CSV for wishlist click → demo launch → first-session quit per fest day with receipt gates—analytics, not compliance copy.
Pair February live week timebox, February RC label evening, BUILD_RECEIPT beginner, forward blog #9 refund spike worksheet, Resource #35 forward, Help #37 forward, Course 277 forward.
Why this matters now (February 2027 live week)
- Wishlist spikes ≠ demo health — Store traffic can rise while launch rate falls after a bad
setliveor broken depot. - Hour-one quit rate leads refunds — Players who bounce in the first session refund two days later—funnel CSV is early warning; pair blog #9 threshold worksheet.
- Live week timebox D4 — February timebox reserves D4 for this pass—without CSV, pager hours become arguments.
- BUILD_RECEIPT correlation —
build_labelon funnel rows must match RC label receipt or diffs lie. - Partner stand-ups — One jq diff beats twelve screenshots of Steamworks graphs.
Direct answer: Export or transcribe wishlist clicks, demo launches, and first-session quits for fest day N hour 1, normalize into CSV, compute launch_rate and hour_one_quit_rate, file hour_one_funnel_snapshot_receipt_v1.json, jq diff against day N-1, set BUILD_RECEIPT hour_one_funnel_snapshot_ok: true when F1–F6 pass.
What you will finish tonight
| Audience | Outcome |
|---|---|
| Beginner | One CSV row per fest day with plain column meanings |
| Solo founder | Know if hour-one quit spiked before promoting a hotfix |
| Working dev | Receipt + jq diff script for stand-ups |
| Producer | Evidence for “wait until D2 data” vs panic patch |
Time: 75–90 minutes first evening; 15 minutes per additional fest day.
Prerequisites: Live fest demo branch, Steamworks partner access, build_label from BUILD_RECEIPT, demo smoke GREEN on promoted build.
Beginner path — CSV schema
Create release-evidence/analytics/hour-one-funnel-2027.csv:
fest_day,utc_date,hour_window_start,hour_window_end,wishlist_clicks,demo_launches,first_session_quits,build_label,launch_rate,hour_one_quit_rate,notes
D1,2027-02-23T18:00:00Z,2027-02-23T18:00:00Z,2027-02-23T19:00:00Z,1240,310,92,fest-demo-2027-02-rc1,0.250,0.297,store page hero A
D2,2027-02-24T18:00:00Z,2027-02-24T18:00:00Z,2027-02-24T19:00:00Z,980,245,88,fest-demo-2027-02-rc1,0.250,0.359,threads mention menu hitch
Column definitions
| Column | Meaning | Beginner tip |
|---|---|---|
wishlist_clicks |
Store actions counting toward wishlist intent in window | Use Steamworks export column name in notes |
demo_launches |
Players who started demo install/play in window | Not unique users unless export says so—document in notes |
first_session_quits |
Quit before tutorial complete / 5 min / your golden path | Define once in FUNNEL_DEFINITION.md |
launch_rate |
demo_launches / wishlist_clicks |
Guard divide-by-zero |
hour_one_quit_rate |
first_session_quits / demo_launches |
Honest denominator only |
build_label |
Player-visible or BUILD_RECEIPT label | Must match RC receipt |
Beginner rule: If Steamworks does not expose hour granularity, use first calendar hour after fest open and document approximation in notes—F4 requires honesty, not fake precision.
Developer path — gates F1–F6
| Gate | Pass criterion |
|---|---|
| F1 | CSV contains required columns + ≥1 row for target fest_day |
| F2 | build_label matches BUILD_RECEIPT / RC label receipt |
| F3 | Prior fest day row exists when fest_day > D1 (for jq diff) |
| F4 | hour_one_quit_rate recomputed from raw counts—no hand-typed rate cells |
| F5 | hour_one_funnel_snapshot_receipt_v1.json under release-evidence/analytics/ |
| F6 | hour_one_funnel_snapshot_ok: true on BUILD_RECEIPT (optional CI) |
hour_one_funnel_snapshot_receipt_v1.json (template)
{
"schema": "hour_one_funnel_snapshot_receipt_v1",
"fest_window": "2027-02-next-fest-live",
"fest_day": "D2",
"generated_at": "2027-02-24T20:15:00Z",
"csv_path": "release-evidence/analytics/hour-one-funnel-2027.csv",
"funnel_definition": "first_session_quit = exit before tutorial_complete event",
"row": {
"wishlist_clicks": 980,
"demo_launches": 245,
"first_session_quits": 88,
"build_label": "fest-demo-2027-02-rc1",
"launch_rate": 0.25,
"hour_one_quit_rate": 0.359
},
"prior_day_diff": {
"fest_day_prev": "D1",
"hour_one_quit_rate_delta": 0.062,
"launch_rate_delta": 0.0
},
"hour_one_funnel_snapshot_ok": true
}
BUILD_RECEIPT pointer:
{
"hour_one_funnel_snapshot_ok": true,
"hour_one_funnel_snapshot_receipt": "release-evidence/analytics/HOUR_ONE_FUNNEL_SNAPSHOT_RECEIPT.json"
}
verify_hour_one_funnel_snapshot.sh
#!/usr/bin/env bash
set -euo pipefail
REC="${1:-release-evidence/analytics/HOUR_ONE_FUNNEL_SNAPSHOT_RECEIPT.json}"
CSV="${2:-release-evidence/analytics/hour-one-funnel-2027.csv}"
jq -e '.schema == "hour_one_funnel_snapshot_receipt_v1"' "$REC" || exit 1
jq -e '.row.build_label != ""' "$REC" || exit 2
test -f "$CSV" || exit 3
# Recompute quit rate
launch=$(jq -r '.row.demo_launches' "$REC")
quit=$(jq -r '.row.first_session_quits' "$REC")
rate=$(jq -r '.row.hour_one_quit_rate' "$REC")
python3 - <<PY
launch, quit, rate = $launch, $quit, float("$rate")
assert launch > 0
assert abs(quit/launch - rate) < 0.001
PY
jq -e '.hour_one_funnel_snapshot_ok == true' "$REC" || exit 6
echo "hour_one_funnel_snapshot verify: OK"
jq day-over-day diff
# Append rates from CSV into JSON lines for jq
tail -n +2 release-evidence/analytics/hour-one-funnel-2027.csv | \
awk -F, '{printf "{\"fest_day\":\"%s\",\"hour_one_quit_rate\":%s,\"launch_rate\":%s}\n",$1,$10,$9}' | \
jq -s '.'
# Diff D2 vs D1 quit rate
jq -s '
(map(select(.fest_day=="D1"))[0].hour_one_quit_rate) as $p |
(map(select(.fest_day=="D2"))[0].hour_one_quit_rate) as $c |
{prev:$p, curr:$c, delta: ($c - $p)}
' <(tail -n +2 hour-one-funnel-2027.csv | awk -F, '{print "{\"fest_day\":\""$1"\",\"hour_one_quit_rate\":"$10"}"}')
Stand-up rule: If hour_one_quit_rate_delta > +0.08 with stable launch_rate, investigate gameplay before store copy—pair Bevy menu hitch or crash symbolicate evening.
One-evening schedule
| Block | Minutes | Output |
|---|---|---|
| 1 | 15 | Write FUNNEL_DEFINITION.md (what counts as first-session quit) |
| 2 | 25 | Export Steamworks / partner CSV slices for hour window |
| 3 | 20 | Normalize into hour-one-funnel-2027.csv + recompute rates |
| 4 | 15 | Author receipt + prior-day diff |
| 5 | 10 | Run verify script + patch BUILD_RECEIPT |
| 6 | 5 | Post jq delta to #fest-ops stand-up |
Steamworks export notes (working dev)
Steam partner reporting changes by app configuration—document your column mapping in receipt notes:
| Source view | Typical mapping | Caveat |
|---|---|---|
| Store traffic / wishlist reports | wishlist_clicks |
May be daily—split evenly only with notes: approximated |
| Demo / playtime activations | demo_launches |
Confirm fest demo depot filter |
| Custom telemetry | first_session_quits |
Requires privacy-safe telemetry if using PostHog/UGS |
Fail-closed: If first_session_quits unavailable, set quits to unknown and F4 fails until telemetry lands—do not invent quits from refund proxies same hour.
Outbound: Steamworks documentation — sales and activations reporting.
Integration with live week timebox
February timebox assigns D4 pager outcome to this snapshot. Workflow:
- Complete funnel CSV before expanding D4 community cap for refund tone posts.
- If
hour_one_quit_rate_deltaRED, pager cap absorbs repro—defer creator DMs to batch window. - Attach receipt path to nightly
february-live-actuals-2027.csvnotes column.
Forward refund spike worksheet (blog #9) when D2–D4 funnel RED two days in a row.
Proof table
| Row | Evidence | GREEN when |
|---|---|---|
| P1 | hour-one-funnel-2027.csv |
F1 pass |
| P2 | FUNNEL_DEFINITION.md |
Quit definition signed |
| P3 | HOUR_ONE_FUNNEL_SNAPSHOT_RECEIPT.json |
F1–F6 pass |
| P4 | jq diff output saved | Prior day present or D1 documented |
| P5 | BUILD_RECEIPT hour_one_funnel_snapshot_ok |
Matches receipt |
| P6 | RC label receipt | Same build_label |
Scenarios A–G
A — Launch rate collapses, quit rate flat
Suspect store/demo button or depot—not gameplay. Check fest-day setlive mismatch case study before hotfix.
B — Quit rate spikes, launch rate stable
Pager lane owns repro; community posts known issue template only.
C — Wishlist flat, launches flat
Marketing/community problem—not engineering pager; do not burn hotfix hours.
D — D1 only row (no prior day)
F3 waived with prior_day_diff: null and notes: first_fest_day in receipt.
E — Two build labels in same hour
Split rows—never blend quits across labels; violates F2.
F — Telemetry delayed 24h
Mark receipt YELLOW; repeat snapshot D5 with backfilled hour—document in Sunday closeout (blog #11).
G — Partner asks funnel proof
Export CSV + jq diff + receipt JSON—same bundle as Q4 diligence telemetry rows.
Engine telemetry hooks
| Engine | First-session quit signal |
|---|---|
| Unity | tutorial_complete or session_end < 300s with scene_index==0 |
| Godot | Autoload SessionMetrics.first_quit on NOTIFICATION_WM_CLOSE_REQUEST |
| GameMaker | Steam stat STAT_FIRST_QUIT increment on room0 exit |
| Construct | Browser beforeunload + serverless counter—watch ad-block false negatives |
Document event names in FUNNEL_DEFINITION.md—F4 audit compares to export.
PowerShell verify cousin
$rec = Get-Content "release-evidence/analytics/HOUR_ONE_FUNNEL_SNAPSHOT_RECEIPT.json" | ConvertFrom-Json
if ($rec.schema -ne "hour_one_funnel_snapshot_receipt_v1") { exit 1 }
$launch = [double]$rec.row.demo_launches
$quit = [double]$rec.row.first_session_quits
$rate = [double]$rec.row.hour_one_quit_rate
if ($launch -le 0) { exit 4 }
if ([math]::Abs(($quit / $launch) - $rate) -gt 0.001) { exit 4 }
if (-not $rec.hour_one_funnel_snapshot_ok) { exit 6 }
Write-Host "hour_one_funnel_snapshot verify: OK"
Comparison pack (funnel vs cousin analytics)
| Artifact | Owns | Lag |
|---|---|---|
| UTM wishlist experiment | Source tags over 21 days | Days |
| Refund signal dashboard | Refund language + build_id | 24–72 h |
| Metadata hour-one parity | Store copy compliance | Pre-live |
| Hour-one funnel snapshot | Click → launch → quit | Hour 1 |
Common mistakes
Using refunds as quit proxy in hour one — Refunds lag; funnel receipt lies.
Hand-typing rates in CSV — F4 fails verify; always derive from counts.
Mixing build labels in one row — Breaks F2 and jq diffs.
Skipping FUNNEL_DEFINITION — Team debates quits vs crashes without schema.
Chasing trailer edits when launch_rate dropped — Fix depot/setlive first.
RED / YELLOW / GREEN routing rubric
Use after jq diff each fest morning:
| Signal | Condition | Route |
|---|---|---|
| GREEN | hour_one_quit_rate_delta ≤ +0.05 and launch_rate_delta ≥ -0.03 |
Community lane owns posts; pager holds hotfix |
| YELLOW | Quit delta +0.05…+0.08 OR launch delta -0.03…-0.08 | Pager investigates; no setlive without smoke |
| RED | Quit delta > +0.08 OR launch delta < -0.08 | Pager absorbs D4 cap; defer marketing promises; pair HOTFIX exception opinion (#10 consumed) |
Log routing in receipt routing field:
"routing": {
"band": "YELLOW",
"action": "menu_hitch_repro_before_community_posts",
"owner": "pager_lane"
}
FUNNEL_DEFINITION.md starter
# Hour-one funnel definition — February 2027
- **Window:** UTC hour starting at fest daily open (document offset in CSV notes).
- **wishlist_clicks:** Steamworks column `Wishlist` count in window (app id filter: fest demo parent).
- **demo_launches:** First demo play/start events in window (includes re-installs—document in notes).
- **first_session_quit:** Player exits before `tutorial_complete` OR before 300s in `MainMenu`—whichever occurs first.
- **Excluded:** Players who crash before menu (count in crash receipt, not quit funnel).
- **Owner:** Producer signs definition before D1; changes require receipt version bump.
Worked example — D1 through D3 (synthetic)
| Day | wishlist | launches | quits | launch_rate | quit_rate | delta quit |
|---|---|---|---|---|---|---|
| D1 | 1240 | 310 | 92 | 0.250 | 0.297 | — |
| D2 | 980 | 245 | 88 | 0.250 | 0.359 | +0.062 YELLOW |
| D3 | 1100 | 220 | 66 | 0.200 | 0.300 | -0.059 launch RED |
D3 read: Launch rate drop with recovering quit rate suggests store/depot friction returning—check GameMaker setlive evening before gameplay hotfix.
Stand-up post:
## Funnel stand-up D3
- Receipt: hour_one_funnel_snapshot_ok true
- quit_rate: 0.300 (delta -0.059 vs D2)
- launch_rate: 0.200 (delta -0.050 vs D2) → RED launch band
- build_label: fest-demo-2027-02-rc1 (matches RC receipt)
- Action: verify setlive + depot before HOTFIX-003
Facilitator CSV hygiene
- Store raw Steamworks export in
release-evidence/analytics/raw/D2-wishlist-export.csv—do not edit raw files. - Normalized file is derived copy only.
- Version
hour-one-funnel-2027.csvwith git—never overwrite prior fest day rows. - Attach receipt
csv_sha256when partners request integrity:
sha256sum release-evidence/analytics/hour-one-funnel-2027.csv
BUILD_RECEIPT row catalog extension
| Column | Type | When updated |
|---|---|---|
hour_one_funnel_snapshot_ok |
boolean | After each D1–D7 snapshot |
hour_one_funnel_last_fest_day |
string | e.g. D4 |
hour_one_quit_rate_last |
number | From receipt row |
hour_one_funnel_routing |
string | GREEN / YELLOW / RED |
Thursday row review can diff hour_one_quit_rate_last across fest week—cousin to loudness_spot_ok diffs on playtest receipts.
Related GamineAI reads
- February live week timebox evening
- Steam refund signal dashboard
- February RC branch label evening
- Wishlist page truth audit challenge
- Wednesday demo smoke ritual
- 18 playtest feedback tools
- Forward: Refund spike threshold worksheet (blog #9)
- Forward: 5-night live ops pager challenge (blog #4)
Key takeaways
- Hour-one funnel truth is wishlist clicks → demo launches → first-session quits—not metadata parity.
hour_one_funnel_snapshot_receipt_v1.jsongates F1–F6 with honest rate recomputation.- One evening wires CSV, FUNNEL_DEFINITION, verify script, and BUILD_RECEIPT column.
- jq day-over-day diff on
hour_one_quit_ratedrives live-week pager vs community split. - Pair February live week timebox D4 block.
- Refund dashboard is downstream—funnel is hour-one early warning.
build_labelmust match RC label receipt.- Refund spike threshold worksheet when funnel RED persists—#9 consumed (daily D1–D7 % caps).
- Course 277 + Resource #35 forward own milestone receipts; this owns CSV evening.
verify_hour_one_funnel_snapshot.shgives CI one exit code.- Define quit once in
FUNNEL_DEFINITION.md—no moving goalposts mid-fest. - Flat launch during CDN saturation pairs February live-week queue playbook Q4
comms_only—after label unity.
FAQ
Is this a Steamworks metadata checklist?
No—compliance copy lives in parity cluster URLs; this is analytics CSV.
Can we use Google Analytics instead?
Yes if first_session_quits is defined consistently—still file receipt with export mapping in notes.
What if wishlist_clicks is zero?
Do not compute launch_rate; mark YELLOW and fix store visibility before fest hour.
How does this relate to the live week timebox?
D4 pager outcome should complete this pass before community refund tone posts.
Does Help #37 forward apply?
Export parse failures are upstream—fix CSV ingest before funnel rates.
What ships next in February cluster?
Blog-Create #3 — 14 free February fest live-ops Discord/Steam moderation tools.
Can funnel CSV replace playtest VOD triage?
No—Whisper batch and local pipeline own qualitative repro; funnel is aggregate hour-one counts.
Should we publish funnel numbers publicly?
Optional—receipt is for internal stand-ups; round numbers in community posts unless legal approves precise metrics.
What if we run two demos during fest?
Split CSV rows by build_label and depot—never blend quits across SKUs in one row (scenario E).
How often to refresh hour-one snapshot?
Once per fest day minimum; some teams add hour 6 row after D1 RED—log second row with hour_window suffix in fest_day notes, not duplicate D1 without version note.
Where do raw exports live?
release-evidence/analytics/raw/ per fest day—normalized CSV is derived; sha256 the normalized file in receipt when partners ask for integrity proof.