Three layers. We build all of them, in that order.
Each layer depends on the one beneath it. Taking on the top without the ones below is how reporting ends up disagreeing with itself.

Data Engineering
The layer that has to run every day without supervision.

Analytics Engineering
The layer that decides what a number means.

Dashboard Development
The layer everyone else actually looks at.
Six stages, and the sixth is the only one anyone sees.
Connect, extract, transform, store, analyze, deliver. Most of the engineering happens in the first five, which is the part that decides whether the sixth can be trusted.
Connect APIs and data sources.
OAuth and key-based auth, rate-limit-aware clients, and a connection test that runs before anything else does.
Collect reliable, structured data from multiple platforms.
Scheduled and incremental extraction with watermarks, pagination, and replay for any window that was missed.
Clean, normalize, validate and model the data.
Type coercion, deduplication, currency and timezone normalization, and referential checks that fail loudly.
Load data into the appropriate database or warehouse.
PostgreSQL, a cloud database, or a warehouse — chosen for the query patterns you actually have, not the logo.
Build analytics-ready data models.
Conformed dimensions, agreed metric definitions, and tables shaped around the questions people keep asking.
Power BI, Tableau or custom React dashboards.
Reporting built against the same models, so two surfaces can never quietly disagree about one number.