When you start designing an object model from scratch, how do you decide what the classes should be?
Start from the language the domain uses, not from the database schema or the API payload. Write down the nouns that appear in the requirements and in what people say about the business. Then ask each noun two questions: does it have identity, meaning that two instances with the same contents are still distinguishable, and does it have behaviour that belongs to it alone?
Identity and behaviour together identify the entities worth a class. A product with a stock-keeping unit, a name and a price that the business rules about is an entity. A total computed from a basket is a value, and it belongs on whatever owns the basket rather than being a class of its own.
The second step is to decide who owns each piece of state. Every piece of data should have exactly one owner, and the owner is the class whose behaviour depends on it. That rule resolves most arguments about where a field belongs, and it gives you a natural boundary for each class.
The third step is to write the interactions before the fields. Describe the scenarios the system has to support, in terms of which object asks which other object to do what. The collaborations that show up repeatedly are the ones worth a named interface, and the objects that participate in none of them are probably not needed.
Finally, keep the model small and expect to change it. The first version of an object model is a hypothesis about the domain, and the cheapest time to discover that a hypothesis is wrong is while the code is still small. Model what you need for the next requirement, not everything you imagine the domain might eventually contain.