GraphQL: The enterprise honeymoon is over
Long-term experience & where GraphQL works
- Some teams report nearly a decade of success with GraphQL across many backends and frontends; they see it as past the “honeymoon” and into a stable, productive phase.
- Others tried it (often via Apollo or Hasura) and ultimately went back to REST/OpenAPI or RPC, feeling they gained little beyond extra complexity.
REST/OpenAPI, OData, tRPC, gRPC and other alternatives
- Several argue that OpenAPI with generated types and clients provides similar contract guarantees without GraphQL’s resolver and query complexity.
- Counterpoint: OpenAPI specs often drift or are too verbose unless generated or managed with higher-level tools (Typespec, codegen libraries).
- OData attracts some as a “RESTy” alternative, but others criticize its verbosity, overpowered filtering, and weak tooling.
- In TypeScript-first stacks, tRPC and gRPC are cited as nicer contract solutions when you don’t need the “graph” aspects.
What people see as GraphQL’s real benefits
- Many reject “overfetching” as the main value; they highlight instead:
- Strong, enforced schema contracts and type-safe evolution (add/deprecate fields, deprecate endpoints).
- API composition for M:N client–service relationships and hiding microservice/REST chaos behind a single graph.
- Federation/supergraph for large enterprises as a coordination and governance tool, especially across many teams.
- UI composition via fragments, colocation, and data masking (especially with Relay-style tooling).
Complexity, auth, and operational pain
- Critics emphasize resolver composition, nested permission checks, and schema sprawl as major cognitive and maintenance burdens.
- AuthZ through nested resolvers is seen as particularly hard to reason about and coordinate across teams.
- Some note that many production setups end up locking queries down (persisted queries, max depth/complexity), effectively turning dynamic GraphQL into a set of fixed RPC calls.
Client tooling: Relay, Apollo, URQL, Isograph
- Several insist GraphQL “only pays off” with advanced clients (Relay/Isograph), citing:
- Normalized caching and fine-grained re-renders.
- Fragment colocation and auto-generated queries.
- Pagination, refetch, and entrypoint patterns.
- Others find Apollo/URQL plus codegen or gql.tada “good enough” and see Relay as too complex or poorly documented.
Performance, overfetching, and database concerns
- Some maintain overfetching is a real web performance problem; others say modern “enshittification” has other bigger causes.
- N+1 queries, hot shards, and adversarial queries are recognized risks; typical mitigations are query-cost heuristics, depth limits, rate limiting, and dataloader patterns.
- There’s disagreement on how much GraphQL really helps vs simply moving complexity from REST endpoints into the graph layer.
Public APIs, data warehousing, and reporting
- For SaaS/public APIs (e.g., Shopify-style), GraphQL is praised for discoverability and rich, typed access; others say schemas can become so verbose that basic operations feel harder than REST.
- Data engineers complain GraphQL is painful for bulk extraction/warehousing: they must reverse‑engineer schemas via queries, hit rate limits, and “overfetch anyway” just to get everything into a warehouse.
When people think GraphQL is a good fit
- Common “good fit” scenarios mentioned:
- Large UI codebases with many teams/components needing independent data contracts.
- Many microservices needing a unified access layer and federation.
- Internal-first APIs where auth, tooling, and discipline can be tightly controlled.
- Outside those niches, many commenters feel REST/OpenAPI (or equivalent) is simpler, cheaper, and easier to secure and operate.