February Fest Refund Spike Threshold Worksheet When Wishlist Converts to Demo - 2026

February fest day three: wishlists jumped Tuesday after a creator clip. Installs followed Wednesday. Support is quiet. Finance opens Steamworks Friday and refunds are +2.1% versus your October baseline—while hour-one funnel went YELLOW on quit rate Thursday and nobody filed a receipt.
February 2027 live week punishes teams who treat refunds as a post-fest finance surprise. Wishlist spikes convert to demo installs 48–72 hours before refund language spikes—often while jq hourly live ops still shows GREEN build_label rows. You need numeric stop rules per fest day, not a Discord thread titled "are refunds bad?"
This Money & Business worksheet ships february_refund_spike_receipt_v1.json, gates R1–R6, verify_february_refund_spike.sh, a D1–D7 daily refund % threshold table, and BUILD_RECEIPT refund_spike_watch_ok—strategy above the beginner refund signal dashboard, below Resource #37 forward and Course 277 forward.
Non-repetition note: Refund signal dashboard owns evening CSV observability for any fest. Steam refund spike diagnostics owns patch-week event taxonomy. January marketing cap owns weekly marketing cash. This URL owns live-week daily refund % thresholds when wishlist → demo conversion spikes during D1–D7.
Pair hour-one funnel F1–F6, February live week timebox, jq hourly live ops J1–J6, and January marketing cap K1–K6.
Why this matters now (February 2027 live week)
- Wishlist lag — Creator clips and fest featuring move wishlists before installs; refunds trail installs by 48–72h—thresholds must be per fest day, not monthly averages.
- Funnel early warning — Hour-one quit rate YELLOW on D2 often precedes refund RED on D4—worksheet wires both without merging schemas.
- Paid burst risk — January marketing cap paused ads on smoke RED; live week needs refund stop rules that pause paid social when
refund_rate_48hcrosses RED—even if engineering is mid-HOTFIX. - Pager noise — 5-night pager challenge P4 routes funnel + moderation; refund thresholds give producers a non-pager lane for finance signals.
- Sunday closeout — Forward #11 closeout row review needs
february_refund_spike_daily_log.jsonl—not reconstructed from Steamworks screenshots.
Direct answer: Fill february-refund-spike-threshold-2027.md with D1–D7 refund % caps, 48h rolling rate formula, stop rules SR1–SR5, file february_refund_spike_receipt_v1.json, run verify_february_refund_spike.sh, set BUILD_RECEIPT refund_spike_watch_ok: true before declaring live-week marketing GREEN.
Who this worksheet is for
| Audience | Outcome |
|---|---|
| Solo founder | Printable daily caps you can cite in #fest-live-ops |
| Producer | Pause paid social when refund RED without engineering debate |
| Working dev | refund_spike_watch_ok row + jq diff against funnel CSV |
| Finance | Partner-ready daily log—not month-end surprise |
Time: ~50 minutes first worksheet; 8 minutes each fest morning update actual_refund_rate_48h.
Prerequisites: Refund signal dashboard CSV or Steamworks refund export access, hour-one funnel CSV for D1–D7, October or January baseline refund rate documented honestly.
Format ladder (February cluster)
| Artifact | Role |
|---|---|
| Refund dashboard | Evening CSV + weekly Friday review |
| Hour-one funnel | Launch/quit rates per fest day |
| This worksheet | Daily refund % thresholds D1–D7 |
| jq hourly live ops | Hourly BUILD_RECEIPT row diff |
| January marketing cap | Pre-live weekly marketing cash |
| Forward #10 HOTFIX opinion | Mid-fest promotion exceptions |
Order: Funnel CSV filed → this worksheet thresholds signed → jq hourly indexes refund_spike_watch_ok → pager P4 crosswalk.
Beginner path — D1–D7 refund threshold table
Copy into release-evidence/ops/february-refund-spike-threshold-2027.md:
| Fest day | Wishlist spike expected? | Max refund rate 48h (%) | Yellow at (%) | Red at (%) | Primary stop rule |
|---|---|---|---|---|---|
| D1 | Moderate (fest open) | 1.8 | 1.4 | 1.8 | SR1 — pause paid social |
| D2 | High (creator day) | 2.2 | 1.7 | 2.2 | SR2 — hold community promises |
| D3 | Peak installs | 2.5 | 2.0 | 2.5 | SR3 — pager consult if funnel RED |
| D4 | Refund lag hits | 2.8 | 2.2 | 2.8 | SR4 — no HOTFIX without #10 |
| D5 | Mid-fest fatigue | 2.4 | 1.9 | 2.4 | SR1 |
| D6 | Weekend clip replay | 2.6 | 2.1 | 2.6 | SR2 |
| D7 | Closeout noise | 2.0 | 1.6 | 2.0 | SR5 — defer post-fest ads |
Beginner rule: refund_rate_48h = refunds in trailing 48 hours ÷ demo installs in trailing 48 hours × 100. Use Steamworks exports or honest manual counts—do not invent precision.
Baseline: Document baseline_refund_rate_pct from your last fest or last 30-day demo window (e.g. 1.2%). Thresholds above assume micro-studio demo scope—tighten if your baseline is lower.
Success check: Each morning stand-up answers: "Are we YELLOW or RED on today's row?" without opening three browser tabs.
Stop rules SR1–SR5 (copy to stand-up pin)
| Rule | Trigger | Action |
|---|---|---|
| SR1 | YELLOW on current fest day | Pause paid social until next morning sample |
| SR2 | RED on current fest day | Hold feature/marketing promises in Discord/Steam news |
| SR3 | RED + funnel quit_rate YELLOW | Pager P4 consult—gameplay vs store-copy |
| SR4 | RED + build_label change requested |
Forward #10 HOTFIX exception list before promote |
| SR5 | D7 RED | Defer post-fest ads until Sunday closeout #11 filed |
Producer sign-off: No SR rule fires on vibes—attach february_refund_spike_receipt_v1.json path to stand-up thread.
Developer path — gates R1–R6
| Gate | Check | Fail action |
|---|---|---|
| R1 | Schema + fest_window | Fix february_refund_spike_receipt_v1 |
| R2 | fest_day in D1–D7 |
Fill current fest day |
| R3 | Threshold row exists for fest_day |
Complete worksheet table |
| R4 | refund_rate_48h computed |
Attach export path in notes |
| R5 | Funnel crosswalk | hour_one_funnel_receipt path resolvable |
| R6 | refund_spike_watch_ok |
All R1–R5 pass + stop rule documented |
R5 fail-closed: If funnel receipt missing, route hour-one funnel evening before refund comms.
february_refund_spike_receipt_v1.json (schema)
{
"schema": "february_refund_spike_receipt_v1",
"fest_window": "2027-02-next-fest-live",
"fest_day": "D4",
"observed_utc": "2027-02-25T14:00:00Z",
"baseline_refund_rate_pct": 1.2,
"refund_rate_48h": 2.6,
"installs_48h": 1840,
"refunds_48h": 48,
"threshold_yellow_pct": 2.2,
"threshold_red_pct": 2.8,
"stop_rule": "SR4",
"status": "RED",
"snapshot": {
"hour_one_funnel_receipt": "release-evidence/funnel/HOUR_ONE_FUNNEL_SNAPSHOT_D4.json",
"hour_one_quit_rate": 0.44,
"february_fest_live_ops_hourly_ok": true,
"marketing_spend_paused": true
},
"gates": {
"R1_schema": "pass",
"R2_fest_day": "pass",
"R3_threshold_row": "pass",
"R4_rate_computed": "pass",
"R5_funnel_crosswalk": "pass",
"R6_receipt_filed": "pass"
},
"refund_spike_watch_ok": true
}
Daily log (jsonl)
release-evidence/february-live/february_refund_spike_daily_log.jsonl — one line per fest morning:
{"fest_day":"D4","observed_utc":"2027-02-25T14:00:00Z","refund_rate_48h":2.6,"status":"RED","stop_rule":"SR4","receipt_path":"release-evidence/february-live/FEBRUARY_REFUND_SPIKE_RECEIPT_D4.json"}
verify_february_refund_spike.sh
#!/usr/bin/env bash
set -euo pipefail
REC="${1:-release-evidence/february-live/FEBRUARY_REFUND_SPIKE_RECEIPT_LATEST.json}"
jq -e '.schema == "february_refund_spike_receipt_v1"' "$REC" || exit 1
jq -e '.fest_day != null and (.fest_day | test("^D[1-7]$"))' "$REC" || exit 2
jq -e '.threshold_red_pct != null and .threshold_yellow_pct != null' "$REC" || exit 3
jq -e '.refund_rate_48h != null and .installs_48h >= 1' "$REC" || exit 4
jq -e '.snapshot.hour_one_funnel_receipt != null' "$REC" || exit 5
jq -e '.refund_spike_watch_ok == true' "$REC" || exit 6
# RED must name stop_rule
jq -e 'if .status == "RED" then .stop_rule != null else true end' "$REC" || exit 7
echo "february_refund_spike verify: OK"
PowerShell verify cousin
$Rec = "release-evidence/february-live/FEBRUARY_REFUND_SPIKE_RECEIPT_LATEST.json"
$j = Get-Content $Rec -Raw | ConvertFrom-Json
if ($j.schema -ne "february_refund_spike_receipt_v1") { exit 1 }
if ($j.fest_day -notmatch "^D[1-7]$") { exit 2 }
if (-not $j.refund_rate_48h) { exit 4 }
if (-not $j.snapshot.hour_one_funnel_receipt) { exit 5 }
if (-not $j.refund_spike_watch_ok) { exit 6 }
Write-Host "february_refund_spike verify: OK"
Exit code table
| Exit | Meaning | Fix |
|---|---|---|
| 0 | R1–R6 pass | Marketing lane follows status |
| 1 | Wrong schema | Fix receipt filename |
| 2 | Invalid fest_day | Set D1–D7 |
| 3 | Missing thresholds | Complete worksheet row |
| 4 | Rate not computed | Attach Steamworks export |
| 5 | Funnel path missing | Run funnel evening first |
| 6 | refund_spike_watch_ok false |
Complete gates |
| 7 | RED without stop_rule | Name SR1–SR5 |
jq sketches (funnel + refund crosswalk)
Compare quit_rate vs refund status
FUNNEL=release-evidence/funnel/HOUR_ONE_FUNNEL_SNAPSHOT_D4.json
REC=release-evidence/february-live/FEBRUARY_REFUND_SPIKE_RECEIPT_LATEST.json
jq -s '
.[0] as $f | .[1] as $r |
{
fest_day: $r.fest_day,
quit_rate: $f.hour_one_quit_rate,
refund_rate_48h: $r.refund_rate_48h,
refund_status: $r.status,
route: (if $f.hour_one_quit_rate > 0.42 and $r.status == "RED"
then "SR3 pager consult"
else "producer lane" end)
}
' "$FUNNEL" "$REC"
Append daily jsonl line
jq -c '{
fest_day, observed_utc, refund_rate_48h, status, stop_rule,
receipt_path: "release-evidence/february-live/FEBRUARY_REFUND_SPIKE_RECEIPT_LATEST.json"
}' "$REC" >> release-evidence/february-live/february_refund_spike_daily_log.jsonl
Pair jq hourly live ops when february_fest_live_ops_hourly_ok must snapshot refund_spike_watch_ok beside funnel rows.
BUILD_RECEIPT wiring
{
"build_label": "fest-demo-2027-02-rc2",
"refund_spike_watch_ok": true,
"february_refund_spike_receipt": "release-evidence/february-live/FEBRUARY_REFUND_SPIKE_RECEIPT_LATEST.json",
"february_refund_spike_daily_log": "release-evidence/february-live/february_refund_spike_daily_log.jsonl",
"marketing_spend_paused": false
}
Latch order during live week:
- Morning: compute
refund_rate_48h, file daily receipt, append jsonl. - If YELLOW/RED: flip
marketing_spend_pausedper SR rules—cousin January marketing cap stop rules. - Hourly jq receipt snapshots
refund_spike_watch_ok—does not replace R1–R6 gates.
Integration with February cluster #1–#8
| Row | Refund worksheet coupling |
|---|---|
| #1 timebox | Refund watch is non-pager morning lane |
| #2 funnel | R5 crosswalk + SR3 routing |
| #4 pager | SR3 consult when funnel + refund RED |
| #6 queue | Do not blame queue for refund spike without R4 proof |
| #8 jq hourly | Snapshot refund_spike_watch_ok in hourly row_diff |
Worked example — D4 wishlist-to-refund lag
| Time | Event | Worksheet action |
|---|---|---|
| D2 18:00 | Creator clip → wishlist +18% | Note in notes; thresholds unchanged |
| D3 09:00 | Installs spike; funnel quit_rate 0.39 | GREEN funnel; continue SR watch |
| D3 22:00 | quit_rate 0.43 YELLOW | File funnel receipt; warn in stand-up |
| D4 08:00 | refund_rate_48h 2.6% RED |
File receipt; SR4; pause paid social |
| D4 10:00 | Engineer requests HOTFIX | Forward #10 exception list |
| D4 14:00 | verify script exit 0 | refund_spike_watch_ok true on BUILD_RECEIPT |
Producer rule: Do not post "we hear you on performance" until R4 shows rate—not funnel vibes alone.
Facilitator morning script (8 min)
## February refund spike morning (D?)
- [ ] Export installs + refunds trailing 48h
- [ ] Compute refund_rate_48h vs today's threshold row
- [ ] Load hour_one_funnel_receipt for same fest_day
- [ ] File february_refund_spike_receipt_v1.json
- [ ] Run verify_february_refund_spike.sh → exit 0
- [ ] If YELLOW/RED → name SR1–SR5 in stand-up
- [ ] Append february_refund_spike_daily_log.jsonl
- [ ] Update BUILD_RECEIPT refund_spike_watch_ok
Proof table
| Row | Evidence | GREEN when |
|---|---|---|
| P1 | Daily receipt JSON | R1 pass |
| P2 | Worksheet threshold row | R3 pass |
| P3 | Steamworks export path | R4 pass |
| P4 | Funnel receipt path | R5 pass |
| P5 | jsonl morning line | Logged |
| P6 | verify script exit 0 | R1–R6 pass |
Scenarios A–G
A — D1 below baseline — Status GREEN; still file receipt (proves watch active).
B — D2 YELLOW, funnel GREEN — SR1 pause paid social only.
C — D3 RED, funnel YELLOW — SR3 pager consult; do not HOTFIX blindly.
D — D4 RED, label drift — SR4 + setlive case study routing.
E — Refund spike, queue slow — Queue Q4 comms_only—separate from SR rules.
F — Marketing cap conflict — January cap paused ads; this worksheet resumes only when status returns GREEN two mornings.
G — D7 closeout — SR5 defer ads; hand jsonl to forward #11 Sunday closeout.
Comparison pack (refund artifacts)
| Artifact | Cadence | Schema |
|---|---|---|
| Refund dashboard CSV | Weekly Friday | refund-signals.csv |
| Patch-week diagnostics | Per patch | event taxonomy |
| This worksheet | Daily D1–D7 | february_refund_spike_receipt_v1 |
| October fest spend cap | Pre-fest pool | marketing runway |
Common mistakes
Monthly average during live week — D4 RED hides inside a "fine" monthly rate.
Wishlist celebration without install denominator — Refund % needs installs_48h, not wishlist count.
Skipping funnel crosswalk — Store-copy refunds look like gameplay bugs in stand-up.
HOTFIX on RED without SR4 — Forward #10 before promote.
Duplicate refund dashboard — Keep CSV for language tags; this receipt owns daily % thresholds.
Printable producer card
# february_refund_spike morning (pin near finance)
1. refunds_48h ÷ installs_48h → rate
2. Compare to today's D? yellow/red row
3. Load funnel receipt same fest_day
4. verify_february_refund_spike.sh → exit 0
5. YELLOW → SR1 pause ads
6. RED → SR2–SR4 per table
7. Append jsonl + BUILD_RECEIPT latch
Steamworks export notes (honest limits)
Steamworks does not ship a one-click "fest demo refund rate" API for all partners. Acceptable R4 evidence:
- Manual count from Sales & Activations + refund reports for trailing 48h
- Exported CSV snapshots stored under
release-evidence/february-live/refund-exports/ notesfield documenting export timestamp and rounding
Do not claim sub-hour precision—48h rolling windows are intentionally coarse.
Saturday rehearsal (pre-live week)
Run this once the week before D1—treat as dress rehearsal, not optional:
- Copy D1–D7 threshold table with your baseline filled in.
- Backfill three synthetic rows in
february_refund_spike_daily_log.jsonlfrom October or January data. - Run
verify_february_refund_spike.shon a sample receipt until exit 0 twice. - Pair producer + finance on SR1 wording for Discord/Steam news holds.
- Confirm hour-one funnel CSV path matches R5 crosswalk in jq sketch.
Success check: Facilitator can compute refund_rate_48h in under five minutes without asking engineering for a new export format.
Related GamineAI reads
- Hour-one funnel snapshot
- Refund signal dashboard
- jq february live ops hourly diff
- January marketing spend cap
- 5-night pager challenge
- February live week timebox
- Forward: HOTFIX exception opinion (blog #10)
- Forward: Sunday closeout row review (blog #11)
Key takeaways
- Wishlist spikes convert to refund spikes 48–72h later—thresholds must be per fest day D1–D7.
february_refund_spike_receipt_v1.jsongates R1–R6 with honestrefund_rate_48h.february_refund_spike_daily_log.jsonltimestamps morning finance truth for Sunday closeout.- SR1–SR5 pause ads, hold promises, and route pager/HOTFIX—no Discord panic.
- R5 crosswalks hour-one funnel—quit_rate YELLOW + refund RED → SR3.
- BUILD_RECEIPT
refund_spike_watch_oklatches before live-week marketing GREEN. - jq hourly #8 snapshots refund bool beside funnel rows.
- Cousin refund dashboard owns weekly CSV tags—not daily % caps.
- Forward #10 HOTFIX exception when SR4 fires on RED—#10 consumed (HOTFIX exception opinion).
- Sunday closeout C5 indexes daily jsonl debrief annex—#11 consumed.
- Resource #37 + Course 277 forward own tool/milestone cousins.
- February cluster #12 published—same-day Whisper live-week triage closes February cluster #1–#12.
FAQ
Is this the same as the refund signal dashboard?
No—dashboard owns weekly CSV + language tags; this worksheet owns daily % thresholds during live fest.
What denominator should I use?
Demo installs in trailing 48h—not wishlists, not total library owners.
Can I skip mornings when rate is GREEN?
File a minimal receipt anyway—proves watch was active for partners.
Does RED always mean gameplay bug?
Often store-copy or scope mismatch—check funnel + refund dashboard tags before HOTFIX.
What ships next in February cluster?
Blog-Create #10 — stop hotfixing fest demos without numbered HOTFIX exception list.
Closing
February live week converts wishlist hype into refund math faster than most teams expect. One daily threshold row, one morning receipt, and R1–R6 turn finance panic into BUILD_RECEIPT truth—beginners copy the D1–D7 table, working devs wire verify + jq crosswalk, producers get stop rules before paid social amplifies a RED morning.