---
title: "Personalize in the session | Snowplow Signals"
description: "Signals computes live attributes from what your customer is doing and serves them to your app in milliseconds, while they are still on the page."
source: https://signals.snowplow.io/lp/in-session-personalization
---

Real-time personalization

# Personalize on what the customer is doing right now, not last night.

Signals computes live attributes from what your customer is doing and serves them to whatever you use to act, in 6ms, while they are still on the page.

* **6ms** p50 serve, in-region
* **<1s** event to attribute current
* **Free** tier, no card

## Start free

5M events a month · unlimited attributes · no card 

Work email Continue

A work address, please. We cannot provision on a personal domain.

Or [talk to an engineer](https://signals.snowplow.io/start?intent=engineer&lp=in-session-personalization).

[ 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
});

Why it stalls

## Your ranking is smart. It just doesn't know what happened thirty seconds ago. 

Before 

### Segments from last night's batch

The customer changed their mind three pages ago. Your model is scoring for who they were yesterday.

`sessions_last_7d = 4` 

With Signals 

### Attributes computed on the live stream

Describe once what you want to know about a customer. Signals recomputes it on every event and serves it to your app mid-request.

`showing_price_hesitation = true` 

Result 

### Your product responds in the same session

Value options move up. The bundle appears. The nudge lands while they are still deciding.

`same page, same session` 

Why in the session

## What your product can do once it knows what is happening now. 

None of these work from a segment computed overnight. By the time the batch lands, the customer has decided.

### Act on doubt before they leave

The reassurance, the bundle, the cheaper option appears while the basket is still open, rather than in tomorrow morning's abandonment email after they bought elsewhere.

`session conversion · basket abandonment` 

### Discount only the people who need it

When hesitation is visible in the moment, the discount goes to the people about to leave rather than to everyone in a segment, including the ones who were going to buy anyway.

`discount rate · margin per order` 

### Support that already knows what happened

Your agent, human or AI, opens the conversation already holding the last four minutes: three failed searches, stuck on checkout. The first three questions never get asked.

`handle time · deflection rate` 

### Find out today whether it worked

When the attribute behind a test updates in the session, the result lands in today's numbers rather than after tomorrow's batch, so a losing variant costs you an afternoon instead of a week.

`experiment velocity · time to read a result` 

How it works

## One definition. Live and against history. 

The same attribute runs on a streaming engine for now and a batch engine for warehouse history, so what your app reads in production matches what data science trained on.

1. 01 **Collect.** Add a Snowplow SDK to your application and behavioral events start flowing in.
2. 02 **Define.** Say what you want to know about the customer, in the console or in code.
3. 03 **Serve.** An event updates its attributes in <1s, and your app reads them at 6ms p50, on every request.

Signals → your app 6ms p50 

showing\_price\_hesitation true 

categories\_viewed\_10m 3 

basket\_value 184.00 

last\_search\_results 0 

seconds\_on\_product\_page 47 

Trigger price\_hesitation delivered to your app 

Questions

## Before you sign up

### Do I need an event stream already?

No. Collection is part of Signals. Add a Snowplow SDK to your web, mobile or server application and events start flowing in, validated against your schemas on the way. If you already run Snowplow, Signals reads the pipeline you have.

### Does it replace what I use to rank?

No. Signals does the knowing. Your ranking model, rules engine or CDP keeps doing the acting, with inputs that are seconds old instead of a day old.

### Where does it run?

Managed SaaS, or a private deployment in your own AWS or GCP account. Identical architecture either way, so what you evaluate is what you run.

### What does the free tier include?

The full product against your own traffic, up to 5 million events a month, with no card and no sales call. You should see an attribute updating against your own traffic in the first session.

## Watch an attribute change on your own traffic today.

Add the SDK, define one attribute, then click around your own product and watch it change, the same way the panel at the top of this page changed for you.

[Start free](https://signals.snowplow.io/start?lp=in-session-personalization) [Talk to an engineer](https://signals.snowplow.io/start?intent=engineer&lp=in-session-personalization) 

The real engine · no card · no sales call 

Or hand it to your coding agent 

$ `npx plugins add snowplow/skills` Copy Copied 

Then: Let's add Snowplow Signals to this app. Understand the app first, then define an attribute for price hesitation and read it back before the ranking runs.
