Skene
Product
Pricing
Docs
Blog
About
Log InSign up
ProductPricingDocsBlogAbout
Log InSign up
Skene subpage background texture
Documentation

What Skene catches

Five ways an event write breaks. Skene flags each one on the PR before it merges.

Removed events

A coding agent refactors a checkout function and the insert that records the event goes with it.

- await supabase.from('events').insert({ name: 'checkout_completed', plan_tier: planId, value: amount })
  router.push('/thanks')

Skene flags the missing write and names the event that used to land in the table.

Renamed columns

The agent tidies your payload. plan becomes plan_tier, or a key vanishes into a constant. The column the table expects no longer gets set.

  await supabase.from('events').insert({
    name: 'checkout_completed',
-   plan: planId,
+   plan_tier: planId,
  })

The table still has a plan column; nothing fills it anymore. Skene flags the rename and shows the old key vs. the new.

Moved events

The insert gets moved out of a conditional, into a different code path, or behind a feature flag. It still exists, but no longer runs under the same conditions.

- if (user.isFirstPurchase) {
-   await supabase.from('events').insert({ name: 'first_purchase' })
- }
+ await supabase.from('events').insert({ name: 'first_purchase' })  // moved out of the guard

Skene tracks where in the control flow each write lives, so a moved insert shows up as a change even when the call itself looks intact.

Altered payloads

A column gets dropped, renamed, or its value silently changes type from string to number. Postgres rejects some of these and coerces others. Either way the data you wanted is gone.

  await supabase.from('events').insert({
    name: 'signup',
-   referrer_id: id,
    plan_tier: 'pro',
  })

Skene compares each write against the schema. Dropped columns, type drift, and key renames all surface.

Conditional firing changes

The if-block guarding the write changes. The event still fires, just not for the same users. A retention metric quietly misses a slice.

- if (user.isActive && user.daysSinceSignup > 7) {
+ if (user.isActive) {
    await supabase.from('events').insert({ name: 'week_one_active' })
  }

The condition collapsed; the write now runs for users who should not be counted. Skene flags conditional changes that affect when an event lands, not just whether the write exists.

What is next

  • Install Skene: pick a surface and try it
  • What Skene reads: the Supabase writes Skene tracks
  • Configuration: how to mark a change as accepted
Skene

Product

How it worksFeaturesSupabaseArchitectureIntegrationsSecurityPricing

Resources

DocumentationGlossaryPlaybooksBlog

Company

AboutOpen sourceContactPrivacyTerms
© 2026 Skene. All rights reserved.
Privacy PolicyTerms of Service
Skene