Know what a customer did, not only how many times.
A live attribute is a computed property of whatever you key on, computed live on your events and served to your application in single-digit milliseconds.
// mid-render, before the ranker runs
const ctx = await signals.get({
key: { user_id: "u_48213" },
service: "user_attributes"
});{
"showing_price_hesitation": true,
"basket_value": 184.20,
"basket_idle_seconds": 412,
"failed_searches_session": 3,
"categories_viewed": ["casual", "trail"],
"last_event_at": "2026-09-14T09:41:07.212Z"
}p95. Load-test benchmark
Streaming for now, batch for history
user · session · basket · listing · store
You know how many times. Not what.
Most customer data is counts computed overnight: propensity to purchase, next best action, product recommendations. By the time it reaches your product the moment has passed, and it says nothing about what this customer is doing right now.
Define once. Computed on the stream. Served to your app.
A product_view event on a pair of trail shoes arrives from your app via our SDK.
Schema-validated on the way in. Bad data never reaches the attribute. So you can always trust your attributes.
An attribute named categories_viewed gains trail, inside the 10-minute window.
Windowing, late events and hot keys are handled in the engine, not in your code.
Your ranker reads the attribute and reorders the shoe recommendations, in the same session.
Or a trigger fires the moment the condition is met and delivers it to you.
Attributes that describe the moment, kept current for you.
Counts, recency, order and custom logic
How often, how recently, in what sequence. Or your own function, versioned like the rest.
Windows and TTLs that end when the moment does
Ten minutes, this session, since last purchase. Late events, TTLs and hot keys handled in the engine.
Key on any entity
user · session · account · basket · listing · store. A profile is whatever you say it is.
One definition, two engines
Streaming for now; backfill from Snowflake, BigQuery or Databricks on publish, so a new attribute has history on day one. The same definition builds the ML training set, so serving matches training.
Served in single-digit milliseconds
6ms p50, 10ms p95 in-region. One call returns every attribute in a service, mid-render.
Governance included
Every attribute is versioned, and manageable in code and CI/CD. Old versions keep serving until you retire them.
Collect. Define. Serve.
Add the SDK, define one attribute, and watch it change while you click around your own product. 14 days, no card, no sales call.