Track conversion
Follow visits through signup and activation, and see where users drop off.
A serverless analytics database for petabytes of event data, with flexible schemas and fast queries.
Ask a question. Your agent queries ScopeDB, follows the evidence, and comes back with an answer. Start with your agent.
POS stream · 14:00–14:30 UTC
Sales are flowing in. Which stores across the country need attention now?
FROM pos_events AS sales JOIN stores ON sales.store_id = stores.id WHERE sales.time >= '2026-09-24 14:00:00+00:00'::timestamp AND sales.time < '2026-09-24 14:30:00+00:00'::timestamp AND sales.event = 'purchase_completed' GROUP BY stores.region AS region, if(sales.time < '2026-09-24 14:15:00+00:00'::timestamp, 'previous', 'latest') AS period AGGREGATE count() AS paid_orders ORDER BY region, period DESC
POS transactions flow into ScopeDB with a time, store ID, and event type. A store directory supplies region, city, and street. These queries hold one 30-minute snapshot steady while the agent compares the same stores, then drills into River St in Harbor City. Rerun against a newer window as events arrive. Counts include one completed purchase per transaction; they do not establish why sales changed.
Service events · 14:00–14:12 UTC
Why did checkout errors spike after the 14:06 release, and which checkouts were affected?
FROM incident_events WHERE status >= 500 GROUP BY if(timestamp < '2026-09-24 14:06:00+00:00'::timestamp, 'before', 'after') AS period AGGREGATE count() AS errors ORDER BY period DESC
Request events carry status, service, release, dependency, and trace_id. Each six-minute window contains the same number of requests. One checkout event matches each payment attempt by trace_id. The agent uses those records to locate failures and their business impact; the example does not establish the underlying cause of the gateway timeouts.
Transcripts · transcribed and labeled by your tools
What changed in this week's support calls, and which conversations should we read first?
FROM call_segments
WHERE week IN ('2026-09-14', '2026-09-21')
GROUP BY week, topic
AGGREGATE count_distinct(call_id) AS calls
ORDER BY topic, weekYour tools transcribe recordings into text segments and add topic and sentiment labels before writing to ScopeDB. Store call ID, week, segment offset, text, and labels so every summary can be traced to its source. This sample uses one reviewed sentiment label per call and topic. These counts use distinct calls, not transcript segments. A call may mention several topics. ScopeDB queries the prepared text and labels; it does not transcribe audio or assign sentiment in this example.
Connect from your backend with an SDK.
Follow the connection guide to set your endpoint and API key as environment variables. Keep the API key on your server.
npm install scopedbimport { Client } from "scopedb";
const endpoint = process.env.SCOPEDB_ENDPOINT;
const apiKey = process.env.SCOPEDB_API_KEY;
if (!endpoint || !apiKey) {
throw new Error("Set SCOPEDB_ENDPOINT and SCOPEDB_API_KEY");
}
const client = new Client(endpoint, { apiKey });
const result = await client.query("SELECT 1 AS ready");
console.log(result.toObjects({ integerMode: "string" }));Run node connect.mjs. Expect ready = 1; no table is needed. Read the Node.js SDK guide for more details.
Follow the connection guide to set your endpoint and API key as environment variables. Keep the API key on your server.
Install in an initialized Go module. Requires Go 1.24 or later.
go get github.com/scopedb/goscopedb@latestpackage main
import (
"context"
"fmt"
"os"
"time"
scopedb "github.com/scopedb/goscopedb"
)
func main() {
client, err := scopedb.NewClient(scopedb.Config{
Endpoint: os.Getenv("SCOPEDB_ENDPOINT"),
APIKey: os.Getenv("SCOPEDB_API_KEY"),
})
if err != nil {
panic(err)
}
defer client.Close()
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
result, err := client.Query(ctx, "SELECT 1 AS ready")
if err != nil {
panic(err)
}
rows, err := result.ToObjects()
if err != nil {
panic(err)
}
fmt.Println(rows)
}Run go run connect.go. Expect ready = 1; no table is needed. Read the Go SDK guide for more details.
Follow the connection guide to set your endpoint and API key as environment variables. Keep the API key on your server.
Install in a Cargo project. Requires Rust 1.91 or later.
cargo add scopedb-client
cargo add tokio --features macros,rt-multi-threaduse scopedb_client::Client;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = Client::builder(std::env::var("SCOPEDB_ENDPOINT")?)
.api_key(std::env::var("SCOPEDB_API_KEY")?)
.build()?;
let result = client.query("SELECT 1 AS ready").await?;
println!("{:?}", result.into_objects()?);
Ok(())
}Run cargo run. Expect ready = 1; no table is needed. Read the Rust SDK guide for more details.
Turn query results into live charts and dashboards for humans to explore and share.
Follow visits through signup and activation, and see where users drop off.
Spot requests above your latency threshold, then trace the wait to logs and dependencies.
Follow parallel tool calls, a failed search, and its retry before the agent answers.
Retain petabytes of data and ingest millions of events per second.
Scale up for bursts and back down in quieter periods. Run ingestion and queries in separate compute groups over the same data.
Architecture
ScopeDB allows users to get insights in no time by eliminating the ETL process and enabling direct data analysis and exploration for multiple scenarios.

ScopeDB implements a real variant type system that supports both structured and semi-structured data. It provides a full-featured, flexible schema solution that allows users to reshape raw events into a semi-structured format during ingestion, query and index nested fields within the object column efficiently, and evolve the schema of existing tables online without downtime or data migration.

ScopeDB leverages cloud-native architecture to separate storage and compute, treating S3 as the primary storage layer and offering serverless resource groups to minimize TCO while maximizing performance.