← Stripe Interview Insights

Stripe·Software Engineer·Technical Phone Screen·Senior

SeniorPrefer not to say
Apr 2026Remote

Summary

Stripe backend interview, felt like a scheduling and event-driven systems problem dressed up as a product extension. The question was a follow-on to an earlier task so you had to carry context from before, which tripped me up a bit.

Questions Asked (1)

Q1

You have a subscription system where changes can now include an extension of days added to the current plan. On the day of the extension, a 'Renewed' email should go out. The upcoming-expiry and expired notification emails must also be rescheduled to fire relative to the new expiry date. How do you design this?

System DesignAPI & IntegrationsData Modeling
Author's notes

The tricky part isn't sending the renewal email, that's just a triggered event.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying requirements and constraints, then propose a design that treats subscription changes as events that trigger scheduling updates. Focus on idempotency, reliability, and scalability, using a job scheduler with cancellation and rescheduling capabilities.

Pro tip: Emphasize idempotency and failure recovery: ensure that even if a scheduling job fails, the system can recover without duplicate emails. Mention using a transactional outbox pattern to atomically update subscription state and schedule jobs.

1. Clarify Requirements

Ask about scale, email delivery guarantees, and whether extensions can be multiple or concurrent. Confirm that 'Renewed' email should be sent on the day the extension is applied, and that expiry notifications are relative to the new expiry date.

2. Model Subscription Changes

Represent subscription changes as events with a type (e.g., extension) and a timestamp. Store the current expiry date and a version or sequence number to handle concurrent updates.

3. Design Scheduling System

Use a durable job scheduler (e.g., delayed queue, cron with database) that supports scheduling, cancellation, and rescheduling. Each scheduled email job should reference the subscription and the expected expiry date version.

4. Handle Extension Event

When an extension is applied, atomically update the subscription's expiry date and enqueue a 'Renewed' email for the extension day. Cancel existing expiry notification jobs and schedule new ones based on the updated expiry date.

5. Ensure Reliability and Idempotency

Use idempotent job execution with unique job IDs and deduplication. Implement retries and dead-letter queues for failures. Consider a transactional outbox to atomically persist state changes and job scheduling.

Key Points to Mention

  • Idempotency: Ensure that rescheduling and sending emails are idempotent to avoid duplicates.
  • Transactional outbox pattern: Atomically update subscription state and schedule jobs to avoid inconsistencies.
  • Job scheduler with cancellation: Use a system that allows cancelling and rescheduling jobs (e.g., delayed queues, database-backed scheduler).
  • Versioning: Use a version or sequence number to handle concurrent updates and ensure jobs are based on the latest expiry date.
  • Failure handling: Implement retries, dead-letter queues, and monitoring for failed jobs.
  • Scalability: Design for high volume by sharding or partitioning jobs, and using efficient queries for scheduling.

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