After using both heavily in production, here is my honest take on when server-state management beats client-state management and vice versa.
I have shipped two large React applications recently — one using Redux Toolkit, one using TanStack Query — and the experience was different enough that it is worth writing up. The short version: most apps should start with TanStack Query, reach for Redux only when you have actual client-state complexity.
Server state and client state are different problems. Server state is data that lives on a server, is potentially stale the moment you fetch it, is shared with other users, and needs to stay in sync. Client state is ephemeral UI state — which modal is open, which tab is selected, what the user has typed into a form. TanStack Query solves the first. Redux was designed for the second but is often pressed into service for both.
Caching and background refetching out of the box. Automatic deduplication of in-flight requests. Stale-while-revalidate semantics with configurable stale times. Pagination and infinite scroll support. Mutations with optimistic updates and rollback. All of this is built in and works correctly by default. With Redux, you write this logic yourself — or you bolt on RTK Query, which is excellent, but at that point you are mostly reinventing TanStack Query with extra boilerplate.
On the influencer campaign platform I built at work, there was a multi-step campaign builder with a complex state machine — draft status, per-step validation, cross-step dependencies, undo/redo. That is genuine client-state complexity where Redux's explicit action model and DevTools time-travel debugging are genuinely useful. Using TanStack Query for that would have been the wrong tool.
TanStack Query for all server state. A small Zustand store (or even just React context) for global client state like the currently authenticated user, theme preferences, or open drawers. Redux only when there is explicit state machine complexity that benefits from the action/reducer model. This combination covers 95% of real application state without the overhead of a full Redux setup for every project.