From 0e67a53122d5d1ea67b8ff1078e36e9b1f48ec20 Mon Sep 17 00:00:00 2001 From: dmitriylaukhin Date: Tue, 23 Jun 2026 12:13:32 +0500 Subject: [PATCH] =?UTF-8?q?Add=20=D0=AF=D0=BD=D0=B4=D0=B5=D0=BA=D1=81.?= =?UTF-8?q?=D0=9C=D0=B5=D1=82=D1=80=D0=B8=D0=BA=D0=B0=20funnel=20goals:=20?= =?UTF-8?q?signup=5Ffree=20+=20gate=5Fview=20(env-driven=20counter)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - window.ym reachGoal 'signup_free' on registration success - GateViewTracker client component fires 'gate_view' on tripwire gate mount - counter id via NEXT_PUBLIC_METRIKA_COUNTER_ID (build-time) Co-Authored-By: Claude Opus 4.8 (1M context) --- .env.example | 5 +++++ src/app/(auth)/register/register-form.tsx | 6 ++++++ src/components/student/gate-view-tracker.tsx | 20 +++++++++++++++++++ .../student/tripwire-gate-banner.tsx | 3 +++ 4 files changed, 34 insertions(+) create mode 100644 src/components/student/gate-view-tracker.tsx diff --git a/.env.example b/.env.example index fa1fc1b..c940c30 100644 --- a/.env.example +++ b/.env.example @@ -16,6 +16,11 @@ S3_REGION="eu-central" NEXT_PUBLIC_TURNSTILE_SITE_KEY="" TURNSTILE_SECRET_KEY="" +# Яндекс.Метрика — ID счётчика school.second-brain.ru (цели signup_free/gate_view). +# Build-time (NEXT_PUBLIC_*) — передавать через --build-arg при сборке. Сам счётчик +# (ym init snippet) ставится в admin → Settings → headCode, отдельно от этого ID. +NEXT_PUBLIC_METRIKA_COUNTER_ID="" + # Kinescope API KINESCOPE_API_KEY="" diff --git a/src/app/(auth)/register/register-form.tsx b/src/app/(auth)/register/register-form.tsx index 45a2fce..d444aff 100644 --- a/src/app/(auth)/register/register-form.tsx +++ b/src/app/(auth)/register/register-form.tsx @@ -5,6 +5,7 @@ import Link from "next/link"; declare global { interface Window { + ym?: (counterId: number, action: string, goal: string) => void; turnstile?: { render: ( container: HTMLElement, @@ -161,6 +162,11 @@ export function RegisterForm({ showTermsCheckbox, privacyPolicyUrl, termsUrl, of return; } + // Яндекс.Метрика: цель «бесплатная регистрация» + const mc = Number(process.env.NEXT_PUBLIC_METRIKA_COUNTER_ID); + if (mc && typeof window !== "undefined" && typeof window.ym === "function") { + window.ym(mc, "reachGoal", "signup_free"); + } setSuccess(true); setLoading(false); } diff --git a/src/components/student/gate-view-tracker.tsx b/src/components/student/gate-view-tracker.tsx new file mode 100644 index 0000000..9d30b18 --- /dev/null +++ b/src/components/student/gate-view-tracker.tsx @@ -0,0 +1,20 @@ +"use client"; + +import { useEffect } from "react"; + +declare global { + interface Window { + ym?: (counterId: number, action: string, goal: string) => void; + } +} + +// Фиксирует показ gate-лестницы в Яндекс.Метрике (цель gate_view). +export function GateViewTracker() { + useEffect(() => { + const c = Number(process.env.NEXT_PUBLIC_METRIKA_COUNTER_ID); + if (c && typeof window !== "undefined" && typeof window.ym === "function") { + window.ym(c, "reachGoal", "gate_view"); + } + }, []); + return null; +} diff --git a/src/components/student/tripwire-gate-banner.tsx b/src/components/student/tripwire-gate-banner.tsx index 61298f5..2cbd627 100644 --- a/src/components/student/tripwire-gate-banner.tsx +++ b/src/components/student/tripwire-gate-banner.tsx @@ -2,6 +2,8 @@ // основной — трипвайр «Второй мозг для предпринимателя», вторичный — полный курс. // Server component, ДС-2 (Aubade). +import { GateViewTracker } from "./gate-view-tracker"; + const TRIPWIRE_URL = "https://second-brain.ru/entrepreneur"; const FULL_COURSE_URL = "https://obsidian.second-brain.ru/"; @@ -11,6 +13,7 @@ export function TripwireGateBanner() { className="card-aubade p-6 mt-10" style={{ background: "var(--accent)", boxShadow: "4px 4px 0 0 var(--foreground)" }} > +