Lesson 241: Construct Playtest Analytics Event Receipt on BUILD_RECEIPT (2026)
Direct answer: Before facilitators export GA4 playtest funnels from Construct → itch HTML5, file construct_playtest_analytics_receipt_v1.json proving an event allowlist, property denylist scan, DebugView screenshot, and surface: playtest_invite—then promote BUILD_RECEIPT construct_playtest_analytics. Distinct from Lesson 213 telemetry session receipt (first session only) and Construct analytics preflight (ninety-second checklist).

Why this matters now (June 2027 HTML5 playtest funnels)
June 2027 teams pass Lesson 222 CORP/COEP and open itch playtest cohorts the same week. Construct event sheets fire Button clicked forty times into GA4 while privacy reviewers ask for build_label proof without steam_id. Lesson 213 files telemetry_session_receipt_v1 for session_start—this lesson files construct_playtest_analytics_receipt_v1 for funnel events on BUILD_RECEIPT.
The Construct playtest analytics preflight is the editor gate—241 is the course milestone. Pair Lesson 239 tag analytics_pii → this row.
Beginner path (GA4 allowlist)
| Step | Action | Success check |
|---|---|---|
| 1 | Confirm fest smoke or subdomain wasm GREEN | A1 shell pass |
| 2 | Commit events/playtest_allowlist.json |
A2 pass |
| 3 | Wire Analytics_SendPlaytestEvent wrapper |
No raw gtag in sheets |
| 4 | Run denylist scan on sample payloads | A3 pass |
| 5 | GA4 DebugView on itch Play URL | A4 screenshot |
| 6 | File receipt + BUILD_RECEIPT | playtest_analytics_ok: true |
Time: ~58 minutes first GA4 property wire; ~20 minutes when allowlist exists.
Developer path (gates A1–A6)
| Gate | Check | Fail when |
|---|---|---|
| A1 | HTML5 shell loads on itch Play | Black canvas / COEP block |
| A2 | playtest_allowlist.json committed |
Ad-hoc event names |
| A3 | Denylist scan on payloads | user_id, email, tokenized URLs |
| A4 | DebugView shows allowlist events | PII properties visible |
| A5 | surface: playtest_invite on events |
fest_public on playtest depot |
| A6 | Receipt + BUILD_RECEIPT column | Export before A3 GREEN |
A2 — Allowlist (reference)
{
"schema": "playtest_allowlist_v1",
"build_label": "summer-playtest-2027-rc1",
"allowed_events": [
"playtest_session_start",
"playtest_tutorial_complete",
"playtest_level_1_complete",
"playtest_death",
"playtest_survey_prompt_shown"
],
"allowed_properties": ["build_label", "surface", "funnel_step"]
}
construct_playtest_analytics_receipt_v1.json
{
"schema": "construct_playtest_analytics_receipt_v1",
"build_label": "summer-playtest-2027-rc1",
"export_target": "html5_itch_playtest",
"allowlist_path": "events/playtest_allowlist.json",
"allowed_event_count": 5,
"denylist_scan": "pass",
"ga4_property_id": "G-XXXXXXXX",
"debugview_proof": "release-evidence/html5/PLAYTEST_GA4_DEBUGVIEW_2027-06-12.png",
"surface_playtest": "playtest_invite",
"paired_receipts": {
"telemetry_session": "release-evidence/privacy/TELEMETRY_SESSION_RECEIPT.json",
"corp_coep_fest": "release-evidence/html5/CORP_COEP_FEST_RECEIPT.json"
},
"gates": {
"A1_html5_shell": "pass",
"A2_allowlist": "pass",
"A3_denylist": "pass",
"A4_debugview": "pass",
"A5_surface": "pass",
"A6_build_receipt": "pass"
},
"playtest_analytics_ok": true,
"promotion_allowed": true
}
Pin under release-evidence/html5/CONSTRUCT_PLAYTEST_ANALYTICS_RECEIPT.json.
BUILD_RECEIPT row (A6)
| Column | Pass when |
|---|---|
construct_playtest_analytics |
playtest_analytics_ok: true |
telemetry_session |
Lesson 213 GREEN (cousin) |
corp_coep_fest |
Lesson 222 independent |
playtest_feedback_tag_ok |
Lesson 239 routes analytics_pii |
ALTER TABLE release_publish_gate ADD COLUMN IF NOT EXISTS
construct_playtest_analytics_blocked BOOLEAN NOT NULL DEFAULT false;
Relationship to guide vs Lesson 213
| Artifact | Role |
|---|---|
| Construct analytics preflight | A1–A6 checklist |
| Lesson 213 | Session-level no-PII |
| Lesson 222 | Wasm shell before analytics |
| This lesson | BUILD_RECEIPT construct_playtest_analytics |
| PostHog beginner blog | Wire-up cousin—not receipt authority |
Run A1 only after players reach first interactive frame—DebugView on a black canvas is invalid proof.
Key takeaways
- Session receipt ≠ funnel events—213 first, 241 second on BUILD_RECEIPT.
construct_playtest_analytics_receipt_v1is Q3 playtest-wave specific.- One wrapper function in Construct—designers cannot typo GA4 names.
- Lesson 239 — tag
analytics_piimaps here. - Q3 capstone 244 requires this column GREEN.
- Thursday review — Analytics / PII line.
- Denylist includes itch URLs with tokens in
page_location. - Do not merge into
telemetry_session_receipt—separate schemas.
Common mistakes
- Fifty
Button clickedevents from event sheets. - DebugView on press landing, not Play URL.
surface: fest_publicon playtest_invite build.- Skipping Lesson 222—zero events because shell failed.
- Exporting GA4 to facilitators before A3 denylist pass.
Troubleshooting
| Symptom | Lane |
|---|---|
| Zero events | A1 shell + gtag load |
| PII in DebugView | A3 denylist + strip properties |
| COEP blocks gtag | Lesson 222 + fest smoke |
| Wrong funnel counts | A2 allowlist orphan events |
Session without build_label |
Lesson 213 T1 |
Mini exercise (60 minutes)
- List ten raw Construct events—collapse to five allowlist names.
- Implement wrapper—fire on tutorial complete.
- Denylist scan sample JSON exports.
- Screenshot DebugView on itch Play.
- File receipt; BUILD_RECEIPT GREEN.
Continuity — Q3 2027 summer playtest wave (236–244)
| Lesson | Receipt focus |
|---|---|
| 236–240 | Art → Sentis batch |
| 241 (this) | Construct playtest analytics |
| 242–244 | WASM heap → capstone |
Previous: Lesson 240 — Unity Sentis NPC inference batch.
Next: Lesson 242 — itch WASM heap cap playtest receipt.
FAQ
Same as Construct analytics guide?
Guide = checklist; 241 = BUILD_RECEIPT column.
Same as Lesson 213?
213 = game_session_started; 241 = funnel allowlist.
Phaser HTML5 playtest?
Use Phaser heap cap preflight + Lesson 242—different receipt schema.
Need 222 GREEN?
Yes when playtest uses custom domain or workers—shell must load before A4.
GA4 playtest exports fail privacy review when event names are ad-hoc—allowlist, denylist, DebugView proof, then promote construct_playtest_analytics on BUILD_RECEIPT.