When a team starts breaking down
A team usually does not become messy because the codebase gets bigger. It gets messy when responsibility boundaries become unclear.
The signs are easy to recognize:
- backend asks frontend how the API should work
- frontend pushes backend to shape the API around frontend implementation details
- QA asks developers for logic and then uses those verbal answers as the test standard
- when a bug appears, everyone starts blaming each other
If that keeps happening, the team is no longer building a system. It is just patching one request at a time based on whoever is speaking the loudest.
Why backend, frontend, and QA should stay separated
Separation does not mean people stop talking to each other.
What it should mean is:
- each role has a clear decision boundary
- discussions return to a shared source of truth
- nobody pushes another role into doing the thinking that belongs to them
Without that separation, teams usually run into three problems:
- APIs get shaped around the current screen instead of the domain
- request and response contracts become unclear
- test cases drift away from the original product logic
What backend should own
Backend is not just “the part that returns JSON.”
Backend should primarily own:
- business logic
- data contracts
- input validation
- error behavior
- API consistency
- security, permissions, and auditing when needed
In short:
- backend decides how the API should behave
- backend should not implement logic just because “frontend wants it this way today”
Frontend can absolutely raise concerns about API usability, but frontend should not own backend domain contracts.
What frontend should own
Frontend should not decide backend domain logic.
Frontend should primarily own:
- user experience
- screen flow
- state management
- how data is presented
- how multiple APIs are combined into a smooth UI
- UI-side input handling before requests are sent
In practice:
- frontend can say
this API is awkward for this screen - but frontend should not force backend to mirror the current component or state structure
If an API feels difficult to use, the better response is:
- describe the use case
- describe the pain point
- propose a change
- review the impact together
Not:
- “just merge the endpoint so I write less code”
What QA should own
QA should not treat a developer’s verbal explanation as the final source of truth for system behavior.
QA should primarily work from:
- specs
- acceptance criteria
- API contracts
- agreed expected behavior
QA can still ask developers questions. That is useful. But those questions should clarify, not replace the source of truth.
Otherwise teams fall into situations like this:
- QA asks backend how something works
- backend gives a quick explanation from memory
- QA tests based on that explanation
- later the product or business rule turns out to be different
At that point the bug is no longer just in code. The bug is in how logic was confirmed.
Case 1: frontend wants getAccount and getAccountDetail merged
Assume backend currently has:
GET /accounts/:idGET /accounts/:id/detail
Frontend looks at that and says:
- “can you merge them so we do not need two requests”
This is where many teams make the wrong decision.
The wrong way to think about it
- frontend asks for something, so backend merges it immediately
- the API gets shaped around one screen
- after a few sprints, backend is full of awkward endpoints built for isolated UI cases
The better way to think about it
The backend question is not:
- what does frontend want right now
The backend question is:
- are
accountandaccount detailactually the same resource boundary - is detail data heavy
- does every screen need detail
- would merging make the endpoint slower, harder to cache, or harder to maintain
- should this be handled with something like
?include=detailinstead of changing the resource model
In other words:
- frontend is allowed to raise the problem
- backend should decide based on system design, not screen pressure
A better solution is often:
- keep
getAccountlightweight - load detail only when needed
- or expose something like
GET /accounts/:id?include=detail
That gives frontend what it needs without making backend contracts messy.
Case 2: backend has no DTO and frontend sends the wrong format
This is common in small teams or teams moving too fast.
For example:
- frontend sends
birthday: "17-06-2026" - backend silently expects ISO
2026-06-17 - there is no DTO
- there is no clear validation
- there is no clear error message
The result is predictable:
- frontend says backend is too strict
- backend says frontend sent the wrong format
- QA is not even sure which format is correct
If backend has no DTO, who owns the problem
In this case, backend carries the larger share of responsibility.
Why:
- backend owns the contract
- if that contract is not made explicit, the rest of the team has nothing reliable to follow
At minimum, backend should provide:
- clear DTOs or schemas
- clear validation
- clear request and response examples
- understandable error messages
Frontend still has responsibility too:
- read the contract correctly
- do not guess formats
- do not send data assuming “backend will probably understand it”
But if backend never makes the contract visible, blaming frontend is usually unfair.
Case 3: QA asks a dev how something works and tests the wrong logic
This process bug is frustrating because nobody thinks they are doing anything wrong.
QA just wants to move faster, so they ask:
- “if the user has not verified email yet, can they still update profile?”
The developer answers from memory:
- “probably not”
QA writes test cases around that.
But the real business rule might actually be:
- profile updates are allowed for some fields
- only sensitive actions are blocked
The result:
- QA reports a bug
- dev says it is not a bug
- product says both sides misunderstood the original behavior
The right way to prevent that
If the logic matters, QA should not use verbal answers as the final test authority.
Instead there should be at least one of these:
- acceptance criteria
- API spec
- flow documentation
- a confirmed note from product or business on the ticket
Developers can explain things to speed up understanding, but they should not be the only source of truth.
What should be the source of truth
A healthy system cannot depend on individual memory.
It has to depend on something the whole team can point to.
Depending on the team, that source of truth may be:
- tickets with clear acceptance criteria
- API specs
- OpenAPI / Swagger
- DTOs and validation with sample payloads
- flow documents
- sequence diagrams or state diagrams
The important part is not the tool.
The important part is:
- everyone knows which thing is final
A better way for backend, frontend, and QA to work together
A healthier flow usually looks like this:
- Product or business confirms intended behavior
- Backend defines contracts, validation, and error formats
- Frontend reviews whether the contract works for the UI
- If there is friction, frontend describes the use case instead of making emotional demands
- Backend and frontend agree on changes if they make sense
- QA writes test cases from the agreed source of truth
- If behavior changes, the spec should be updated before or together with the code
This adds a little structure early, but it saves a lot of arguing later.
Checklist to stop teams from blaming each other
- Does backend have a clear DTO or schema
- Are date formats, enums, and nullable fields explicitly defined
- Does the API response have concrete examples
- Is frontend following the contract or guessing from behavior
- Is QA testing from the spec or from verbal explanations
- Has every API change been reviewed for frontend and QA impact
- Is the API designed around the domain or around one screen
Conclusion
If you want to build a system that stays healthy, the team needs clear boundaries:
- backend owns logic, contracts, and validation
- frontend owns user experience and how those contracts are used
- QA owns verification against the agreed source of truth
Cross-team discussion is still essential. But discussion is not the same thing as role confusion.
Once backend starts coding around frontend pressure, frontend starts forcing backend to mirror current UI state, or QA starts using a developer’s memory as the spec, the team is no longer building toward a shared system vision.
At that point the system follows whoever spoke last, not the design that should have guided it.