Skip to content
← All work

Sports analytics SaaS · StellarAlgo · 2025 to present

PRIME and the AI layer at StellarAlgo

Unified every client's data into one governed layer, so teams self-serve and AI answers match the dashboards.

Problem

Each client's data lived in its own database. A question across sports properties meant visiting each system in turn. A key refresh ran weekly by hand, so data could be 7 days old. Ownership was split across teams, with no agreed service levels.

Role

As Director, Product Innovation & Analytics, I owned product management for PRIME from planning through general availability. I worked across Data Engineering and Customer Success, with a product pod of four.

Solution

PRIME consolidates every client's data into one governed layer that any approved team or tool can use.

  • One governed layer. Three source systems feed one Snowflake database through bronze, silver and gold layers. The data is transformed once in dbt, across 100+ tested and documented models.
  • A contract people can rely on. I wrote PRIME's data contract. It sets refresh and accuracy targets per data domain, three incident tiers and clear ownership.
  • Governance by default. Personal data is masked at the raw layer, and access follows roles. An analyst, a client dashboard and an AI query each see only what they're allowed to.
  • Daily, not weekly. Airflow and dbt replaced the manual weekly process. Freshness went from 7 days to under 12 hours.
  • Problems caught before a client sees them. Freshness is checked against each client's target every 30 minutes. AI-written digests summarize pipeline errors hourly, and cost is tracked per model.

Data sources

  • Ticketing and accounts
  • App config and logs
  • Automations data
  • Segment data
  • Client and league reference files
Airflow

PRIME process, in Snowflake

  1. Bronze

    Raw, as it arrived. Personal data masked here.

    Ticketing

    • Tickets
    • Events
    • Customer accounts

    Fan data platform

    • Cohorts
    • Users
    • Segments
    • Tenants

    Automations

    • Runs
    • Details

    Reference

    • Clients
    • Leagues
    dbt
  2. Silver

    Dimensionally modelled. One definition across every property.

    Dimensions

    • Events
    • Automations
    • Platform users
    • Accounts

    Facts

    • Ticketing
    • Platform activity
    • Segments
    • Automation runs

    Aggregates

    • Email by day
    • Fan acquisition
    • Platform activity
    dbt
  3. Gold

    Consumption endpoints. Rebuilt every run, tested first.

    Endpoints

    • Team trends
    • Automations
    • Segment activity
    • Platform activity
    • Email campaigns
Serve

Consume

  • Client success platform
  • Data sharing with clients
  • BI dashboards
  • AI assistants
Airflow loads each source into bronze. dbt models silver and gold, once, in Snowflake. Every consumer reads the same gold endpoints, so internal teams and clients see the same numbers.

On top of gold, I led discovery for Stellar Insights, which answers plain-English questions over a semantic layer. Each semantic model has one grain, such as property by day or campaign. The bot routes each question to the right one, so its answers match the dashboards. We shipped an internal Customer Success bot on the same layer first.

Pick a question

User question

“How did ticket revenue trend this month?”

PRIME agent

Reads the semantic layer and picks the model whose grain fits. Access follows roles.

Semantic layer

  • TPrimary

    Team trends

    1 row / team / day

    Wide daily table: category totals and performance rates across the fan lifecycle.

    • Ticketing
    • Fan acquisition
    • Win-back %
    • Upsell %
    • Fan growth
  • CEmail

    Campaigns

    1 row / campaign

    Send, open and click metrics for each email campaign.

    • Sends
    • Open rate
    • Click rate
  • SAudiences

    Segments

    1 row / segment

    Each audience segment built in the fan data platform, with its definition.

    • Audience size
    • Cohorts
  • UUsage

    Users

    1 row / user / day

    Daily platform usage per person: engagement, sessions and features used.

    • Daily usage
    • Sessions
    • Features
  • AAutomation

    Automations

    1 row / automation

    Trigger, actions, audience and full run history for each automation.

    • Trigger
    • Actions
    • Audience
    • Run history

Response

Answered from Team trends, one row per team per day. Same table as the dashboards, so the number matches.

Grain is what makes answers trustworthy. Ask a daily table about campaigns and clicks get counted twice. Each model has one grain, and the agent routes to the one that fits.

I'm now leading the move of the remaining analytics workloads from AWS Athena to Snowflake. Cost visibility and alerts are built in.

Outcome

Governed layer for every client's data, replacing a database per client
1
Governed layer for every client's data, replacing a database per client
Routine Customer Success questions, without an engineering ticket
Self-serve
Routine Customer Success questions, without an engineering ticket
To flag a missed refresh, before a client notices
30 min
To flag a missed refresh, before a client notices

Customer Success, Product and clients now work from the same numbers, on a schedule they can rely on. Routine questions that once needed an engineering request are now self-serve.

Telemetry

This tab only. Nothing here leaves your browser.

Core Web Vitals

LCP
…
waiting
INP
…
waiting
CLS
…
waiting
FCP
…
waiting
TTFB
…
waiting

Measured in this browser with the web-vitals library. INP appears after you interact.

Query engine

Engine
Not started
Start-up
–
Data downloaded
–
Tables loaded
–
Queries run
0
Errors
0
p50 latency
–
p95 latency
–