See it as a diagram
Everything below, as a diagram you can edit. Describe yours and see it in seconds.
No account needed · Editable canvas, not a picture
The seven components
Sources, named as systems of record rather than logos. Salesforce is a logo; Salesforce Opportunity and Account objects, extracted by bulk API, is a source. The distinction matters because the second version tells a reader which team to call when the numbers are wrong.
Ingestion, named by mechanism. Managed connector, custom extractor, CDC reader, and event producer fail in different ways and are owned by different people, so they should not all be one grey box called ingestion.
The landing store, which is the first place your organization has custody of the data. It is the boundary that matters for replay: everything downstream of it can be rebuilt, everything upstream of it cannot.
The transformation engine, with its execution unit visible. For dbt that is models grouped by layer; for Spark it is jobs; for stored procedures it is the procedure names. The reader needs to know what a single unit of failure looks like.
The modelled layers, which is where the medallion or staging and marts convention shows up as zones rather than as a naming convention nobody outside the team knows.
The serving surfaces, each with a named consumer. A gold table with no named consumer is a candidate for deletion, and the diagram is the cheapest place to notice that.
Orchestration and ownership, drawn as an annotation rather than as boxes in the flow. The orchestrator does not carry data, so drawing it inline distorts the picture. Put the DAG name and the owning team on the zone label.
The two omissions: the failure path and the cadence
The failure path is missing from almost every pipeline diagram in existence. Records that fail validation go somewhere: a dead letter queue, a quarantine table, a rejects file, or, worse, nowhere. Drawing that path costs one node and one arrow and answers the most common on-call question, which is where did the missing rows go.
Cadence is the second omission. A diagram without refresh intervals cannot tell you whether a stale dashboard is broken or simply early. Put the cadence on the arrows, and put the freshness expectation on the serving nodes, for example data as of 06:00 UTC daily. Those two annotations turn a picture into something an on-call engineer can triage from.
Both omissions share a cause: the diagram is drawn by someone thinking about the happy path at design time, and read by someone dealing with the unhappy path at run time. Drawing for the second reader is what makes the difference.
The test to run before publishing
Hand the diagram to someone who did not build the pipeline and ask three questions. If the Monday morning revenue dashboard is wrong, which three boxes do you check first. If we add a new source system, where does it attach. If this table were deleted, who would notice. A diagram that cannot answer all three is decoration, and the fix is usually adding cadence, ownership, and the failure path rather than adding more boxes.
The second test is subtraction. Remove every node whose deletion would not change any of the three answers. Most first drafts lose a third of their nodes to this and get better. Repeated connectors, intermediate staging steps that nothing else references, and the monitoring stack all tend to go.
## Pipeline diagram checklist - [ ] Every source names the system of record and the extraction method - [ ] The landing store is identifiable as the replay boundary - [ ] Transformation units are visible (models, jobs, procedures) - [ ] Layers are zones, not just naming conventions - [ ] Every sink has a named consumer - [ ] Every arrow carries a cadence - [ ] The quarantine or dead letter path is drawn - [ ] Each zone carries an owning team - [ ] Fewer than ~30 nodes, or split into two diagrams
Ownership on the zone, not on every node
Where each of these facts already lives
Every item above exists somewhere in the codebase before it exists on the diagram, and copying it from there rather than from memory is what makes the diagram checkable later. Cadence lives in the orchestrator: the schedule string on a DAG, the cron in a job config, the trigger on a streaming writer. Paste the string rather than paraphrasing it, so a reader can search the repository for it and land on the thing that sets it.
Consumers live in the transformation project when it declares them. A dbt exposure is a first class object with a type of dashboard, notebook, analysis, ml, or application, an owner that must carry a name or an email, a depends_on list accepting ref, source, and metric references, and optional url and maturity fields set to high, medium, or low. A project that declares exposures has already written down which sink feeds which consumer, so the right hand edge of the diagram is read out of the project instead of invented in a meeting.
The failure path lives wherever rejected rows are actually written, which is a table name, a bucket prefix, or a queue name, so the node should carry that name rather than the word quarantine. Ownership lives in CODEOWNERS or in the exposure owner. The trust boundary is the one item on the list that no file states outright: it is the line between systems your team deploys and systems it does not, and somebody still has to decide where it falls before anyone can draw it.
FAQ
What components should a data pipeline architecture diagram include?
Why should the failure path be on the diagram?
Should the orchestrator be drawn as a box in the flow?
How do I know if my pipeline diagram is good enough?
Is an ETL architecture diagram different from a data pipeline diagram?