Skip to main content
Data & BI Dashboards

From daily reports to near real-time dashboards: a practical ETL approach

Your business runs on data — but if that data only refreshes once a day, you are making decisions on yesterday's numbers. Here is a practical guide to building ETL pipelines that bring your dashboards closer to real time, without over-engineering the solution.

LovelyPixel Studio 10 min read

Why your daily report is holding your business back

Imagine this: it is 2 pm on a Tuesday, and your sales dashboard still shows yesterday's figures. Your warehouse manager spots what looks like a stock discrepancy, but the inventory report will not refresh until midnight. A marketing campaign launched this morning — you will not see its impact until tomorrow.

This is the reality for a surprising number of mid-size businesses. They have invested in dashboards and reporting tools, but the data feeding those tools is stale before anyone opens them. The root cause is almost always the same: data moves in a single daily batch, typically an overnight job that extracts everything, transforms it, and loads it into a reporting database.

Daily batch reporting was perfectly adequate when decision cycles were weekly or monthly. But modern business moves faster. Operations teams need to react within hours, not days. Marketing needs same-day feedback on campaign performance. Finance needs up-to-date cash flow visibility, not a snapshot from eighteen hours ago.

The good news is that moving from daily batch to near real-time reporting does not require scrapping everything and starting fresh. It requires a well-designed ETL pipeline — and a clear understanding of what "real time" actually means for your specific use case.

What is ETL? (And why should you care?)

ETL stands for Extract, Transform, Load. It is the process of moving data from one or more source systems into a central location — typically a data warehouse — where it can be queried, reported on, and visualised in dashboards.

Let us break each step down plainly:

Extract is about pulling data out of your source systems. These might be your CRM, accounting software, e-commerce platform, ERP, or even spreadsheets. The extraction step connects to each system (via API, database connection, or file export), reads the relevant data, and stages it for processing. The key consideration here is what to extract and how often. A full extract pulls everything each time; an incremental extract only pulls records that have changed since the last run. Incremental extraction is almost always preferable — it is faster, cheaper, and puts less load on your source systems.

Transform is where the raw data gets cleaned up and reshaped. Source systems rarely store data in the format your reports need. Column names differ between systems. Date formats vary. Currency values might need conversion. Duplicate records need to be identified and handled. Business logic gets applied — for example, calculating gross margin from revenue and cost fields, or categorising customers into segments based on purchase history. This is the step where messy, inconsistent source data becomes reliable, queryable reporting data.

Load is the final step: writing the transformed data into your data warehouse or reporting database. The warehouse schema is designed specifically for analytics — optimised for the kinds of queries your dashboards and reports run. This is different from the schemas used by your operational systems, which are optimised for transactional workloads (creating orders, updating records, and so on).

The beauty of a well-built ETL pipeline is that it automates this entire process. Once it is running, your data warehouse stays current without anyone needing to manually export CSVs, copy-paste between spreadsheets, or run ad-hoc queries against production databases.

The batch-to-realtime spectrum

One of the most common mistakes businesses make is assuming they need "real-time everything." They hear phrases like "real-time analytics" and "streaming data" and conclude that anything less than instant, sub-second updates is inadequate.

In practice, data freshness exists on a spectrum, and the right cadence depends entirely on the use case:

  • Daily batch (12–24 hours) — Suitable for historical trend analysis, monthly board reports, and compliance reporting where timeliness is less critical than accuracy and completeness.
  • Hourly refresh (1–4 hours) — A solid middle ground for most operational dashboards. Good for sales tracking, marketing campaign monitoring, and inventory oversight where same-day visibility matters but minute-level precision does not.
  • Near real-time (5–15 minutes) — Appropriate for operational decision-making: warehouse management, customer support queues, live marketing spend optimisation, and financial monitoring. This is the sweet spot for most mid-size businesses.
  • True real-time / streaming (sub-second) — Required for fraud detection, algorithmic trading, live location tracking, and IoT sensor monitoring. This demands a fundamentally different architecture (event streaming, message queues, stream processing engines) and significantly higher infrastructure costs.

For most businesses reading this article, the jump from daily batch to a 10–15 minute refresh cycle is transformative — and achievable without exotic technology. You do not need Apache Kafka or a dedicated data engineering team. You need a well-designed ETL pipeline and sensible scheduling.

Building your first ETL pipeline: a practical walkthrough

Let us walk through the key steps of building a production-grade ETL pipeline, from identifying your source systems through to scheduling and monitoring.

1. Identify your source systems

Start by mapping out every system that holds data your business needs for reporting. Common sources include:

  • CRM (Salesforce, HubSpot, Zoho, or similar)
  • Accounting or ERP (Xero, MYOB, SAP, NetSuite)
  • E-commerce platform (Shopify, WooCommerce, Magento)
  • Marketing tools (Google Analytics, Meta Ads, Mailchimp)
  • Custom or legacy databases (SQL Server, MySQL, PostgreSQL)
  • Spreadsheets and flat files (the ones everyone pretends don't exist)

For each source, document: what data it holds, how you can access it (API, direct database connection, file export), what the rate limits or access restrictions are, and how frequently the data changes. This inventory becomes the foundation of your pipeline design.

2. Define your warehouse schema

Your data warehouse should not be a carbon copy of your source system schemas. It should be designed around how your business uses data, not how your applications store it.

A common approach is the star schema: a central "fact" table (transactions, orders, events) surrounded by "dimension" tables (customers, products, dates, locations). This structure is optimised for the aggregation queries that dashboards rely on — sums, counts, averages, and group-by operations.

Keep your schema clean and well-documented. Every table should have a clear purpose. Every column should have a defined data type and a plain-English description. Future-you (and anyone else who works on this) will be grateful.

3. Build extraction logic

For each source system, build an extraction module that handles:

  • Connection management — Authenticate, connect, handle timeouts and retries.
  • Incremental extraction — Track the "high-water mark" (the timestamp or ID of the most recent record extracted) so you only pull new or updated records each run.
  • Error handling — What happens if the source system is down? If the API returns an error? If the data format changes unexpectedly? Your extraction logic needs to handle all of these gracefully.
  • Staging — Write extracted data to a staging area (a temporary table or file) before transformation. This gives you a checkpoint to recover from if something goes wrong downstream.

Resist the temptation to combine extraction and transformation into one step. Keeping them separate makes debugging significantly easier and allows you to re-run transformations without re-extracting data from source systems.

4. Transform and validate

Transformation is where the real value lives. This is the step that turns raw, inconsistent source data into clean, trustworthy reporting data. Common transformations include:

  • Data type standardisation — Ensure dates are in a consistent format, numbers are the correct precision, and text fields are trimmed and normalised.
  • Deduplication — Identify and handle duplicate records. This is especially important when pulling from multiple sources that may reference the same entities.
  • Business logic application — Calculate derived fields (margins, KPIs, segments), apply currency conversions, map source-system codes to human-readable labels.
  • Referential integrity checks — Ensure foreign key relationships are valid. If an order references a customer ID that does not exist in your customer dimension, that needs to be flagged and handled.
  • Data quality validation — Check for nulls in required fields, values outside expected ranges, and logical inconsistencies (e.g., an order date after a delivery date).

Every validation failure should be logged, not silently ignored. Build a data quality log that records what failed, when, and why. This log becomes invaluable when investigating reporting discrepancies.

5. Load and schedule

The load step writes your transformed data into the warehouse. There are two common strategies:

  • Truncate and reload — Drop all data in the target table and reload it from scratch. Simple and safe, but slow for large tables and not practical for near real-time scenarios.
  • Upsert (merge) — Insert new records and update existing ones based on a unique key. This is the preferred approach for incremental pipelines — it is faster and supports frequent refresh cycles.

Scheduling depends on your chosen refresh cadence. For near real-time pipelines, a 10–15 minute cron job (or equivalent scheduler) works well. Make sure your pipeline completes well within the schedule interval — if your pipeline takes 12 minutes to run, a 10-minute schedule will cause overlapping runs and all kinds of headaches.

Add monitoring from day one. At minimum, track: whether each run completed successfully, how long it took, how many records were processed, and how many validation errors were logged. Send alerts when runs fail or take significantly longer than expected.

Choosing the right refresh frequency

Not every dataset in your warehouse needs the same refresh cadence. In fact, running everything at the highest frequency is wasteful and can create unnecessary load on your source systems.

Here is a practical framework for deciding cadence:

  • High frequency (5–15 minutes) — Sales transactions, inventory levels, customer support tickets, live marketing spend. Data that directly drives operational decisions happening today.
  • Medium frequency (1–4 hours) — Website analytics, email campaign metrics, pipeline stages. Data that informs decisions over the course of a day, but where minute-level freshness adds little value.
  • Low frequency (daily or weekly) — Financial reconciliation, HR data, compliance reporting, historical benchmarks. Data where accuracy and completeness matter more than timeliness.

A sensible ETL architecture supports mixed cadences. Your sales data can refresh every ten minutes while your financial consolidation runs overnight. The key is designing your pipeline so that each data source can run on its own schedule without interfering with the others.

Common pitfalls and how to avoid them

Having built ETL pipelines across a range of industries, we have seen the same mistakes come up time and again. Here are the ones that hurt the most — and how to sidestep them.

Ignoring data quality until it is too late

The most common pitfall by far. Teams build a pipeline that moves data efficiently but do not validate what it is moving. The result: dashboards that look correct but contain subtle errors — wrong totals, missing records, duplicated rows. By the time someone notices, the bad data has already informed decisions.

The fix: Build validation into every stage of the pipeline. Check row counts, verify key fields are populated, validate referential integrity, and log everything. Treat data quality as a first-class concern, not an afterthought.

No error recovery strategy

Pipelines fail. APIs go down, databases lock, networks drop, schemas change without warning. If your pipeline does not handle failures gracefully, a single bad run can corrupt your warehouse data or leave it in an inconsistent state.

The fix: Design for failure from the start. Use staging tables so you can roll back a bad load. Implement idempotent operations — running the same pipeline twice should produce the same result, not duplicate data. Build retry logic with exponential backoff for transient failures.

Over-engineering the solution

It is tempting to reach for enterprise-grade tools — Apache Airflow, dbt, Snowflake, Kafka — before you have validated that you actually need them. For many mid-size businesses, a well-written Python script with a cron schedule and a SQL Server or PostgreSQL warehouse is more than sufficient.

The fix: Start simple. Use the tools your team already knows. You can always migrate to more sophisticated tooling later, once you have a working pipeline and a clear understanding of where the bottlenecks actually are.

No monitoring or alerting

A pipeline that runs without monitoring is a pipeline that will fail silently. You will not know your dashboards are stale until someone complains — and by then, trust in the data has already eroded.

The fix: Implement monitoring from the first deployment. Log run times, record counts, and error rates. Set up alerts for failures and anomalies. A simple email or Slack notification when a run fails is infinitely better than discovering it three days later.

Coupling extraction and transformation

Combining extract and transform into a single step seems efficient, but it makes debugging and recovery much harder. If transformation fails, you have to re-extract from source — which may be slow, rate-limited, or return different data the second time.

The fix: Keep extraction and transformation as separate, sequential stages with a staging area in between. Extract raw data to staging, then transform from staging to warehouse. This gives you a clean recovery point and makes it much easier to trace issues.

Real example: the BI Sense project

To ground all of this in something concrete, here is a brief look at BI Sense — a data warehousing and ETL project we delivered at LovelyPixel.

The client was a mid-size business relying on daily batch reports generated by expensive third-party API services. Dashboards took the better part of a day to refresh. Data quality was inconsistent — errors in the source data regularly surfaced in reports, eroding trust. And as data volumes grew, the existing setup could not scale without significant cost increases.

We designed and built a complete ETL pipeline from scratch. The architecture followed the principles outlined in this article:

  • Incremental extraction from multiple source systems, with connection management, retry logic, and high-water mark tracking.
  • Staging area separating extraction from transformation, providing clean recovery points.
  • Transformation layer with data type standardisation, deduplication, business logic application, and comprehensive validation logging.
  • Structured data warehouse optimised for Power BI dashboards, with a schema designed around the client's actual reporting needs.
  • Scheduled refresh running on a ~10 minute cycle, replacing the previous daily batch.
  • Monitoring and alerting built in from the first deployment, with automated notifications for failures and anomalies.

The results were significant:

  • ~30x speed improvement in dashboard query performance.
  • Refresh cadence reduced from daily to ~10 minutes — operational teams could now make decisions based on data that was minutes old, not hours.
  • Millions of rows processed reliably at each refresh cycle, with built-in error recovery.
  • Reduced cost compared to the previous third-party API services.

The architecture was deliberately designed to scale. New data sources can be added without rebuilding existing pipeline components. The warehouse schema accommodates growth without requiring structural changes. And the monitoring layer provides confidence that the data is trustworthy and current.

This was not a theoretical exercise. It was a practical, production-grade system built for a real business with real constraints — budget, timeline, and an existing technology stack that needed to be accommodated rather than replaced.

Where to from here

If your business is still running on daily batch reports, you do not necessarily need to leap straight to a streaming architecture. For most mid-size businesses, the highest-impact move is building a well-designed ETL pipeline that brings your most important data to a 10–15 minute refresh cycle.

Start by mapping your source systems and identifying which datasets are most time-sensitive. Design a warehouse schema around how your business actually uses data. Build extraction and transformation as separate stages with proper validation and error handling. Schedule sensibly, monitor aggressively, and resist the urge to over-engineer.

The jump from "yesterday's numbers" to "ten-minutes-ago numbers" is, for most businesses, the single biggest improvement they can make to their reporting infrastructure. It changes how teams operate, how quickly problems get spotted, and how confidently decisions get made.

Ready to move beyond daily reports?

Tell us what systems you are working with and what your dashboards need — we will map out a practical ETL approach that fits your business and your budget.

Let's talk about your data

Tell us what you're trying to achieve — we'll suggest the simplest path forward.

No long brief required. Just a quick form — we'll contact you shortly.