Trunk's own event log, chart builder, and monitors — attached to the delta that changed the code. Instrument once with the Trunk SDK; every event, error, and metric lives in the same tool as the ticket, the design, and the PR. When something regresses, one click opens a delta with the trace pre-attached.
Drop the Trunk SDK in your app. Events, errors, and spans go to the same place — the Signals tab. Every event is queryable in Explore, chartable on a dashboard, and one click away from becoming a delta with the full trace attached.
No stitching between an analytics vendor, a monitoring vendor, and your ticket tracker. No dashboard bookmark hoarding. One tool.
// Initialize once import { trunk } from "@trunk/sdk"; trunk.init({ project: "norrland" }); // Log an event trunk.event("cart.checkout_started", { cart_value: 62.40, }); // Capture an error, grouped and routed to the delta // that last touched the affected file try { render(cart); } catch (err) { trunk.error(err); }
Every signal in Trunk is attachable to a delta. Every signal knows which primitive it depends on. Nothing floats in a separate tool with no way to tie it to change.
Classic PLG metrics — activation, retention, per-cohort conversion. Attach any signal to a delta as the motivating reason.
Native error grouping and span timing from the same SDK. Alerts route to the delta that touched the affected primitive — not to a broad on-call rotation.
Auto-computed per delta. Motivating = what data justified the work. Validating = did it move the needle post-ship. Nothing else does this.
Trunk indexes every regression against the deltas that touched the affected primitive. When latency on /checkout spikes, Trunk doesn't page whoever's on-call — it opens a comment on the delta that shipped the change, tags the author, and drops the trace.
A signal without a link to the change is just a chart. Explore how Signals wire to deltas, docs, and journey.