Most of what I build spans the whole stack, and the projects that went well had one thing in common: the data model was settled early.
Start at the schema
A clean interface papers over a lot, but not a confused schema. On every project that got hard to change, the trouble traced back to a model that didn't match the domain. I now spend the first day drawing tables, not screens.
Web and mobile from one backend
For a couple of projects I served both a web and a mobile client from a single API. It's the right call more often than not — one place for the rules, and the clients stay thin. The discipline is resisting endpoints that only exist to make one screen easier.
Details are the product
The gap between "works" and "feels good" is almost entirely small things: a loading state that doesn't jump, an error that tells you what to do next, a form that remembers what you typed. None of it shows up in a demo. All of it shows up in daily use.