A quick note before this starts: we use an internal library that wraps Temporal , fully managed by the backend team at the company I work at. So this isn't a Temporal API tutorial, there are no workflow/activity code snippets here. This is the story of the problem that made us need it in the first place, and why a plain queue stopped being enough.
The old shape of the app
The app was built for a simple assumption: one organization, one tenant. Anywhere from 100 to 250 people, all seeing data scoped to their own org. Most operations, fetches, mutations, the usual, ran in the hundreds of milliseconds. Nothing about the system expected to move more data than that.
Long-running work existed, but it meant something narrower than it does now. It ran through SQS: a job gets queued, a worker picks it up, a visibility timeout governs retries if the worker dies mid-task. There was no live progress back to the UI.…