# ๐Ÿ“Š ะŸั€ะธะผะตั€ั‹ ั€ะฐะฑะพั‚ั‹ AB-ั‚ะตัั‚ะพะฒ ะธ Google Analytics ## ๐ŸŽฌ ะกั†ะตะฝะฐั€ะธะน 1: ะŸะตั€ะฒั‹ะน ะฒั…ะพะด ะฟะพะปัŒะทะพะฒะฐั‚ะตะปั ### ะ’ะพั€ะพะฝะบะฐ ั 2 AB-ั‚ะตัั‚ะฐะผะธ ```json { "meta": { "id": "soulmate", "googleAnalyticsId": "G-XXXXXXXXXX" }, "screens": [ { "id": "payment", "variants": [{ "conditions": [{ "conditionType": "unleash", "unleashFlag": "trial-button-test", "unleashVariants": ["v1"] }] }] }, { "id": "gender", "navigation": { "rules": [{ "conditions": [{ "conditionType": "unleash", "unleashFlag": "onboarding-flow", "unleashVariants": ["short"] }] }] } } ] } ``` ### ะ’ั€ะตะผะตะฝะฝะฐั ะฟะพัะปะตะดะพะฒะฐั‚ะตะปัŒะฝะพัั‚ัŒ ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ T+0ms: ะŸะพะปัŒะทะพะฒะฐั‚ะตะปัŒ ะพั‚ะบั€ั‹ะฒะฐะตั‚ /soulmate/payment โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”œโ”€ Server-side render โ”œโ”€ layout.tsx ะทะฐะณั€ัƒะถะฐะตั‚ัั โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ T+50ms: UnleashProvider ะธะฝะธั†ะธะฐะปะธะทะธั€ัƒะตั‚ัั โ”‚ โ”‚ ะŸะพะดะบะปัŽั‡ะตะฝะธะต ะบ Unleash API โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ T+100ms: PixelsProvider ะผะพะฝั‚ะธั€ัƒะตั‚ัั โ”‚ โ”‚ GoogleAnalytics ะทะฐะณั€ัƒะถะฐะตั‚ gtag.js โ”‚ โ”‚ window.gtag ัั‚ะฐะฝะพะฒะธั‚ัั ะดะพัั‚ัƒะฟะตะฝ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ T+200ms: FunnelUnleashWrapper ัะบะฐะฝะธั€ัƒะตั‚ ะฒะพั€ะพะฝะบัƒ โ”‚ โ”‚ ะะฐั…ะพะดะธั‚ ั„ะปะฐะณะธ: โ”‚ โ”‚ โ€ข trial-button-test (ะธะท payment.variants) โ”‚ โ”‚ โ€ข onboarding-flow (ะธะท gender.navigation) โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ T+300ms: FlagVariantFetcher ะทะฐะณั€ัƒะถะฐะตั‚ ะฒะฐั€ะธะฐะฝั‚ั‹ โ”‚ โ”‚ Unleash SDK ะฒะพะทะฒั€ะฐั‰ะฐะตั‚: โ”‚ โ”‚ โ€ข trial-button-test โ†’ "v1" โ”‚ โ”‚ โ€ข onboarding-flow โ†’ "short" โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ T+350ms: activeVariants ะพะฑะฝะพะฒะปัะตั‚ัั โ”‚ โ”‚ { โ”‚ โ”‚ "trial-button-test": "v1", โ”‚ โ”‚ "onboarding-flow": "short" โ”‚ โ”‚ } โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ T+400ms: FunnelRuntime ะผะพะฝั‚ะธั€ัƒะตั‚ัั โ”‚ โ”‚ currentScreen = payment ัะบั€ะฐะฝ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ T+410ms: currentScreenFlags ะฒั‹ั‡ะธัะปัะตั‚ัั โ”‚ โ”‚ ะะฝะฐะปะธะทะธั€ัƒะตั‚ payment ัะบั€ะฐะฝ: โ”‚ โ”‚ โ€ข payment.variants โ†’ trial-button-test โ”‚ โ”‚ โ€ข payment.navigation โ†’ ะฝะตั‚ ั„ะปะฐะณะพะฒ โ”‚ โ”‚ ะ ะตะทัƒะปัŒั‚ะฐั‚: ["trial-button-test"] โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ T+420ms: useEffect ัั€ะฐะฑะฐั‚ั‹ะฒะฐะตั‚ โ”‚ โ”‚ currentScreenFlags = ["trial-button-test"] โ”‚ โ”‚ activeVariants["trial-button-test"] = "v1" โ”‚ โ”‚ โ”‚ โ”‚ sendUnleashImpression("trial-button-test", "v1")โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”œโ”€ ะŸั€ะพะฒะตั€ะบะฐ: ะฒะฐั€ะธะฐะฝั‚ ะฒะฐะปะธะดะฝั‹ะน โœ… โ”œโ”€ ะŸั€ะพะฒะตั€ะบะฐ: ะฑั€ะฐัƒะทะตั€ โœ… โ”œโ”€ ะŸั€ะพะฒะตั€ะบะฐ sessionStorage: ะฟัƒัั‚ะพ โœ… โ”œโ”€ ะŸั€ะพะฒะตั€ะบะฐ window.gtag: ะตัั‚ัŒ โœ… โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ T+421ms: ะžะขะŸะ ะะ’ะšะ ะ’ GOOGLE ANALYTICS โ”‚ โ”‚ โ”‚ โ”‚ window.gtag("event", "experiment_impression", { โ”‚ โ”‚ app_name: "witlab-funnel", โ”‚ โ”‚ feature: "trial-button-test", โ”‚ โ”‚ treatment: "v1" โ”‚ โ”‚ }); โ”‚ โ”‚ โ”‚ โ”‚ sessionStorage.setItem( โ”‚ โ”‚ "unleash_impression_trial-button-test_v1", โ”‚ โ”‚ "true" โ”‚ โ”‚ ); โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ T+422ms: Network request ะพั‚ะฟั€ะฐะฒะปะตะฝ โ”‚ โ”‚ POST /g/collect?v=2&tid=G-XXX โ”‚ โ”‚ &en=experiment_impression โ”‚ โ”‚ &ep.feature=trial-button-test โ”‚ โ”‚ &ep.treatment=v1 โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Console (development): โ”‚ โ”‚ [Unleash Impression] โœ… Sent successfully: โ”‚ โ”‚ { feature: "trial-button-test", variant: "v1" } โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` --- ## ๐ŸŽฌ ะกั†ะตะฝะฐั€ะธะน 2: ะŸะตั€ะตั…ะพะด ะฝะฐ ัะปะตะดัƒัŽั‰ะธะน ัะบั€ะฐะฝ ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ T+0ms: ะŸะพะปัŒะทะพะฒะฐั‚ะตะปัŒ ะฝะฐะถะธะผะฐะตั‚ "Continue" โ”‚ โ”‚ Router.push("/soulmate/gender") โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ T+50ms: URL ะธะทะผะตะฝะธะปัั โ†’ /soulmate/gender โ”‚ โ”‚ FunnelRuntime ั€ะต-ั€ะตะฝะดะตั€ะธั‚ัั โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ T+100ms: currentScreen ะพะฑะฝะพะฒะปัะตั‚ัั โ”‚ โ”‚ currentScreen = gender ัะบั€ะฐะฝ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ T+110ms: currentScreenFlags ะฟะตั€ะตัั‡ะธั‚ั‹ะฒะฐะตั‚ัั โ”‚ โ”‚ ะะฝะฐะปะธะทะธั€ัƒะตั‚ gender ัะบั€ะฐะฝ: โ”‚ โ”‚ โ€ข gender.variants โ†’ ะฝะตั‚ ั„ะปะฐะณะพะฒ โ”‚ โ”‚ โ€ข gender.navigation โ†’ onboarding-flow โ”‚ โ”‚ ะ ะตะทัƒะปัŒั‚ะฐั‚: ["onboarding-flow"] โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ T+120ms: useEffect ัั€ะฐะฑะฐั‚ั‹ะฒะฐะตั‚ (deps ะธะทะผะตะฝะธะปะธััŒ) โ”‚ โ”‚ currentScreenFlags = ["onboarding-flow"] โ”‚ โ”‚ activeVariants["onboarding-flow"] = "short" โ”‚ โ”‚ โ”‚ โ”‚ sendUnleashImpression("onboarding-flow", "short")โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”œโ”€ ะŸั€ะพะฒะตั€ะบะฐ sessionStorage: โ”‚ "unleash_impression_onboarding-flow_short" โ”‚ ะฝะต ะฝะฐะนะดะตะฝะพ โœ… โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ T+121ms: ะžะขะŸะ ะะ’ะšะ ะ’ะขะžะ ะžะ“ะž ะกะžะ‘ะซะขะ˜ะฏ โ”‚ โ”‚ โ”‚ โ”‚ window.gtag("event", "experiment_impression", { โ”‚ โ”‚ app_name: "witlab-funnel", โ”‚ โ”‚ feature: "onboarding-flow", โ”‚ โ”‚ treatment: "short" โ”‚ โ”‚ }); โ”‚ โ”‚ โ”‚ โ”‚ sessionStorage.setItem( โ”‚ โ”‚ "unleash_impression_onboarding-flow_short", โ”‚ โ”‚ "true" โ”‚ โ”‚ ); โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` ### ะกะพัั‚ะพัะฝะธะต sessionStorage ```javascript // ะŸะพัะปะต ะฟะตั€ะฒะพะณะพ ัะบั€ะฐะฝะฐ: { "unleash_impression_trial-button-test_v1": "true" } // ะŸะพัะปะต ะฒั‚ะพั€ะพะณะพ ัะบั€ะฐะฝะฐ: { "unleash_impression_trial-button-test_v1": "true", "unleash_impression_onboarding-flow_short": "true" } ``` --- ## ๐ŸŽฌ ะกั†ะตะฝะฐั€ะธะน 3: ะ’ะพะทะฒั€ะฐั‚ ะฝะฐะทะฐะด (ะทะฐั‰ะธั‚ะฐ ะพั‚ ะดัƒะฑะปะธะบะฐั‚ะพะฒ) ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ T+0ms: ะŸะพะปัŒะทะพะฒะฐั‚ะตะปัŒ ะฝะฐะถะธะผะฐะตั‚ "Back" โ”‚ โ”‚ Router.push("/soulmate/payment") โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ T+50ms: URL ะธะทะผะตะฝะธะปัั โ†’ /soulmate/payment โ”‚ โ”‚ FunnelRuntime ั€ะต-ั€ะตะฝะดะตั€ะธั‚ัั โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ T+100ms: currentScreen = payment (ัะฝะพะฒะฐ) โ”‚ โ”‚ currentScreenFlags = ["trial-button-test"] โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ T+110ms: useEffect ัั€ะฐะฑะฐั‚ั‹ะฒะฐะตั‚ โ”‚ โ”‚ sendUnleashImpression("trial-button-test", "v1")โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ ะŸั€ะพะฒะตั€ะบะฐ sessionStorage: โ”‚ โ”‚ โ”‚ โ”‚ const key = "unleash_impression_trial-button-test_v1"; โ”‚ โ”‚ const alreadySent = sessionStorage.getItem(key); โ”‚ โ”‚ // "true" โ† ะฃะถะต ะพั‚ะฟั€ะฐะฒะปัะปะพััŒ! โ”‚ โ”‚ โ”‚ โ”‚ if (alreadySent) { โ”‚ โ”‚ return; // โŒ ะžะขะŸะ ะะ’ะšะ ะะ• ะŸะ ะžะ˜ะกะฅะžะ”ะ˜ะข โ”‚ โ”‚ } โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Console (development): โ”‚ โ”‚ [Unleash Impression] Skipped (already sent): โ”‚ โ”‚ { feature: "trial-button-test", variant: "v1" } โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` --- ## ๐ŸŽฌ ะกั†ะตะฝะฐั€ะธะน 4: ะŸะตั€ะตะทะฐะณั€ัƒะทะบะฐ ัั‚ั€ะฐะฝะธั†ั‹ (F5) ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ ะŸะพะปัŒะทะพะฒะฐั‚ะตะปัŒ ะฝะฐ ัะบั€ะฐะฝะต /soulmate/gender โ”‚ โ”‚ sessionStorage ัะพะดะตั€ะถะธั‚: โ”‚ โ”‚ { โ”‚ โ”‚ "unleash_impression_trial-button-test_v1": "true", โ”‚ โ”‚ "unleash_impression_onboarding-flow_short": "true" โ”‚ โ”‚ } โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ T+0ms: ะŸะพะปัŒะทะพะฒะฐั‚ะตะปัŒ ะฝะฐะถะธะผะฐะตั‚ F5 โ”‚ โ”‚ ะ‘ั€ะฐัƒะทะตั€ ะฟะตั€ะตะทะฐะณั€ัƒะถะฐะตั‚ ัั‚ั€ะฐะฝะธั†ัƒ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ ะ’ะะ–ะะž: sessionStorage ะะ• ะพั‡ะธั‰ะฐะตั‚ัั ะฟั€ะธ ะฟะตั€ะตะทะฐะณั€ัƒะทะบะต! โ”‚ โ”‚ ะ”ะฐะฝะฝั‹ะต ัะพั…ั€ะฐะฝััŽั‚ัั! โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ T+500ms: ะกั‚ั€ะฐะฝะธั†ะฐ ะทะฐะณั€ัƒะถะตะฝะฐ ะทะฐะฝะพะฒะพ โ”‚ โ”‚ FunnelRuntime ะผะพะฝั‚ะธั€ัƒะตั‚ัั ัะฝะพะฒะฐ โ”‚ โ”‚ currentScreen = gender โ”‚ โ”‚ currentScreenFlags = ["onboarding-flow"] โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ useEffect ัั€ะฐะฑะฐั‚ั‹ะฒะฐะตั‚: โ”‚ โ”‚ sendUnleashImpression("onboarding-flow", "short") โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ ะŸั€ะพะฒะตั€ะบะฐ sessionStorage: โ”‚ โ”‚ "unleash_impression_onboarding-flow_short" = "true" โ”‚ โ”‚ โ”‚ โ”‚ โŒ ะฃะ–ะ• ะžะขะŸะ ะะ’ะ›ะฏะ›ะžะกะฌ - ะŸะ ะžะŸะฃะกะšะะ•ะœ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` **ะ ะตะทัƒะปัŒั‚ะฐั‚:** ะ”ะฐะถะต ะฟะพัะปะต F5 ัะพะฑั‹ั‚ะธั ะะ• ะพั‚ะฟั€ะฐะฒะปััŽั‚ัั ะฟะพะฒั‚ะพั€ะฝะพ. --- ## ๐ŸŽฌ ะกั†ะตะฝะฐั€ะธะน 5: ะะพะฒะฐั ะฒะบะปะฐะดะบะฐ / ะ—ะฐะบั€ั‹ั‚ะธะต ะฑั€ะฐัƒะทะตั€ะฐ ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ ะ’ะšะ›ะะ”ะšะ 1: ะŸะพะปัŒะทะพะฒะฐั‚ะตะปัŒ ะฟั€ะพัˆะตะป ะฒะพั€ะพะฝะบัƒ โ”‚ โ”‚ sessionStorage: โ”‚ โ”‚ { "unleash_impression_trial-button-test_v1": "true" } โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ ะŸะพะปัŒะทะพะฒะฐั‚ะตะปัŒ ะพั‚ะบั€ั‹ะฒะฐะตั‚ ะะžะ’ะฃะฎ ะ’ะšะ›ะะ”ะšะฃ โ”‚ โ”‚ ั ั‚ะตะผ ะถะต URL: /soulmate/payment โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ ะ’ะšะ›ะะ”ะšะ 2: ะะพะฒะฐั ัะตััะธั ะฑั€ะฐัƒะทะตั€ะฐ! โ”‚ โ”‚ sessionStorage ะฟัƒัั‚ะพะน: โ”‚ โ”‚ {} โ”‚ โ”‚ โ”‚ โ”‚ (sessionStorage ะธะทะพะปะธั€ะพะฒะฐะฝ ะดะปั ะบะฐะถะดะพะน ะฒะบะปะฐะดะบะธ) โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ FunnelRuntime ะทะฐะณั€ัƒะถะฐะตั‚ัั: โ”‚ โ”‚ sendUnleashImpression("trial-button-test", "v1") โ”‚ โ”‚ โ”‚ โ”‚ ะŸั€ะพะฒะตั€ะบะฐ sessionStorage: ะŸะฃะกะขะž โ”‚ โ”‚ โœ… ะกะžะ‘ะซะขะ˜ะ• ะžะขะŸะ ะะ’ะ›ะฏะ•ะขะกะฏ ะ—ะะะžะ’ะž โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` **ะ’ะฐะถะฝะพ:** sessionStorage ะธะทะพะปะธั€ะพะฒะฐะฝ ะดะปั ะบะฐะถะดะพะน ะฒะบะปะฐะดะบะธ ะฑั€ะฐัƒะทะตั€ะฐ. --- ## ๐Ÿ“Š ะงั‚ะพ ะฒะธะดะฝะพ ะฒ Google Analytics ### Events Report ``` Event name: experiment_impression Total events: 2,345 By feature parameter: โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Feature โ”‚ Count โ”‚ Users โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ trial-button-test โ”‚ 1,234 โ”‚ 987 โ”‚ โ”‚ onboarding-flow โ”‚ 1,111 โ”‚ 896 โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ By treatment parameter: โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Treatment โ”‚ Count โ”‚ Users โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ v1 โ”‚ 634 โ”‚ 507 โ”‚ โ”‚ v2 โ”‚ 600 โ”‚ 480 โ”‚ โ”‚ control โ”‚ 555 โ”‚ 445 โ”‚ โ”‚ short โ”‚ 556 โ”‚ 448 โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ Cross-tabulation: โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Feature + Treatmentโ”‚ Count โ”‚ Users โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ trial-button-test โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€ v1 โ”‚ 634 โ”‚ 507 โ”‚ โ”‚ โ””โ”€ v2 โ”‚ 600 โ”‚ 480 โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ onboarding-flow โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€ short โ”‚ 556 โ”‚ 448 โ”‚ โ”‚ โ””โ”€ control โ”‚ 555 โ”‚ 445 โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` ### DebugView (Realtime) ``` User: 12345abc Session ID: sess_xyz789 Events: โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Time โ”‚ Event โ”‚ Parameters โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ 14:32:10โ”‚ page_view โ”‚ page: /payment โ”‚ โ”‚ 14:32:11โ”‚ experiment_impression โ”‚ feature: trial-.. โ”‚ โ”‚ โ”‚ โ”‚ treatment: v1 โ”‚ โ”‚ 14:32:45โ”‚ page_view โ”‚ page: /gender โ”‚ โ”‚ 14:32:46โ”‚ experiment_impression โ”‚ feature: onboard.. โ”‚ โ”‚ โ”‚ โ”‚ treatment: short โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` --- ## ๐Ÿ” Network Tab ะŸั€ะธะผะตั€ั‹ ### ะŸะตั€ะฒะพะต impression ัะพะฑั‹ั‚ะธะต ```http POST /g/collect HTTP/1.1 Host: www.google-analytics.com Query Parameters: v=2 tid=G-XXXXXXXXXX _p=1234567890 cid=abc-def-ghi-jkl en=experiment_impression โ† Event Name epn.value=1 ep.app_name=witlab-funnel โ† Custom Parameter ep.feature=trial-button-test โ† Custom Parameter ep.treatment=v1 โ† Custom Parameter _s=1 ``` ### ะ’ั‚ะพั€ะพะต impression ัะพะฑั‹ั‚ะธะต ```http POST /g/collect HTTP/1.1 Host: www.google-analytics.com Query Parameters: v=2 tid=G-XXXXXXXXXX en=experiment_impression ep.app_name=witlab-funnel ep.feature=onboarding-flow โ† ะ”ั€ัƒะณะพะน ั„ะปะฐะณ ep.treatment=short โ† ะ”ั€ัƒะณะพะน ะฒะฐั€ะธะฐะฝั‚ _s=2 ``` --- ## ๐Ÿงช ะขะตัั‚ะธั€ะพะฒะฐะฝะธะต ### 1. ะžั‡ะธัั‚ะบะฐ ะธัั‚ะพั€ะธะธ ะดะปั ะฟะพะฒั‚ะพั€ะฝะพะณะพ ั‚ะตัั‚ะธั€ะพะฒะฐะฝะธั ```javascript // ะ’ ะบะพะฝัะพะปะธ ะฑั€ะฐัƒะทะตั€ะฐ: import { clearUnleashImpressions } from "@/lib/funnel/unleash"; // ะžั‡ะธัั‚ะธั‚ ะฒัะต impression ะบะปัŽั‡ะธ clearUnleashImpressions(); // ะ˜ะปะธ ะฒั€ัƒั‡ะฝัƒัŽ: Object.keys(sessionStorage) .filter(key => key.startsWith("unleash_impression_")) .forEach(key => sessionStorage.removeItem(key)); // ะŸะพัะปะต ัั‚ะพะณะพ ัะพะฑั‹ั‚ะธั ะพั‚ะฟั€ะฐะฒัั‚ัั ะทะฐะฝะพะฒะพ ``` ### 2. ะŸั€ะพะฒะตั€ะบะฐ ั‚ะตะบัƒั‰ะตะณะพ ัะพัั‚ะพัะฝะธั ```javascript // ะŸะพัะผะพั‚ั€ะตั‚ัŒ ะฒัะต impression ะบะปัŽั‡ะธ: Object.keys(sessionStorage) .filter(key => key.startsWith("unleash_impression_")) .forEach(key => { console.log(key, sessionStorage.getItem(key)); }); // ะ’ั‹ะฒะพะด: // unleash_impression_trial-button-test_v1 "true" // unleash_impression_onboarding-flow_short "true" ``` ### 3. ะ˜ะผะธั‚ะฐั†ะธั ะฝะพะฒะพะณะพ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปั ```javascript // 1. ะžั‡ะธัั‚ะธั‚ัŒ sessionStorage sessionStorage.clear(); // 2. ะžั‚ะบั€ั‹ั‚ัŒ ะฒะพั€ะพะฝะบัƒ ะฒ ะฝะพะฒะพะน ะฒะบะปะฐะดะบะต Incognito // ะ˜ะ›ะ˜ // 3. ะŸะตั€ะตะทะฐะฟัƒัั‚ะธั‚ัŒ ะฑั€ะฐัƒะทะตั€ // ะกะพะฑั‹ั‚ะธั ะพั‚ะฟั€ะฐะฒัั‚ัั ะบะฐะบ ะดะปั ะฝะพะฒะพะณะพ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปั ``` --- ## ๐Ÿ“ˆ ะŸั€ะฐะบั‚ะธั‡ะตัะบะธะต ะฟั€ะธะผะตั€ั‹ AB ั‚ะตัั‚ะพะฒ ### ะขะตัั‚ 1: ะšะฝะพะฟะบะฐ ะพะฟะปะฐั‚ั‹ ```json { "id": "payment", "variants": [{ "conditions": [{ "conditionType": "unleash", "unleashFlag": "trial-payment-button", "unleashVariants": ["v1"] }], "override": { "bottomActionButton": { "text": "Start 7-Day Free Trial" } } }] } ``` **Unleash ะฒะพะทะฒั€ะฐั‰ะฐะตั‚:** - 50% ะฟะพะปัŒะทะพะฒะฐั‚ะตะปะตะน: `v1` (ะบะฝะพะฟะบะฐ "Start 7-Day Free Trial") - 50% ะฟะพะปัŒะทะพะฒะฐั‚ะตะปะตะน: `disabled` (ะบะฝะพะฟะบะฐ "Continue to Payment") **GA ัะพะฑั‹ั‚ะธั:** ```javascript // ะ“ั€ัƒะฟะฟะฐ A (v1): { feature: "trial-payment-button", treatment: "v1" } // ะ“ั€ัƒะฟะฟะฐ B (disabled): ะะ•ะข ัะพะฑั‹ั‚ะธั // ะฟะพั‚ะพะผัƒ ั‡ั‚ะพ sendUnleashImpression ะฟั€ะพะฟัƒัะบะฐะตั‚ variant="disabled" ``` ### ะขะตัั‚ 2: ะšะพั€ะพั‚ะบะฐั vs ะดะปะธะฝะฝะฐั ะฒะพั€ะพะฝะบะฐ ```json { "id": "intro", "navigation": { "rules": [{ "conditions": [{ "conditionType": "unleash", "unleashFlag": "funnel-length-test", "unleashVariants": ["short"] }], "nextScreenId": "payment" }], "default": "details" } } ``` **Unleash ะฒะพะทะฒั€ะฐั‰ะฐะตั‚:** - 50%: `short` โ†’ ะฟะตั€ะตั…ะพะด ัั€ะฐะทัƒ ะฝะฐ payment (3 ัะบั€ะฐะฝะฐ) - 50%: `disabled` โ†’ ะฟะตั€ะตั…ะพะด ะฝะฐ details (5 ัะบั€ะฐะฝะพะฒ) **GA ัะพะฑั‹ั‚ะธั ะดะปั ะพะฑะตะธั… ะณั€ัƒะฟะฟ:** ```javascript // ะ’ัะต ะฟะพะปัŒะทะพะฒะฐั‚ะตะปะธ ะฒะธะดัั‚ intro ัะบั€ะฐะฝ: { feature: "funnel-length-test", treatment: "short" } { feature: "funnel-length-test", treatment: "disabled" } // ะะพ ะดะฐะปัŒัˆะต ะธะดัƒั‚ ั€ะฐะทะฝั‹ะผะธ ะฟัƒั‚ัะผะธ! ``` --- ## โœ… ะšะพะฝั‚ั€ะพะปัŒะฝั‹ะน ัะฟะธัะพะบ ### ะŸะตั€ะตะด ะทะฐะฟัƒัะบะพะผ AB ั‚ะตัั‚ะฐ: - [ ] Google Analytics ID ะฝะฐัั‚ั€ะพะตะฝ ะฒ `funnel.meta.googleAnalyticsId` - [ ] Unleash ั„ะปะฐะณ ัะพะทะดะฐะฝ ะธ ะฐะบั‚ะธะฒะตะฝ - [ ] Unleash ะฒะพะทะฒั€ะฐั‰ะฐะตั‚ ะฟั€ะฐะฒะธะปัŒะฝั‹ะต ะฒะฐั€ะธะฐะฝั‚ั‹ - [ ] ะกะพะฑั‹ั‚ะธั ะพั‚ะฟั€ะฐะฒะปััŽั‚ัั (ะฟั€ะพะฒะตั€ะธั‚ัŒ Network tab) - [ ] ะกะพะฑั‹ั‚ะธั ะฒะธะดะฝั‹ ะฒ GA DebugView - [ ] sessionStorage ั€ะฐะฑะพั‚ะฐะตั‚ ะบะพั€ั€ะตะบั‚ะฝะพ ### ะŸั€ะธ ะพั‚ะปะฐะดะบะต: - [ ] `window.gtag` ะพะฟั€ะตะดะตะปะตะฝ (ะฒ ะบะพะฝัะพะปะธ) - [ ] Console ะปะพะณะธ ะฟะพะบะฐะทั‹ะฒะฐัŽั‚ "Sent successfully" - [ ] Network tab ะฟะพะบะฐะทั‹ะฒะฐะตั‚ POST /g/collect - [ ] sessionStorage ัะพะดะตั€ะถะธั‚ impression ะบะปัŽั‡ะธ - [ ] DebugView ะฟะพะบะฐะทั‹ะฒะฐะตั‚ ัะพะฑั‹ั‚ะธั ะฒ ั€ะตะฐะปัŒะฝะพะผ ะฒั€ะตะผะตะฝะธ