Signals

Analytics, built in

Know your store without shipping your data out

Signals is Skelet's analytics suite. It runs beside the commerce core on databases of its own, reads every page view, email and order off one event spine, and already knows what a product, an order and a customer are.

Lens

Web analytics

01 / 05

Lens

/lens

What shoppers do on every page of the storefront: where they come from, how fast it loads for them, what they click and search for, and where they give up.

Readspage_viewproduct_filterconversioncustom

Traffic, speed and search

Page views, visitors and scroll depth for every page, how fast each one is for real shoppers, and what they searched for and didn't find.

  • Page views, unique visitors, scroll depth, devices and referrers, per store
  • Core Web Vitals at p75 for every page - LCP, INP, CLS and TTFB
  • Site search, with the zero-result searches your catalog is missing
  • Storefront JavaScript errors, grouped by message
  • Bots and crawlers told apart from people, AI crawlers included
Core Web VitalsAdmin · Lens · p75, 30 days
LCPLargest Contentful Paint9,412 samples2.86 sNeeds improvement
INPInteraction to Next Paint7,208 samples168 msGood
CLSCumulative Layout Shift9,388 samples0.042Good
TTFBTime to First Byte9,420 samples640 msGood
Zero-result searchesAdmin · Lens · Search analytics

Demand your catalog or search synonyms aren't meeting.

Heatmaps and recordings

Click, movement and scroll heatmaps for every page, and recordings of real sessions - with the rage clicks and errors that mark the ones worth watching.

  • Click, movement and scroll heatmaps, drawn over the page itself
  • Session recordings: signed-in customers always, anonymous visitors sampled
  • Rage and dead clicks flagged, and tied to the recording they happened in
  • Form inputs masked where they are typed, before anything is sent
Most-clicked elementsAdmin · /products/linen-overshirt
button.add-to-cart1,284
img.product-gallery942
.size-picker label806
.swatches button512
HeatmapClicksMovesScroll
Session recordingsAdmin · Lens
Emma Larsson6m 12s · 9 pages · mobile3 rage clicks1 JS error
anon 3f9c2a1b2m 48s · 4 pages · mobile
Jonas Weber9m 03s · 14 pages · desktop2 JS errors

Signed-in customers are always recorded; anonymous visitors are sampled.

Synapse

Customer analytics

02 / 05

Synapse

/synapse

Who your shoppers are across every visit, email and order - one profile each, scored and grouped, and the reports built on the same events.

Readsidentifyregisteredcart_addorder_placed

One profile per shopper

Signals joins a visitor's anonymous browsing to the customer they become, and scores each one on how recently, how often and how much they buy.

  • Anonymous visits joined to the customer when they sign in
  • Recency, frequency and spend scored one to five, and an engagement score
  • A lifecycle stage for everyone: prospect, new, active, at risk or lapsed
  • Page views, emails, carts and orders in one timeline
Emma LarssonAdmin · Synapse profile
Lifecycleactiveher anonymous visits joined on when she signed in
Recency2 days agoFrequency14 ordersMonetarySEK 28,460
SegmentsHigh-value repeat buyersLinen loversStockholm
ActivityAdmin · web, email and commerce
Order placed#1048 · SEK 1,990.002 days ago
Added to cartWeekend Duffel2 days ago
Email clickedAutumn edit3 days ago
Email openedAutumn edit3 days ago
Page view/products/linen-overshirt5 days ago

Segments that keep themselves current

Build a segment from what people did and didn't do, their scores and what they're drawn to - then aim campaigns, flows and promotions at it.

  • Did and didn't conditions on any event, with how often and how recently
  • Score, lifecycle and attribute-affinity rules, in nested AND/OR groups
  • Members counted as you build, with revenue and growth per segment
  • Funnels, retention cohorts, insights and paths over the same events
Linen loversAdmin · Synapse · Behavioural segment
Match alldid Order placed ≥2× in 90dMatch anyaffinity material=linenormonetary ≥4did Email opened ≥1× in 30d
Members642RevenueSEK 1,284,300Targetable from campaigns and flows
FunnelAdmin · Synapse · last 30 days
1Email clicked · Autumn edit100%
2Page view · a product page85%
3Added to cart29%
4Order placed10%

Each step must happen after the one before it.

Pulse

Email and automation

03 / 05

Pulse

/pulse

Email that's part of the store: campaigns, automated flows, signup forms and the transactional mail, built and sent from the same admin as the orders.

Readsemail_sentemail_openedemail_clicked

Email that knows your catalog

Campaigns built in a block editor that can drop in products and order details, sent to everyone, a group or a segment - with a subject line tested first.

  • A drag-and-drop builder with products, countdown and order blocks
  • A/B subject tests on a slice of the list, the winner sent to the rest
  • Opens counted without the ones mail privacy proxies fetch, and revenue attributed
  • Transactional slots: pick the email the store sends for each event
  • A suppression list for bounces, complaints and unsubscribes
Autumn editAdmin · Pulse · Campaign
AudienceAll customersCustomer groupSegment · Linen lovers
AThe autumn edit is here52.4% opened
BLinen, wool and 15% off for members58.1% opened
Test audience20%Test window240 minWinner byOpen rate

B goes to the other 80% once the window closes.

BlocksAdmin · Pulse · Email builder
ContentHeadingTextButtonImageProductsVideoCountdownSocial linksDividerSpacerRaw HTML
Order dataOrder itemsOrder totalsShipping address

Journeys that run on their own

A flow starts when something happens in the store, and walks each customer through waits, emails, texts and branches on what they did.

  • 17 triggers, from an abandoned cart or browse to back in stock
  • Steps that wait, send an email or a text, branch, add to a segment or call a webhook
  • Branches on a segment, lifecycle stage, RFM score, email engagement or consent
  • Receipts and password resets as flows too, outside the marketing consent gate
Abandoned cartAdmin · Pulse · Flow builder
TriggerAbandoned cart
Wait1 hour
Send emailYou left something behind
Conditional splitEmail engagement: opened
YesSend emailStill deciding? 10% offNoSend SMSYour cart is waiting
TriggersAdmin · Pulse · Flows
Abandoned cartBrowse abandonmentBack in stockEntered a segmentSignup form submittedEmail openedEmail clickedCustomer registered
TransactionalOrder placedOrder shippedPassword resetCart offer sent

Transactional flows send receipts and links, and skip the marketing consent gate.

A list that grows, with consent on record

Popups, flyouts and inline forms on the storefront, each new address confirmed by its owner before anything is sent to it.

  • Popup, flyout and inline forms, built in the admin
  • Double opt-in: an address is confirmed before it gets marketing
  • Every opt-in and opt-out kept on the customer's consent history
  • A submitted form can start a welcome flow
Join our listStorefront · Popup
New arrivals and members-only offers, about twice a month.
emma.larsson@example.comSubscribe

Also as a flyout in the corner, or inline on any page.

Confirm your subscriptionInbox · from Nordic Store
Hi Emma,One click and you're on the list.
Confirm my subscriptionUnsubscribe

Until it's followed, nothing is sent - and the opt-in lands on her consent history once it is.

Prism

Experiments

04 / 05

Prism

/prism

Split storefront traffic between variations, measure what converts against any event you pick, and call a winner only when the numbers clear the bar.

Readsconversionorder_placed

A/B tests with an honest verdict

Each visitor lands in one variation and stays there, wherever they're assigned, and the results say how likely the challenger is to beat the control.

  • Variations weighted as you like, with coverage and a target audience
  • Stable bucketing: a visitor always lands in the same variation
  • Assigned on the server or in the browser, with the same answer either way
  • Conversion, uplift and the chance to beat control, against a 97.5% bar
  • A warning when the traffic split drifts from the weights
  • CMS pages tested by swapping their whole layout
Free shipping bannerAdmin · Prism · Running
Keyfree-shipping-bannerCoverage100%Goal eventorder_placedAudienceAll visitors
VariationExposedRateChance
No bannercontrol4,1124.30%-
Free shipping over $50+23.8% vs control4,1285.33%98.5%
Winner

The marker is the 97.5% bar a challenger must clear to be called a winner.

Platform

Around the suite

05 / 05

Platform

What sits around the four surfaces: forwarding to the tools you already use, privacy built into the tracking itself, and the processes and stores that keep Signals apart from the core.

Your events, wherever else they're needed

Forward the event stream to your own endpoint, Google Analytics 4 or Meta, and sync segments to ad platforms as hashes, never as raw addresses.

  • Signed webhooks, the GA4 Measurement Protocol and the Meta Conversions API
  • Delivered at least once, in the order events came in, swept every minute
  • Audience sync: a segment's members as SHA-256-hashed emails
  • Destination secrets sealed with a key of their own
Event destinationsAdmin · Nordic Store
WebhookWarehousehttps://ingest.example.com/skeletAll eventsLast forwarded 10/24/2026, 2:02 PM
GA4Google AnalyticsMeasurement Protocolorder_placed, cart_addLast forwarded 10/24/2026, 2:01 PM
Meta CAPIMetaConversions APIorder_placed401: invalid OAuth access token

Swept every minute, delivered at least once, in the order the events came in.

Audience syncAdmin · Meta CAPI
High-value repeat buyers1,284 members, sent as SHA-256 hashesSynced Oct 24

Raw emails never leave the store.

Analytics that ask first

Nothing optional loads until a shopper says yes, private pages never reach a recording, and erasure reaches the analytics as well as the orders.

  • Tracking and recording off until the shopper consents
  • Account, cart, checkout, order and gift card pages never recorded
  • Tokens in reset and verify links stripped before they leave the browser
  • IP addresses truncated before they're stored
  • Erasure deletes a customer's events from the spine
Cookie consentStorefront · First visit
Privacy policyEssential onlyAccept all
What replay keepsStorefront · Session replay
/products/linen-overshirtRecorded
/cartCounted, not recorded
/checkoutCounted, not recorded
/account/ordersCounted, not recorded
/account/reset/:tokenToken stripped

Page views, clicks and scroll depth still count on private pages - only the page itself stays out.

Beside the core, never inside it

Signals runs as its own processes on its own databases, takes the storefront's events straight into ClickHouse, and switches off without a trace.

  • An append-only event spine in ClickHouse, behind a public beacon endpoint
  • An optional NATS JetStream queue in front of it, for traffic spikes
  • A signed gRPC contract to core, which never opens its database
  • A year of events by default, then archived to S3 or deleted
  • A read pool of its own, so reports never hold up ingestion
Event pathSignals · its own processes
Storefrontbeacons to /t/*ingest
ingestNATS JetStream, optionalClickHouse
coregRPC, signed, system tokensignals
signalsreads and rolls upClickHouse
StoresSignals · never core's
ClickHouseThe spine: every event, append-only, a year by default
signals-dbPostgres: identities, segments, campaigns, flows, emails
S3 archiveExpired events as .jsonl.gz, if you keep them

SIGNALS_ENABLED=false and none of it runs - the commerce core carries on alone.

In the admin

Sample data

All four, running

Lens, Synapse, Pulse and Prism in the same admin as the orders they explain, playing on their own.

0:00
0:00

And the rest

Still in the suite

And the rest of it

Lens

Bot categories
AI, search, social, SEO tools, monitors and scrapers, by agent.
Retention
Lens data pruned after as many days as you set.

Synapse

Insights
Any event over time, broken down by any property.
Paths
The most common paths people take after an event.
Engagement
How many people come back, on your store’s own cadence.
Visitor profiles
Anonymous visitors get a profile and a timeline too.

Pulse

Email library
Emails, templates and reusable blocks in one place.
Merge tags
Customer, store and order details in subjects, text and links.
Test sends
A draft sent with sample data to one address first.
SMS
Text messages as a flow step, merge tags included.
Top links
Which links in your emails get clicked.

Prism

Goal events
Any event as the goal, or a new one named on the spot.
In the storefront
One hook, useExperiment(key), the variation already chosen.

Platform

Commerce events
Orders, carts and emails written to the spine by core itself.
Replay-safe
A retried or replayed call starts one flow run, not two.
Catch-up
Customers and consents ride core’s outbox, so a suite that was down catches up.

Optional

One switch

Signals is optional

SIGNALS_ENABLED=false

And the commerce core runs alone - no suite containers, the admin hides the suite's screens, and transactional email keeps sending from core's own templates.