---
title: "Snowplow Signals · Real-time customer context"
description: "Signals tells you what your customer is doing right now so your product can respond while they are still on the page. Real-time customer context, by Snowplow."
source: https://signals.snowplow.io/
---

Real-time customer context

# Act on live customer behavior.

Signals tells you what your customer is doing right now so your product can respond while they are still on the page.

[ Try it on yourself ↓ ](#live-panel) 

Below is your own visit to this page, computed by Signals as you read.

### Signals, about you 

connecting 

See live events firing as you browse this page on the left; what Signals computed about you on the right, refreshed every few seconds.

Implement this

this page · events 0 writes 

Product Solutions Developers Pricing Start free 

Start free Engineer 

this panel

the rest of the page

nothing sent yet

write 

attribute store · your session no read yet 

reading\_now 

pages\_last\_5\_min 

seconds\_since\_last\_action 

sections\_read 

seconds\_engaged 

pricing\_views 

menus\_explored 

features\_wanted 

cta\_clicks 

arrived\_from 

waiting for the first computed value… 

Your first events are in flight through a real Snowplow pipeline. Attributes appear as the stream computes them, usually within a few seconds.

hand it to your agent one prompt 

Add the Signals MCP server to Claude Code, Cursor or any MCP client, then run this. The agent adds the SDK, defines the attribute and wires the read into your own app.

$ npx plugins add snowplow/skills

> Use the Snowplow MCP server and Signals skill, then help me plan and implement a use case. Make sure everything is tested and works as intended.

Copy the prompt[How to connect the MCP server](https://docs.snowplow.io/docs/llms-support/snowplow-mcp/) 

or 

write it yourself three steps 

01 Track the event once, in your app 

trackPageView(); // browser tracker, already on this page

02 Define the attribute once, in Signals 

Attribute(name="pages_last_5_min", events=["page_view"],
  aggregation="category_count", property="page_urlpath",
  period=timedelta(minutes=5))

03 Read it back every request 

await signals.getServiceAttributes({
  name: "signals_site_session_service",
  attribute_key: "domain_sessionid",
  identifier: "…", // your session id, once set
});

It's fast

Attributes computed from events in <1s, served in 6ms p50 · 10ms p95, in-region.

Built to scale

Runs in our cloud or yours, AWS or GCP. Scales with your traffic.

You define what it computes

Any attribute over your events, on any key, over any window. One definition serves live from the stream and from your warehouse history.

The problem

## Your data knows. Your product doesn't. 

Behavior is collected. Nothing computes it, serves it, or flags it fast enough to act inside the session. Signals computes what your customer is doing right now and serves it to your app while they are still there. Deciding what to do with it stays in your stack: your ranker, your messaging tool, your agent.

The loop is too slow 

"Our recommender doesn't know what the user did thirty seconds ago."

We built it, now we own it 

"We built a profile API. Now two engineers maintain it forever and it pages us."

It never reaches production 

"Our data scientists build features in notebooks that never make it to production."

The app is blind to the moment 

"Our support agent has amnesia. It can't see the customer has been stuck on the same page for four minutes."

How it works

## One event in. One answer out. Within a second. 

PersonalizationLive behaviorAgent context

One definition serves live from the streaming engine and builds the training set over warehouse history, so production features match what data science trained on. Managed SaaS or private deployment in AWS or GCP, identical architecture.

t = 0 

Your customer acts 

Views, searches, adds, abandons. The SDK you already run sends the event.

view\_price · 3× in 10 minutes 

t + <1s 

Signals knows 

Recomputes what you defined, on the stream, before the customer has moved. One definition, live and against history.

showing\_price\_hesitation \= true 

\+ 6ms to read 

Your product responds 

Reads it mid-render, or a trigger pushes it wherever acts on it.

Ranker moves value options up 

01 · the customer acts Illustrative. Your product decides; Signals supplies what this session has been doing. 

What teams build on it

## Use cases that require real-time customer context. 

[01 In-session personalization and recommendationsRank against what this customer is doing now, not last night's segment. Signals supplies the attributes; your ranker decides.showing\_price\_hesitation = true ](https://signals.snowplow.io/use-cases/in-session-personalisation) [02 Real-time features for MLOne definition builds the training set over warehouse history and serves the live value, so the features in production are the features the model trained on.one definition: train and serve ](https://signals.snowplow.io/use-cases/model-features) [03 Customer-aware agentsHand an agent this customer's recent activity in a form a model can use, so it already knows they have been stuck on the same page for four minutes.agentic context: JSON or narrative ](https://signals.snowplow.io/use-cases/customer-aware-agents) [04 State for System One modelsSystem One models answer typed questions about the state you send. Signals puts the customer's recent behavior in that state, current as of this click.state: JSON, current at this click ](https://signals.snowplow.io/use-cases/system-one-models) 

Get started

## Create your first live attribute today.

With your coding agentBy hand, three steps

The short way 

### Add the Signals plugin or MCP server. Run one prompt.

Claude Code, Cursor or any MCP client. The agent adds the SDK, defines the attribute and wires the read into your app.

1 · Add

```
$ npx plugins add snowplow/skills
```

2 · Run this prompt

> Use the Snowplow MCP server and Signals skill, then help me plan and implement a use case. Make sure everything is tested and works as intended.

01 · Collect 

### Add the SDK and Signals starts collecting.

Behavioral events flow in with schema validation. No event stream to build first.

web iOS Android React Native Flutter Node.js Python Java Go Ruby .NET 

02 · Define 

### Say what you want to know: how often, how recently, in what order.

An attribute is a computed property of whatever you key on. Console or code, deployed through CI/CD.

```
# illustrative
Attribute(
  name="showing_price_hesitation",
  events=["view_price", "remove_from_basket"],
  window="10m", key="user_id",
)
```

03 · Serve and fire 

### Your app asks Signals. Or a rule fires the moment it happens.

Attributes served at 6ms p50\. Real-time triggers evaluate conditions continuously and deliver to your app, Braze, Kafka, webhooks or Pub/Sub.

high\_value\_basket\_idle → your app 

third\_failed\_search → Braze 

agent\_context\_requested → webhook 

## See an attribute updating against your own traffic in the first session.

The free tier runs on the real engine: no card, no sales call. Add the SDK, define one attribute, watch it change while you click around your own product.

[Start free](https://signals.snowplow.io/start) [Talk to an engineer](https://signals.snowplow.io/start?intent=engineer) 

Talk to an engineer means an engineer: architecture, latency boundary, failure modes, how it runs in your cloud. Not a demo script.
