feat(analitik): huni olayları

Huninin kör noktalarına altı olay (adlar kalıcı sözleşme):
- cta_form_goruntulendi: programatik sayfalardaki CTA kartı, yalnız
  profilsiz dalda (görünüm hook'u; sayfa ayrımı Rybbit pathname'inden)
- sira_form_hata {kaynak: hero|cta|kapi|duzenle}: facet isteği hatası;
  geçersiz sayı doğrulaması sayılmaz
- sonuc_goruntulendi {girisli, sira_kovasi}: /sonuc pathname'i maskeli,
  huni adımı bu olayla kurulur; oturum başına girişli/anonim birer kez
- paket_goruntulendi {kaynak: kilit|kredi_bitti|nav|diger}: sayfaya
  dokunmadan yeni paket/layout.tsx + client bileşenle; /paket linklerine
  ?kaynak= eklendi (listem kilit kartları, kredi-yetersiz, nav kredi pill'i)
- liste_uretim_hata {kod: HATA|ISTISNA}: AUTH/KREDI/PAKET dalları atmaz
- giris_hata {yontem: eposta|google, status}

Ham sıra ve e-posta hiçbir olaya girmez; sıra yalnız siraKovasi() ile.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
bilalgursen
2026-09-21 04:49:09 +03:00
parent fa43392077
commit cf19903e19
11 changed files with 85 additions and 7 deletions

View File

@@ -0,0 +1,25 @@
"use client";
// /paket görüntülenmesini ve ziyaretçiyi oraya getiren yüzeyi ölçer.
//
// Neden ayrı bileşen + layout: /paket sayfası sunucu bileşeni ve statik
// kalmalı. `useSearchParams` kullanılmaz — cacheComponents açıkken Suspense
// sınırı/CSR bailout gerektirir; parametre yalnızca ölçüm için lazım, mount
// sonrası window.location'dan okumak yeter.
import { useEffect } from "react";
import { olayBirKez } from "@/lib/analitik";
// Serbest metin analitiğe sızmasın: bilinmeyen değerler "diger"e düşer.
const KAYNAKLAR = ["kilit", "kredi_bitti", "nav"] as const;
export function PaketGorunumOlayi() {
useEffect(() => {
const ham = new URLSearchParams(window.location.search).get("kaynak");
const kaynak = KAYNAKLAR.find((k) => k === ham) ?? "diger";
// Oturum başına kaynak başına 1 kez: yenileme sayıyı şişirmesin
olayBirKez("paket_goruntulendi", { kaynak }, kaynak);
}, []);
return null;
}