Skip to main content

Data & AI · Data engineering

Data engineering with tested transformations and lineage you can trace

We build ingestion, transformations and orchestration as code in your repositories, with data tests on every change and lineage recorded at every stage. When a number looks wrong, your engineers can see where it came from and what changed.

Ingestbatch and streamingTransformversioned modelsData testsgate every runPublishtrusted datasetsLineagerecorded atevery stepEach dataset traces back to its source
Ingest lands source data, transform builds modelled tables, data tests check each result, and publish releases it to consumers. Every stage reports to lineage, so each table traces back to its sources.

The problem

Where this usually breaks down

  • Logic hidden in scheduled scripts

    Business rules live in stored procedures, notebooks and scheduled queries that only their authors understand. A change means editing code nobody reviews, with no way to see what else it affects.

  • Failures found by the business

    Nothing checks the data between load and report, so duplicated rows, missing periods and broken joins surface when someone questions a dashboard. By then the wrong numbers have already been shared.

  • No trace from report to source

    When a figure changes, finding the source, job or rule that caused it means manual tracing, because nothing records how tables depend on each other.

What we do

What we set up, and how each part works

We work in your repositories and through your change process, so everything we set up can be reviewed, run and changed by your engineers after we leave.

  • Ingestion that respects source contracts

    Batch loads, change data capture and event streams land in the landing zone unchanged, with load metadata attached. Schema and freshness checks against each source contract stop a bad load before anything downstream reads it.

  • Transformations as reviewed, modular code

    We write transformations in dbt for SQL workloads and in Apache Spark where volume or logic needs it. Staging, intermediate and mart models keep each rule in one place, and every change arrives as a reviewed merge request.

  • Data tests on every model

    Every model carries tests for keys, nulls, accepted values and relationships, plus checks on volumes and freshness. The tests run in CI against a development build, and a failing test blocks the deployment.

  • Orchestration with clear ownership

    Apache Airflow, Azure Data Factory or your platform’s own scheduler runs the pipelines in dependency order, retries what is safe to retry, and alerts the owning team, not a shared inbox, when a run fails.

  • Lineage captured at every stage

    Each job emits lineage through OpenLineage or the platform catalogue. You can trace a report column back to its source field, and see what a proposed change would affect before it merges.

  • One path from branch to production

    Pipelines run in development, test and production from the same code. A merge request builds and tests only the models it changes, and promotion to production happens through your pipeline, never from a laptop.

What you keep

What stays with your team when we finish

Everything is committed to your repositories or written into your documentation, under your access controls. Nothing depends on us to keep running.

  • Pipeline code in your repositories

    Ingestion, transformation and orchestration code, with the CI configuration that tests and deploys it, in the repositories your team already uses.

  • A test and alerting standard

    Which tests every model needs, which failures block a release and which only warn, and which team is alerted for each.

  • Lineage and model documentation

    Generated documentation for every model and column, and lineage from source to consumer that refreshes with each deployment.

  • Runbooks for failures and backfills

    How to rerun a failed load, backfill a period safely, absorb a breaking source change and roll back a bad release.

How we work

How an engagement runs, phase by phase

Each phase ends with something your team reviews and signs off before the next one starts. We work inside your change control, not around it.

  1. 01

    Trace the critical flows

    We pick the reports and data products that matter most and trace each one back to its sources, recording the rules, jobs and hand-offs on the way. That trace sets the order of work.

  2. 02

    Set the engineering standard

    We agree the project layout, naming, testing rules, review process and deployment path with your engineers, and set up CI so the standard is checked on every change rather than remembered.

  3. 03

    Rebuild flow by flow

    Each flow is rebuilt as tested, lineage-aware code and run beside the old job until the outputs match. Only then do consumers switch over and the old job stop.

  4. 04

    Hand over the practice

    Your engineers lead the later flows while we review. They keep the code, the tests and the runbooks, and the habit of releasing small, reviewed changes.

Technology

The tools this work runs on

Each group says whether a tool appears in our published work, so you can tell what we have shown from what we offer.

Offered, not in published work

  • dbt
  • Apache Spark
  • Apache Airflow
  • Azure Data Factory
  • Azure Databricks
  • BigQuery
  • Snowflake
  • OpenLineage
  • GitLab

Questions

What teams ask before we start

Our pipelines run in Azure Data Factory. Do we rewrite them?

Not by default. Ingestion in Azure Data Factory often stays where it is, while transformation logic moves into dbt or Apache Spark, where it can be tested and reviewed. We rewrite a pipeline only when its logic cannot be tested or traced where it lives.

Does dbt suit every transformation?

No. It suits SQL transformations inside the warehouse or lakehouse, which covers most analytical work. Heavy processing, complex parsing and streaming sit better in Apache Spark, and we keep both under the same testing and lineage rules.

How do data tests fit with our change control?

They run on every merge request, and the results sit beside the code review. Your existing approval steps stay in place. The tests give approvers evidence about the data rather than adding another manual gate.

Who fixes a pipeline when it fails out of hours?

Your team, with the runbooks. Alerts go to the team that owns the flow, each alert links to the failing run and its lineage, and the runbooks cover reruns and backfills. We can support your on-call engineers while the first flows settle in.

Related services

  • Data platform architecture

    A lakehouse or warehouse organised into landing, curated and serving zones, with data contracts, access policy and lineage your team owns.

  • Analytics and semantic models

    A semantic model with governed metric definitions, so board reports and team dashboards in Power BI or Looker show the same numbers.

  • CI/CD pipelines with enforced gates

    Pipelines that run unit tests, SCA, SAST, quality and image scans in cost order, and send every failed gate to the team that owns it.

Next step

Plan your data pipelines with us

Tell us which flows matter most and where they break today. We will come back with a view on which to rebuild first and how to test them.