Skip to main content

July 16, 2026

Engineering for the day everyone shows up: scaling Thailand's TCAS admissions

Lessons from building a national university-admission system that has one job — absorb millions of applicants in a narrow window without dropping a transaction.


Most systems grow into their traffic. A national admission system doesn’t get that luxury: TCAS (Thailand’s University Central Admission System) is quiet for months, then the application window opens and a meaningful fraction of the country’s students arrive at once — with deadlines, anxiety, and zero tolerance for a dropped submission.

At Relevant Audience I worked on the TCAS platform with Node.js, TypeScript, Vue.js, TypeORM, Redis and MongoDB on AWS. These are the lessons that stuck.

Design for the spike, run for the idle

Capacity planning for burst systems is not “average load × headroom”. We treated the application window as the system’s real shape: microservices on ECS/EKS that scale horizontally, with the submission path isolated from everything else. Browsing programs, checking scores, editing a profile — all of that can degrade gracefully. The submit button cannot.

Queues are a promise, not a buffer

A submission that enters the system must leave it exactly once, into durable storage. Redis sat in front as both cache and pressure valve, but the contract that mattered was idempotency: retries from panicking users (and flaky mobile networks) must never double-apply. Idempotency keys on the write path cost almost nothing and eliminate a whole category of incident.

The database is where spikes go to die

MongoDB handled the flexible application documents; the relational side (via TypeORM) held the invariants. The split was deliberate: schema-rigid data where correctness rules live, document storage where the shape churns every admission cycle. Connection pools were sized for the spike and verified with load tests that replayed the previous year’s traffic curve — not synthetic uniform load, which flatters you.

Observability earns its keep in one night

When the window opens, you don’t debug — you read dashboards you built months earlier. Per-service latency percentiles, queue depth, and error budgets were on one screen. The difference between “we saw the p99 climb at 21:04 and shifted capacity” and “students are tweeting screenshots” is the difference between an incident and a headline.

National-scale traffic is where architecture stops being theoretical. If your system has a day when everyone shows up, build for that day first — the other 364 will take care of themselves.