Lesson 24 / 25

Case Study: A Daily Sales Pipeline

Design a daily pipeline that loads orders, builds a revenue table and refreshes a dashboard.

The design

Schedule 0 1 * * * (01:00 UTC) with catchup=False and max_active_runs=1. Tasks: a deferrable sensor waits for the day's export file; extract loads raw rows into staging.orders partitioned by {{ ds }}; a dbt build transforms them inside the warehouse into analytics.daily_orders using delete-then-insert for the date; a data-quality task checks row counts and null rates and fails the run if they are off; a final task refreshes the dashboard cache. Defaults: 3 retries with exponential backoff, a 1-hour execution_timeout, an on_failure_callback that alerts the team, and a source_db pool of 3 slots. DAG changes go through pull requests with an import test in CI. A backfill of any past week is safe because every task is idempotent and uses the run's date.

A dependable daily pipeline

Idempotent tasks, date-based partitions, retries, checks and alerts combine into a pipeline you can trust.

Four parts: extract, transform, check, publish.
Figure 8.1 — Extract, transform, check and publish.

The pipeline on one page

Each line maps to a section of this course.

wait_for_export (deferrable sensor, timeout)  --> extract (partition dt={{ ds }})   (Sec 4, 3)
  --> dbt_build (delete+insert for the date, in warehouse)                         (Sec 5)
  --> check_rows (fails run on bad counts)  --> refresh_dashboard                  (Sec 6)
Defaults: retries=3 + backoff, execution_timeout=1h, on_failure_callback, pool source_db=3 (Sec 6)
Schedule: 0 1 * * *, catchup=False, max_active_runs=1                              (Sec 2)
Deploy: Git + PR review + DagBag import test, pinned versions, PostgreSQL metadata (Sec 7)

Write a runbook

For each alert, document what it means, how to check, how to re-run or backfill, and who owns it. A short runbook turns a 3 a.m. page into a routine fix.

Quick check: Why is a backfill of any past week safe in this design?

  • Data is never stored
  • Airflow forbids backfills
  • Tasks are idempotent and use the run's date
  • Because there are no retries
Answer

Tasks are idempotent and use the run's date — Deterministic, date-partitioned writes mean re-running a date yields the same result.