Trunk N Norrland
N
C
S
Setup
See live events →
Instrument
receiving 842 evt/s

Drop the Trunk SDK in your app. Events, errors, and spans go straight to Signals — no analytics vendor, no monitoring vendor in the middle.

Snippet
// Initialize once at app boot
import { trunk } from "@trunk/sdk";
trunk.init({ project: "norrland", env: process.env.NODE_ENV });

// Log a product event
trunk.event("cart.checkout_started", {
  cart_value: 62.40,
  item_count: 3,
});

// Capture an error — grouped by stack, routed to the delta that last touched the file
try { renderRecs(cart); }
catch (err) { trunk.error(err, { where: "cart.recs" }); }
Event schemas
6 schemas · auto-detected

Trunk infers a schema for every event name it receives. Lock properties down when you're ready to prevent drift.

Event Volume (30d) Properties
cart.item_added 418k 4 · locked
cart.checkout_started 62k 3 · locked
cart.recs_empty_shown 3.4k 2 · drift
order.completed 6.7k 5 · locked
product.viewed 241k 3 · locked
page.viewed 1.1M 2 · locked
Signal library
Go to Signals →

A signal is a saved query. It becomes attachable to any delta as motivating or validating evidence, and can be dropped onto any dashboard.

Signal Value Attached to
Cart-to-checkout
count(cart.checkout_started) / count(cart.item_added)
32.4% #7
/product 500s
count(error) / count(request) where route = "/product"
2.1% #137
Recs slot CTR
count(cart.recs_click) / count(cart.recs_shown)
0.8% #7
Avg order value
avg(order.completed.total)
$62.40 unattached
Return rate
count(order.refunded) / count(order.completed)
2.8% unattached
Alerts

When a signal crosses a threshold, Trunk routes the alert to the delta that last touched the affected primitive — not to a broad on-call rotation.

Alert Status Routes to
/product 500s
when ≥ 0.5% error rate for 5 min
firing #137
Cart-to-checkout drop
when < 30% daily
warn #7
/checkout p99 latency
when > 1500ms for 3 min
ok auto-route
Error group volume
when new group appears with > 20 events/h
ok auto-route