Incident Library

IL-0305 Intercom · 2026-01-27database

Replicas of one Intercom Vitess shard hit 100% CPU and fell up to 2.2 hours behind, serving stale inbox data

Intercom uses PlanetScale, built on Vitess, as its core database layer, with most high-scale data sharded across many database clusters. On January 27, 2026 two heavy workloads hit the same shard at once: the internal process that removes customer workspaces, which was running more concurrent deletion steps per app than usual with no rate limiting, and the ETL pipeline that reads the shard to sync data for analytics and reporting. From 17:03 UTC their combined load pushed both replicas of the shard to 100% CPU. The replicas fell behind the primary and replication lag grew to up to 2.2 hours, so reads for customers on that shard returned old data while writes kept working.

An alarm on an excessive worker message backlog declared an incident at 17:25 UTC. ETL processing was disabled at 18:25 UTC to reduce load on the shard. At 21:33 UTC the app deletion workers were scaled to zero, and ETL was carefully turned back on once monitoring showed stable metrics. At 22:09 UTC all replicas were back at healthy CPU levels, the lag had cleared and full recovery was confirmed. Intercom found no evidence of data loss or corruption.

Severity
–
Scope
Inbox reads for customers on one shard were slow and returned data up to 2.2 hours old; writes kept working
Users affected
fewer than 1% of Intercom customers
Region
US
Time to detect
22m
Time to resolve
5h 6m

Symptoms

From 17:03 UTC on January 27, 2026, a small subset of Intercom customers, fewer than 1%, saw inconsistent latency and stale data when reading from the platform. At 17:25 UTC an alarm on an excessive message backlog in a worker declared an incident automatically.

For those customers, new conversations did not appear in the inbox right after they were created, messages seemed not to send although they had been written, and changes to settings or data seemed not to take effect. Writes worked normally the whole time; only reads returned stale data.

Behind this, both replicas of one database shard reached 100% CPU and could not apply the stream of changes from the primary fast enough. Replication lag grew steadily and reached up to 2.2 hours, so customers on that shard were reading data more than two hours old.

Symptom Replication lagDatabase overloadHigh latency

Root cause

Root cause Capacity exhaustion

Contributing factor No headroom
Trigger
An internal app deletion process, running more concurrent deletion steps per app than usual with no rate limiting, and the ETL data pipeline both put heavy load on the same database shard at the same time.

Detection

An alarm on an excessive message backlog in a worker fired at 17:25 UTC and declared an incident automatically.

Remediation

Action items

Lessons

Because data is spread across many independent shards, the overload stayed on one shard and reached fewer than 1% of customers instead of the whole platform.

Sources

Related cases

Check your cluster for this

kubegap audits a Kubernetes cluster for conditions like the ones in this case, Database, Database replication among them, read-only, from Claude Code or Codex. Its checks cite public reports like this one.

For AI tools and scripts

The API needs no key. The MCP server offers search_incidents, get_incident, list_incidents, get_topic and vocab; both are explained on API and MCP.