# Handoff — Title Check pre-booking (PostHog learnings + decisions) **Audience:** the next AI agent picking up the Title-Check pre-booking redesign. **Date:** 2026-07-13 · **PostHog project:** BhuMe App (228843). --- ## ⛔ SCOPE CONSTRAINT — read first **We are NOT showing the title check of the user's actual survey pre-purchase. The pre-booking screen shows a SAMPLE report only** (a canned example of what a title-check report looks like), to build trust and drive the purchase. The user's real plot data is fetched/generated **after** payment. Consequences: - The pre-booking screen has **no live portal calls, no ₹15 fetch, no caching, no per-survey preview** to worry about. Those concerns do not apply. - **Everything below about live-plot preview economics (Arms A/B/C, free IGR search, live chawadi, LiveSatbara ₹15, the preview-flow spec) is DEFERRED / out of scope.** It's documented as possible future work, not the current task. - The mockups we built render "Survey 142/2" data — **reinterpret them as a SAMPLE report layout**; the design is reusable, the "data" is just an example. **Your task:** optimize how the *sample report* is presented so more users engage its sections and convert. Design/behaviour learnings below all transfer directly (the original experiment's "sample sections" were always a sample report). --- ## 1. The experiment we analyzed - **Flag:** `tc_angle_variant` on `sc_screen_viewed`. Arms: `control`, `copy_only` (new copy, old layout), `copy_and_layout` (new copy + inline sample-section layout), `layout_only` (~8 users, ignore). - **Clean window:** cohort = users who **joined (`person.created_at`) 2026-05-13 → 2026-06-04**. Variant assignment stopped ~**06-04** (server-side flag change), 11 days before v2.0.41 shipped control-only on **06-15**. Use join date, not exposure date. - **Structural caveat:** new users were split ~**2% control / 49% copy_only / 49% copy_and_layout** — control is a tiny holdout. Treat control numbers as low-power. ## 2. What the data said (headline learnings) 1. **The redesign wins.** In-window paid conversion (`payment_completed_server`, `document_type='Title_check'`): **copy_and_layout 2.80% · copy_only 2.44% · control 0.13%** (through-now: 3.69 / 2.90 / 1.92). Redesign ≫ old screen. **copy_and_layout vs copy_only is NOT significant** (p≈0.06 through-now, p≈0.33 in-window) — the *copy* carries most of it; the inline layout is a soft, unproven edge. 2. **Conversion is a fast, first-session decision.** **77% of payers pay on their first active day; ~91% within two.** Paid rate *declines* the more days it takes. → Optimize the **first session**; do NOT rely on re-engagement. (An earlier "returning users convert 4×" reading was **reverse causality** — payers return to view the doc they bought. Corrected.) 3. **Sample-section engagement is the strongest leading indicator.** Tapping sections → **4–9× conversion**, clear dose-response (1→3 sections: 5% → 9%). BUT **correlational** (engagers are self-selected high-intent) — not proven causal. Do not claim "add sections → +X%". 4. **Most users don't engage the sample sections.** Only **27%** tapped any; **73%** didn't. **`sc_sample_section_viewed` fires 1:1 with `sc_sample_section_tapped`** → there is **NO passive impression event**, so we can't tell "never seen (below fold)" from "seen, ignored." Only **5.7%** expanded the grid; **41.5%** tapped back. The screen is **secondary** — users spend ~3× more time on the 7/12 doc flow (`ud_screen_viewed`). 5. **~99% Android** (iOS ~1.3%). The iOS Razorpay block is **not** a confound. 6. **Per-section (correlational):** `mutations` = most-opened (the hook); `encumbrances`/`owners` convert highest. ## 3. Query conventions (so you reproduce numbers correctly) - Cohort by **join date** (`person.created_at`) in the window; **arm = `argMin(tc_angle_variant)` at first `sc_screen_viewed`**. - **In-window** paid = clean/contemporaneous (use this); **through-now** drifts (later app states). Bound both consistently. - **Payment events (casing matters):** server (authoritative) `payment_completed_server` + `document_type='Title_check'`; client `payment_completed` + `service_type='Title_check'`; orders `document_ordered` + `document_type='title_check'` (lowercase). - **Sample events lack `service_type`** — don't filter them by it (returns zero). Inline-layout sample events: `sc_sample_section_viewed/tapped`, `sc_sample_grid_expanded`, `sc_sample_report_downloaded`, `sc_sample_cta_tapped`. Control's sample event: `sc_sample_viewed`. - **Selection trap:** section-engagers convert 5–10× in every arm — judge arms on whole-arm conversion, not engagers-only. - Saved PostHog insights: paid-conversion-by-variant table **`NbpZ1yMj`**; temp section→payment funnel **`JJcOtcfz`** (marked `[TEMP]`). ## 4. Product / design decisions - **Ship the redesign** (copy_and_layout direction). It significantly beats the old screen; the copy+layout vs copy edge is unproven, so choose between them on maintenance cost or a future powered test. - **Sample sections are the hero.** Present them **open by default** (kill the collapsed grid), above the fold, with a clear reason each matters. Lead with `mutations`; give `encumbrances` a prominent (honest) risk framing. - **Design direction: "Verified Ledger"** — high-trust, official-clearance aesthetic (deep ink canvas, parchment document cards, a clearance seal, mono for record labels). Avoids generic AI defaults. - **Convert in the first scroll** (value + trust + CTA above the fold) — matches the same-day-decision finding. - **Instrument a real section-impression event** (`sc_sample_section_impression` on viewport-enter + scroll depth). This is the #1 measurement gap — without it we can't diagnose the 73% non-engagement. - **Consider surfacing the title-check hook inside the 7/12 flow** (that's where attention is). - **Next A/B must keep a real control holdout** (last one didn't). - **Honesty guardrail (from the decision-memo pass):** any persuasion element (loss-aversion, curiosity, social proof) must be *truthful* — in a fraud-anxiety product, a dark pattern burns trust. Since we show a **sample** report, label it clearly as a sample/example; never imply it's the user's plot. ## 5. Artifacts in the repo (`newapp/`) - `title-check-prebooking-mockups.html` — v1 mockups (landing / section / booking). - `title-check-prebooking-mockups-v2.html` — v2, data-backed (chawadi + courts + index2 tiers). **Note:** renders live-plot data → **reinterpret as a sample report** given the scope constraint. - `title-check-arms-mockups.html` — 7/12 economics arms A/B/C. **Out of scope now** (live-plot preview); keep for future. - `title-check-preview-flow-spec.md` — live-plot preview flow + A/B/C experiment. **Deferred** by the sample-only decision; reference only. ## 6. Backend reference (for the PAID report, not the pre-booking screen) `current_backend/title_checker` produces the real report post-purchase: 7/12 satbara (LiveSatbara ₹15 or free Bhulekh + Gemini `extract_info` → owners/mutations/encumbrances/crops), chawadi (warehouse DB — cheap/reliable), court cases (eCourts+captcha — expensive/flaky, owner-keyed), Index II (paid eSearch; free search exists in legacy `esearch` app), eferfar detail docs. Endpoints are session-scoped (`/api/v1/sessions//...`). This is *what the sample report should resemble* — but the sample is a fixed example, not a live fetch. ## 7. Suggested next steps 1. Design the **sample-report pre-booking experience**: sample sections open/above-fold, mutations-led, encumbrance risk framing, first-session CTA, "sample" clearly labeled. 2. **Instrument the impression + scroll-depth event** so engagement is measurable. 3. Ship behind `tc_angle_variant` (or a new flag) with a **real control holdout**; measure whole-arm paid conversion. 4. Leave live-plot preview (Arms/spec) parked until product decides to fetch real data pre-purchase.