Dashboards over your event stream
Revenue, ad spend, leads, email health and AI cost — live views over the events HookGet already carries for you. Start from a template, edit every widget, and let a deterministic detector email you when a number breaks its own pattern.
In short
- Nine templates, one per job: executive, revenue, marketing, leads, LLM cost, email, automations, search, delivery ops.
- Seven widget types — stat, sparkline, time-series, bars, table, funnel, hour-of-week heatmap — every one editable in place.
- Formulas between aggregates: cost per click, ROAS, average order — computed server-side, division by zero is a stated blank, never a fake zero.
- Cross-source by construction: every connector reports into one event model, money always in cents, so one dashboard spans Stripe, Meta, TikTok and your CRM.
- Anomaly alerts without AI: hourly, seasonal, robust statistics on your own worker — an email that states its numbers, at no added cost.
- Dark by default; a one-click light background, kept per browser.
Drawn to scale from the real template — one JSON document, five query widgets and a formula, rendered by the dashboard app.
The templates
| Template | For | What it answers |
|---|---|---|
| Executive overview | founders, CEOs | is the business healthy, on one screen |
| Revenue | finance | collected, refunded, failed, disputed — and by currency |
| Marketing | growth, department heads | spend by network, clicks, cost per click, sessions |
| Leads | sales, agencies | lead flow by source, the funnel to won |
| LLM cost | AI teams | tokens and dollars per provider and model |
| operators | delivered, opened, bounced, complained | |
| Automations | operators | n8n runs, failures, duration, which workflow breaks |
| Search & traffic | marketing, SEO | Search Console clicks and GA4 sessions, side by side |
| Delivery operations | developers | the pipeline itself: volume, types, activity by hour |
From spend to revenue, one stream
Stated plainly
| Fact | Why |
|---|---|
| Charts bucket on ingestion time | that column is indexed and partition-pruned; a backfilled event charts when it arrived, and the editor says so |
| Analytics run on Postgres today | a columnar store is warranted at volumes no project here has yet; the query contract hides the storage, so moving later is a compiler change |
| Refresh is ten-second polling, not a socket | honest near-real-time with zero extra infrastructure; a push stream is a transport upgrade, not a data-model change |
| Alerts are statistics, not AI | an alert must state its numbers; a model cannot, and a wrong page erodes the only thing an alert has — trust |
Questions
Do I need to write SQL?
No — and neither does anything else. A dashboard is a JSON document; every widget is a small query in a closed vocabulary (event types, one aggregate set, up to two group-bys, filters), compiled server-side into parameterised SQL that is always scoped to your project. The document cannot name a tenant, so a shared or imported dashboard cannot read anyone else's data — structurally, not by review.
How editable is "editable"?
Everything: move and resize any widget, change its query in a form or as JSON, add
formulas between aggregates (spend / clicks / 100), switch chart styles, rename,
clone from templates. Every edit is validated as a whole document before it is stored — a
refused edit changes nothing.
How fresh is the data?
The view refreshes itself every ten seconds. Push sources (Stripe, your own events) appear as they arrive; pull sources appear on their sync schedule. The one honest caveat: time-series bucket on ingestion time, so a backfilled event charts when it arrived.
What are the anomaly alerts, and what do they cost?
A deterministic detector — no AI, no external service, no per-call price. Every hour the worker compares each event type's volume against the same hour of the previous 14 days (median and robust deviation). Four robust deviations plus a material absolute change fires one email that says exactly why: "payment.succeeded is at 3 for Thu 14:00, 6.5× below its typical 41". Deterministic means the same data always alerts the same way — and it runs on infrastructure you are already paying for, so it is on for every plan.
Can I get the numbers out?
The dashboard data API returns everything the widgets render, as JSON. The events behind the numbers route anywhere HookGet delivers — a Google Sheet (one row per event), an S3 bucket, a queue, any endpoint. Your data was never trapped in a chart.