Round aggressively, state every assumption, and carry the units — then read what
the numbers say rather than just producing them.
Assume 10M monthly active users, each opening 20 documents a day.
Events per day = 10,000,000 x 20 = 200,000,000
Average per second = 200,000,000 / 86,400 ~ 2,300/s
Peak, assume 5x = 2,300 x 5 ~ 12,000/s
Bytes per event = ids, timestamp, small payload ~ 200 bytes
Raw per day = 200,000,000 x 200 = 40 GB/day
Raw per year = 40 GB x 365 ~ 14.6 TB
Replicated 3x = 14.6 TB x 3 ~ 44 TB
Now the part that scores. Twelve thousand writes per second at peak is beyond a
single unsharded relational primary for this workload, so the write path needs
partitioning or an append-only log rather than a table with an index on every
column. Forty terabytes a year means retention is a design decision rather than
an afterthought, so ask how long the events must stay queryable and propose
rolling older data into aggregates or cold storage.
The 5x peak assumption is the one to say aloud and invite correction on, because
if the real answer is 50x — a product with a hard daily spike — the design
changes shape entirely.
Two numbers worth memorising so the arithmetic flows: there are roughly 86,400
seconds in a day, and 2.5 million seconds in a month. Everything else can be
rounded to one significant figure without affecting the conclusion.