---
title: Upstash Core Analytics
description: Low level utilities to build analytics tools on top of Redis.
date: "2023-02-13"
url: https://console.upstash.com/ratelimit
repository: upstash/core-analytics
published: true
  
---


This library offers some low level building blocks to record and analyze custom events in Redis.
It's main purpose is to provide a simple way to record and query events in Redis without having to worry about the underlying data structure so we can build more advanced analytics features on top of it.

## Quickstart


1. Create a redis database

Go to [console.upstash.com/redis](https://console.upstash.com/redis) and create
a new global database.

After creating the db, copy the `UPSTASH_REDIS_REST_URL` and `UPSTASH_REDIS_REST_TOKEN` to your `.env` file.

3. Install `@upstash/analytics` in your project

```bash
npm install @upstash/analytics @upstash/redis
```

4. Create an analytics client

```ts
import { Analytyics } from "@upstash/analytics";
import { Redis } from "@upstash/redis";

const analytics = new Analytics({
  redis: Redis.fromEnv(),
  window: "1d",
});
```


5. Ingest some events

An event consists of a `time` field and any additional key-value pairs that you can use to record any information you want.

```ts
const event = {
  time: Date.now() // optional (default: Date.now())
  userId: "chronark",
  page: "/auth/login",
  country: "DE",
}

await analytics.ingest("pageviews", event);
```

4. Query your events

```ts

const result = await analytics.query("pageviews");

```

## Development

This project uses `pnpm` for dependency management.

#### Install dependencies

```bash
pnpm install
```

#### Build

```bash
pnpm build
```


## Database Schema

All metrics are stored in Redis `Hash` data types and sharded into buckets based on the `window` option.
```
@upstash/analytics:{TABLE}:{TIMESTAMP}
```
- `TABLE` is a namespace to group events together. ie for managing multiple projects int a single database
- `TIMESTAMP` is the starting timestamp of each window

The field of each hash is a serialized JSON object with the user's event data and the value is the number of times this event has been recorded.

```json
{
  '{"page": "/auth/login","country": "DE"}': 5,
  '{"page": "/auth/login","country": "US"}': 2
}
```
