Design Product Analytics for Billion-Event Daily Ingestion

Read the full interview experience this question came from →

Quick Overview

Design analytics ingestion at one billion events per day with a separate minute-count serving path and warehouse. Preserve the one-week p99 latency requirement while handling SDK retries, late data, enrichment, and replay-safe aggregates.

Design Product Analytics for Billion-Event Daily Ingestion

Company: Rippling

Role: Software Engineer

Category: System Design

Difficulty: medium

Interview Round: Onsite

Design an in-house product analytics system for mobile and web applications. Provide an SDK and ingestion API, enrich and store events, support fast minute-level count dashboards, and support more complex warehouse queries. ### Requirements - About one billion events arrive per day; traffic spikes need not be modeled. - A dashboard can request counts per minute for an event type, such as installs over the last two hours. - Any such count query covering data from the past week must finish in under500 ms for99% of requests. - Enrichment can add or update analysis fields, such as reverse-geographic information or context tags. - A warehouse supports queries such as page-load counts grouped by U.S. state over the last three months. - Handle out-of-order arrivals and duplicate events. ### Clarifying Questions Define event-time versus ingestion-time reporting, acceptable freshness, deduplication identity and retention, dimensions available on the fast path, and late-event correction policy. The fast dashboard requirement is minute counts, not arbitrary low-latency warehouse SQL. ### What a Strong Answer Covers Capacity estimates, durable ingestion, SDK retry behavior, separate raw and serving stores, minute aggregates, enrichment versioning, late-event updates, deduplication, and evidence for the stated latency target. ### Follow-up Questions - How do you avoid counting an SDK retry twice? - What happens when a late event changes a minute bucket already shown on a dashboard? - Why should enrichment failures not necessarily block basic event counts?

Overview: Design analytics ingestion at one billion events per day with a separate minute-count serving path and warehouse. Preserve the one-week p99 latency requirement while handling SDK retries, late data, enrichment, and replay-safe aggregates.

Read the full Rippling Software Engineer interview experience this question came from

Rippling logo
Rippling
Nov 3, 2026
mediumSoftware EngineerOnsiteSystem Design
0
0

Design an in-house product analytics system for mobile and web applications. Provide an SDK and ingestion API, enrich and store events, support fast minute-level count dashboards, and support more complex warehouse queries.

Requirements

  • About one billion events arrive per day; traffic spikes need not be modeled.
  • A dashboard can request counts per minute for an event type, such as installs over the last two hours.
  • Any such count query covering data from the past week must finish in under500 ms for99% of requests.
  • Enrichment can add or update analysis fields, such as reverse-geographic information or context tags.
  • A warehouse supports queries such as page-load counts grouped by U.S. state over the last three months.
  • Handle out-of-order arrivals and duplicate events.

Clarifying Questions Guidance

Define event-time versus ingestion-time reporting, acceptable freshness, deduplication identity and retention, dimensions available on the fast path, and late-event correction policy. The fast dashboard requirement is minute counts, not arbitrary low-latency warehouse SQL.

What a Strong Answer Covers Guidance

Capacity estimates, durable ingestion, SDK retry behavior, separate raw and serving stores, minute aggregates, enrichment versioning, late-event updates, deduplication, and evidence for the stated latency target.

Follow-up Questions Guidance

  • How do you avoid counting an SDK retry twice?
  • What happens when a late event changes a minute bucket already shown on a dashboard?
  • Why should enrichment failures not necessarily block basic event counts?