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
Recs slot CTR
0.8%
#7
count(cart.recs_click) / count(cart.recs_shown)
Avg order value
$62.40
unattached
avg(order.completed.total)
Return rate
2.8%
unattached
count(order.refunded) / count(order.completed)
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
firing
#137
when ≥ 0.5% error rate for 5 min
Cart-to-checkout drop
warn
#7
when < 30% daily
/checkout p99 latency
ok
auto-route
when > 1500ms for 3 min
Error group volume
ok
auto-route
when new group appears with > 20 events/h