•CASE STUDY

Incident Ticket Correlation Platform

4 min read·682 words·Advanced

Asked at

1 candidate report in Aug 2026

How to use this case study

SDE-2 / Mid

  • Explain linking each new ticket to its user
  • Finding the user's other related tickets
  • Mapping it to the responsible system

SDE-3 / Senior

  • Go deeper on correlation rules and similarity matching
  • Enriching tickets with the system's status at incident time
  • Deduplication during outages

Staff / Principal

  • Discuss high-concurrency spikes (an outage creates thousands of tickets)
  • Grouping into incidents
  • ML-based correlation
  • Support-engineer workflows

Problem RestatementProblem

Microsoft asked: design a ticket platform where every new support ticket is:

  1. linked to the affected user,
  2. correlated with all other relevant tickets for that user (and ideally similar tickets from other users),
  3. mapped to the responsible system (the service or component that's probably broken),
  4. enriched with that system's operational status at the time (was there an outage, a deploy, alerts?).

It must work under high concurrency: when a big service fails, thousands of tickets arrive within minutes.

RequirementsRequirements

  • Ingest tickets from email, portal, chat and API.
  • Identify the user and tenant (from login, email, account ID).
  • Correlate: same user, same issue, same time window, same system, and similar text.
  • Classify the responsible system (a service catalog) and attach status snapshots (incidents, alerts, deploys).
  • Group tickets into incidents during outages, so one fix closes many tickets.
  • Fast search and a view for support engineers.

ArchitectureArchitecture

Architecture diagram
%%{init: {"look":"handDrawn","handDrawnSeed":7,"theme":"base","fontFamily":"Virgil, \"Segoe Print\", \"Comic Sans MS\", cursive","themeVariables":{"fontFamily":"Virgil, \"Segoe Print\", \"Comic Sans MS\", cursive","fontSize":"16px","primaryColor":"#fff4e6","primaryBorderColor":"#1e1e1e","primaryTextColor":"#1e1e1e","secondaryColor":"#e7f5ff","tertiaryColor":"#ebfbee","lineColor":"#1e1e1e","textColor":"#1e1e1e","mainBkg":"#fff4e6","nodeBorder":"#1e1e1e","clusterBkg":"#f8f9fa","edgeLabelBackground":"#ffffff","classText":"#1e1e1e"}}}%%
flowchart LR
    IN["Email, portal, chat, API"] --> ING["Ingestion API"]
    ING --> DB[("Tickets DB")]
    ING --> K[("Ticket events")]
    K --> ENR["Enrichment workers"]
    ENR --> ID["Identity service - user, tenant"]
    ENR --> CLS["Classifier - responsible system"]
    ENR --> ST["Status history - incidents, alerts, deploys"]
    ENR --> COR["Correlator - rules + similarity search"]
    COR --> VEC[("Search / vector index of recent tickets")]
    COR --> INC[("Incident groups")]
    UI["Support engineer UI"] --> DB
    UI --> INC

Deep Dive — Recognising that 400 tickets are one outageDeep dive

Checkout breaks and tickets arrive in a flood. Each one is handled as an individual report unless the system can tell they share a cause.

Weak

Group tickets by keyword

Cluster tickets whose text overlaps — "checkout", "payment failed".

Architecture diagram
%%{init: {"look":"handDrawn","handDrawnSeed":7,"theme":"base","fontFamily":"Virgil, \"Segoe Print\", \"Comic Sans MS\", cursive","themeVariables":{"fontFamily":"Virgil, \"Segoe Print\", \"Comic Sans MS\", cursive","fontSize":"16px","primaryColor":"#fff4e6","primaryBorderColor":"#1e1e1e","primaryTextColor":"#1e1e1e","secondaryColor":"#e7f5ff","tertiaryColor":"#ebfbee","lineColor":"#1e1e1e","textColor":"#1e1e1e","mainBkg":"#fff4e6","nodeBorder":"#1e1e1e","clusterBkg":"#f8f9fa","edgeLabelBackground":"#ffffff","classText":"#1e1e1e"}}}%%
flowchart LR
  T["Incoming tickets"] --> KW["Keyword overlap"]
  KW --> G1["'payment failed' - today's outage"]
  KW --> G2["'payment failed' - a routine expired-card ticket, merged in"]
  KW --> MISS["'can't complete my order' - same outage, no shared keyword"]
  MISS --> SEP["Filed separately - outage looks smaller than it is"]

Users describe the same failure in completely different words, and unrelated tickets share vocabulary. Grouping on surface text both splits one incident and merges distinct ones, so the count — the thing on-call reacts to — is wrong in both directions.

Good

Classify each ticket to a service

Use the product-area fields, keywords and a text classifier trained on past tickets to map a ticket to a service in the service catalogue.

Now tickets group by what they are actually about, and the catalogue supplies an owner, so routing works. But a service label alone does not say whether anything is wrong: forty checkout tickets in an hour may be an outage or may be a Monday. Without knowing the state of the service at the time, the platform still cannot tell.

Best

Classify, then snapshot the service's state at the ticket's time

Architecture diagram
%%{init: {"look":"handDrawn","handDrawnSeed":7,"theme":"base","fontFamily":"Virgil, \"Segoe Print\", \"Comic Sans MS\", cursive","themeVariables":{"fontFamily":"Virgil, \"Segoe Print\", \"Comic Sans MS\", cursive","fontSize":"16px","primaryColor":"#fff4e6","primaryBorderColor":"#1e1e1e","primaryTextColor":"#1e1e1e","secondaryColor":"#e7f5ff","tertiaryColor":"#ebfbee","lineColor":"#1e1e1e","textColor":"#1e1e1e","mainBkg":"#fff4e6","nodeBorder":"#1e1e1e","clusterBkg":"#f8f9fa","edgeLabelBackground":"#ffffff","classText":"#1e1e1e"}}}%%
flowchart LR
  ING["Ingest - save as 'new', publish an event"] --> FAST["Ingestion stays fast during a spike"]
  FAST --> ASYNC["Async enrichment"]
  ASYNC --> USER["Identify user and tenant - unknown senders flagged"]
  ASYNC --> CLS["Classify to a service - fields, keywords, ML classifier"]
  CLS --> CAT[("Service catalogue - owners, dependencies")]
  CAT --> SNAP["Query incidents, alerts and deploys for that service and its dependencies, at the ticket's timestamp"]
  SNAP --> STORE["Store the snapshot on the ticket"]
  STORE --> CORR["Correlate: same user, same service, same time window"]
  • Snapshot the state, do not look it up later. The ticket carries what was happening when it arrived — open incidents, firing alerts, recent deploys for that service and its dependencies. An agent reading it next week sees what the user experienced, not today's state.
  • Include dependencies. Checkout tickets during a payment-provider incident are about checkout to the user and about the provider to the engineer; the catalogue's dependency graph is what connects them.
  • Correlate on three axes — same user, same service, same time window — so one user's related tickets group together and an outage groups across users.
  • Ingest first, enrich asynchronously. During a spike the write path must stay trivial; classification and correlation catch up behind it.

The payoff is the thing support actually needs: a ticket that opens with "412 similar tickets, checkout service, incident INC-2291 open since 14:02" instead of one that has to be diagnosed from scratch.

Handling the Spike

  • Queue-based enrichment scales with workers, and ingestion never blocks.
  • Dedup and merge: the same user submitting twice → merge. Many users with the same error → group under one incident.
  • Idempotent processing (by ticket_id) and conditional updates when attaching to incidents, to avoid race conditions in grouping.
  • Bulk actions: resolving an incident resolves or notifies all attached tickets.

Data ModelData model

tickets:        ticket_id, user_id, tenant_id, channel, subject, body, created_at, status,
                system_id, system_confidence, incident_id, status_snapshot (JSON)
ticket_links:   ticket_id, related_ticket_id, reason (same_user | similar | same_incident), score
incidents:      incident_id, system_id, started_at, status, ticket_count

Wrap-UpWrap-up

Ingest tickets fast and enrich them asynchronously: resolve the user and tenant, classify the responsible system from the service catalog with rules and ML, snapshot that system's status at the ticket's time, and correlate with the user's other tickets and similar recent tickets via a search/vector index. Group bursts of similar tickets into incidents (joining active ones or proposing new ones), make processing idempotent to survive outage spikes, and give support engineers a linked, incident-centric view.

More Case Studies

Frequently Asked Questions

What is the Incident Ticket Correlation Platform system design question?

Incident Ticket Correlation Platform is a system design interview question asked at FAANG companies. It covers observability, data pipelines, distributed systems and tests your ability to design scalable, production-ready systems. InterviewSkool's breakdown walks you through requirements, API design, architecture, and trade-offs.

Which companies ask the Incident Ticket Correlation Platform question?

Microsoft have reportedly asked variations of this question in system design interviews. The exact wording may differ, but the core design challenges remain the same.

How should I prepare for the Incident Ticket Correlation Platform interview question?

Start with the problem statement and scale estimates, then design the high-level architecture. Focus on the core components, data model, and API design. InterviewSkool's breakdown covers the full solution with mermaid diagrams and trade-off analysis to help you prep efficiently.

What level is the Incident Ticket Correlation Platform question?

This question is suitable for SDE-2, SDE-3, and Staff engineer interviews. The level guidance on this page provides specific tips for each level — SDE-2 candidates should focus on core architecture, while Staff engineers should discuss trade-offs, monitoring, and incremental rollouts.

Practice with a Mock Interview

Apply what you learned in a live system design mock interview with InterviewSkool's AI interviewer.

Start System Design Interview →