Client
Gestures, screen views, and abandoned fields belong here. Revenue, entitlements, and “purchase completed” almost never do. If the SDK can be blocked, the fact was never a fact.
Studio essay
This page is not a vendor tutorial. It is the house view Layer Kernelcore uses when a sitting begins: events have a birthplace, an owner, and a reason to exist.
Gestures, screen views, and abandoned fields belong here. Revenue, entitlements, and “purchase completed” almost never do. If the SDK can be blocked, the fact was never a fact.
Anything you would defend to finance should be born where the write is authoritative. Identity stitching happens after the fact, not inside a hopeful client payload.
Derived metrics are not events. “Engaged user” is a query. Logging it as a firehose event guarantees a second source of truth you will one day have to bury.
We ask every applicant to name one event they currently distrust. Most point at a conversion. Underneath is usually a birthplace problem: the event is fired from a thank-you screen, a webhook, and a marketing pixel, each with a slightly different timestamp. App Analytics then becomes an argument about whose clock is polite.
The studio preference is dull on purpose. One canonical write, a documented late-arrival window, and a property list short enough to memorise. If your schema needs a glossary the size of a novel, the product is trying to measure curiosity rather than behaviour.
Instrumentation also has a human owner. “The data team” is not an owner. A named engineer and a named product person share a page in the ledger; when they leave, the page is reassigned before the leaving drinks.