telemetry-standards

작성자: supabase

PostHog 이벤트 추적 표준 for Supabase Studio. 검토 시 사용

npx skills add https://github.com/supabase/supabase --skill telemetry-standards

Telemetry Standards for Supabase Studio

Standards for PostHog event tracking in apps/studio/. Apply these when reviewing PRs that touch tracking or when implementing new tracking.

Event Naming

Format: [object]_[verb] in snake_case

Approved verbs only (canonical list — derived from packages/common/telemetry-constants.ts): opened, clicked, submitted, created, removed, updated, intended, evaluated, added, enabled, disabled, copied, exposed, failed, converted, closed, completed, applied, sent, moved

Flag these:

  • Unapproved verbs (saved, viewed, seen, pressed, etc.)
  • Wrong order: click_product_card → should be product_card_clicked
  • Wrong casing: productCardClicked → should be product_card_clicked

Good examples:

  • product_card_clicked
  • backup_button_clicked
  • sql_query_submitted

Common mistakes with corrections:

  • database_savedsave_button_clicked or database_updated (unapproved verb)
  • click_backup_buttonbackup_button_clicked (wrong order)
  • dashboardViewed → don't track passive views on page load
  • component_rendered → don't track — no user interaction

Property Standards

Casing: camelCase preferred for new events. The codebase has existing snake_case properties (e.g., schema_name, table_name) — when adding properties to an existing event, match its established convention.

Names must be self-explanatory:

  • { productType: 'database', planTier: 'pro' }
  • { assistantType: 'sql', suggestionType: 'optimization' }

Flag these:

  • Generic names: label, value, name, data
  • PascalCase properties
  • Inconsistent names across similar events (e.g., assistantType in one event, aiType in a related event)
  • Mixing camelCase and snake_case within the same event

What NOT to Track

  • Passive views/renders on page load (dashboard_viewed, sidebar_appeared, page_loaded)
  • Component appearances without user interaction
  • Generic "viewed" or "seen" events — already captured by pageview events

DO track: user clicks, form submissions, explicit opens/closes, user-initiated actions.

Exception: _exposed events for A/B experiment exposure tracking are valid even though they fire on render.

Never track PII (emails, names, IPs, etc.) in event properties.

Required Pattern

Import useTrack from lib/telemetry/track (within apps/studio/). Never use useSendEventMutation (deprecated).

import { useTrack } from 'lib/telemetry/track'

const MyComponent = () => {
  const track = useTrack()

  const handleClick = () => {
    track('product_card_clicked', {
      productType: 'database',
      planTier: 'pro',
      source: 'dashboard',
    })
  }

  return <button onClick={handleClick}>Click me</button>
}

Event Definitions

All events must be defined as TypeScript interfaces in packages/common/telemetry-constants.ts:

/**
 * [Event description]
 *
 * @group Events
 * @source [what triggers this event]
 */
export interface MyFeatureClickedEvent {
  action: 'my_feature_clicked'
  properties: {
    /** Description of property */
    featureType: string
  }
  groups: TelemetryGroups
}

Add the new interface to the TelemetryEvent union type so useTrack picks it up. @group Events and @source must be accurate.

Review Rules

When reviewing a PR, flag these as required changes:

  1. Naming violations — event not following [object]_[verb] snake_case, or using an unapproved verb
  2. Property violations — not camelCase, generic names, or inconsistent with similar events
  3. Deprecated hook — any usage of useSendEventMutation instead of useTrack
  4. Unnecessary view tracking — events that fire on page load without user interaction
  5. Inaccurate docs@page/@source descriptions that don't match the actual implementation

When a PR adds user-facing interactions (buttons, forms, toggles, modals) without tracking, suggest:

  • "This adds a user interaction that may benefit from tracking."
  • Propose the event name following [object]_[verb] convention
  • Propose the useTrack() call with suggested properties

When checking property consistency, search packages/common/telemetry-constants.ts for similar events and verify property names match.

Well-Formed Event Examples

From the actual codebase:

// User copies a connection string
track('connection_string_copied', {
  connectionType: 'psql',
  connectionMethod: 'transaction_pooler',
  connectionTab: 'Connection String',
})

// User enables a feature preview
track('feature_preview_enabled', {
  feature: 'realtime_inspector',
})

// User clicks a banner CTA
track('index_advisor_banner_dismiss_button_clicked')

// Experiment exposure (fires on render — valid exception)
track('home_new_experiment_exposed', {
  variant: 'treatment',
})

Implementing New Tracking

To add tracking for a user action:

  1. Name the event[object]_[verb] using approved verbs only
  2. Choose properties — camelCase preferred for new events; check packages/common/telemetry-constants.ts for similar events and match their property names and casing
  3. Add interface to telemetry-constants.ts — with @group Events and @source JSDoc, add to the TelemetryEvent union type
  4. Add to componentimport { useTrack } from 'lib/telemetry/track', call track('event_name', { properties })

Verification checklist

  • Event name follows [object]_[verb] with approved verb
  • Event name is snake_case
  • Properties are camelCase and self-explanatory
  • Event defined in telemetry-constants.ts with accurate @page/@source
  • Using useTrack hook (not useSendEventMutation)
  • Not tracking passive views/appearances
  • No PII in event properties (emails, names, IPs, etc.)
  • Property names consistent with similar events

supabase의 다른 스킬

studio-e2e-tests
supabase
Supabase Studio용 Playwright E2E 테스트를 작성하고 실행합니다. 요청 시 사용하세요.
official
vitest
supabase
Vite 기반의 Jest 호환 API를 갖춘 빠른 단위 테스트 프레임워크입니다. 테스트 작성, 모킹, 커버리지 구성 또는 테스트 작업 시 사용하세요.
official
skill-creator
supabase
모듈형 스킬을 생성하기 위한 종합 가이드로, 전문 지식과 워크플로우를 통해 Claude의 기능을 확장합니다. 스킬은 YAML 프론트매터와 마크다운 지침이 포함된 필수 SKILL.md 파일과, 목적별로 구성되고 컨텍스트를 절약하기 위해 점진적으로 로드되는 선택적 번들 리소스(스크립트, 참조 자료, 에셋)로 구성됩니다. 구체적인 사용 예시를 중심으로 스킬을 설계하고, 결정적 작업을 위한 재사용 가능한 스크립트, 도메인 지식을 위한 참조 파일, 에셋을 식별합니다...
official
supabase
supabase
Supabase와 관련된 모든 작업을 수행할 때 사용합니다. 트리거: Supabase 제품(데이터베이스, 인증, 엣지 함수, 실시간, 스토리지, 벡터, 크론, 큐); 클라이언트…
official
supabase-server
supabase
Supabase를 사용한 서버 측 코드 작성 시 — Edge Functions, Hono 앱, 웹훅 핸들러, 또는 Supabase 인증 및 클라이언트 생성이 필요한 모든 백엔드에서 사용합니다.
official
clickhouse-logs-queries
supabase
Write, review, and migrate Supabase logs queries against the ClickHouse-backed `logs` table (the `logs.all.otel` analytics endpoint). Use this whenever a task…
official
dev-toolbar-review
supabase
PR을 검토할 때 사용하세요. packages/dev-tools/, packages/common/posthog-client.ts 파일을 다루는 경우에 해당합니다.
official
e2e-studio-tests
supabase
Studio 앱에서 e2e 테스트를 실행합니다. e2e 테스트 실행, 스튜디오 테스트 실행, Playwright 테스트 실행, 또는 기능 테스트를 요청받았을 때 사용하세요.
official