Skip to content

Functional Requirements

The system

A URL shortener takes a long URL and returns a short one. When someone clicks the short URL, they get redirected to the original. Think bit.ly or tinyurl.com.


The two core flows

Every URL shortener is really two things glued together.

The first flow is shortening — a user pastes a long URL into the system and gets back a short one. Something like bit.ly/x7k2p. That short code is what gets shared on Twitter, printed on business cards, put in SMS messages.

The second flow is redirecting — when someone clicks bit.ly/x7k2p, the system looks up what the original URL was and sends the user there. This happens transparently — the user never sees the lookup, they just land on the destination.

These two flows are independent in terms of load. Shortening is a write. Redirecting is a read. And reads vastly outnumber writes — a single viral link can be clicked millions of times.


What's in scope

  • Shorten a URL — user provides a long URL, system returns a short one
  • Redirect — user clicks a short URL, system redirects them to the original long URL
  • Anonymous access — no login required, anyone can shorten a URL

What you should always ask about

Custom aliases

Can a user request a specific short code? Instead of a random x7k2p, they want bit.ly/my-brand. This is a paid feature on bit.ly. It matters because it changes your ID generation strategy — you can no longer just auto-generate codes, you now have to handle collisions with user-requested names and reserve a namespace.

Expiry

Do short URLs live forever? Or do they expire after 30 days, 1 year, never? This affects two things: your storage estimates (if URLs expire, you can delete old rows and reclaim space) and your cleanup design (you need a background job that purges expired entries).

Analytics

Does the system track how many times each link was clicked? From which country, which device, which time of day? This is a whole separate subsystem — bit.ly charges money for it. If analytics are in scope, you now need an event pipeline alongside your redirect flow, and your storage estimates change significantly.

What if someone shortens a URL pointing to malware or a phishing page? Does the system blindly redirect, or does it check against a blocklist? Google Safe Browsing API exists for exactly this. For SDE-2 you don't need to design the full safety system, but asking the question shows you're thinking about abuse.


Interview framing

The two flows are easy — shorten and redirect. What separates a strong answer is asking the right scoping questions: custom aliases (changes ID generation), expiry (changes storage and cleanup), analytics (adds an event pipeline), and link safety (adds abuse handling). At minimum, ask about custom aliases and expiry — those two directly change how you design the system.