← rippling Interview Insights

rippling·Software Engineer·Onsite - System Design / Architecture·Senior

Senior
Jun 2026

Summary

System design round at Rippling for a software engineer role. The whole thing was one big question about a corporate card rules engine, and they wanted you to go deep on basically every layer of the stack.

Questions Asked (1)

Q1

You're building a rules engine for corporate card policies (e.g. no restaurant charge over $75, trip total under $2000). How do you scale it to handle millions of expenses per day across tens of thousands of rules, covering storage, evaluation pipeline, violation tracking, user notifications, and fault tolerance?

System DesignData ModelingTechnical Trade-offs
Author's notes

This was basically the whole interview.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying requirements and scale, then design a distributed, event-driven pipeline that decouples rule evaluation from ingestion. Focus on partitioning, caching, and asynchronous processing to handle millions of expenses per day, and discuss trade-offs between consistency, latency, and cost.

Pro tip: Emphasize idempotency and exactly-once processing for violation tracking and notifications, as duplicate alerts or missed violations can erode trust in the system. Also, consider a tiered rule evaluation strategy: simple rules first, complex ones later, to optimize performance.

1. Clarify Requirements and Scale

Ask about expected read/write patterns, latency requirements, rule complexity, and notification channels. Confirm the need for real-time vs. batch evaluation and fault tolerance guarantees.

2. Design Storage and Data Model

Propose a scalable storage solution for expenses and rules, such as a distributed database (e.g., Cassandra, DynamoDB) for expenses and a versioned rule store (e.g., PostgreSQL with caching). Consider indexing and partitioning strategies.

3. Architect the Evaluation Pipeline

Outline an event-driven pipeline using a message queue (e.g., Kafka) to ingest expenses, a stream processing layer (e.g., Flink, Spark Streaming) for rule evaluation, and a results store. Discuss horizontal scaling and partitioning by user or card.

4. Handle Violations and Notifications

Design a violation tracking system with idempotent writes and a notification service that batches or throttles alerts. Use a separate queue for notifications to decouple from evaluation and ensure retries.

5. Ensure Fault Tolerance and Monitoring

Describe replication, checkpointing, and dead-letter queues for fault tolerance. Include monitoring for rule evaluation latency, queue depths, and error rates, with alerting and auto-scaling.

Key Points to Mention

  • Partitioning and sharding strategies for expenses and rules to enable horizontal scaling.
  • Caching frequently used rules and using a rule engine like Drools or a custom DSL for evaluation.
  • Asynchronous, event-driven architecture with message queues (e.g., Kafka) for decoupling and backpressure handling.
  • Idempotency and exactly-once semantics for violation tracking and notifications to avoid duplicates.
  • Trade-offs between consistency, latency, and cost; e.g., eventual consistency for notifications vs. strong consistency for violations.
  • Fault tolerance mechanisms: replication, checkpointing, dead-letter queues, and circuit breakers.

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.