Data engineering

Jobs that finish. Migrations that reconcile. Storage that stops paying for cold data.

This is the platform discipline underneath everything else, not analytics preparation. We tune pipelines and backend jobs for runtime and cost together, take systems across field by field with reconciliation that proves what landed matches what left, lay out storage for how the data is actually read, and leave lineage your auditors can follow. Reporting is one consumer of a good foundation, never the reason to build one.

Companies delivered for
20+
Median to first production-grade artefact
6 weeks
Median recovered or saved, verified by customer Finance
$240k
Week 1 audit
Fixed fee, two calls, one-pager kept either way
Pune, delivering across
APAC, India and US

Where this work sits, and what runs on top of it

Every layer below is somebody's operational problem before it is anybody's reporting problem, and the last box is the one most vendors start with.

  1. 01

    Source systems and their exceptions

    The CRM, the ERP, the point of sale, the spreadsheet a regional manager has quietly maintained for years. Each one allows things its own documentation says it does not. We find those rules before anything moves.

  2. 02

    Ingestion and backend jobs

    Batch and streaming jobs written to finish inside the window they are given and to stop costing more every month. Runtime and spend are the same design decision, so they get profiled together.

  3. 03

    Storage and access design

    Partitioning, file sizing and hot, warm, cold tiering with lifecycle rules, chosen for how the data is read rather than for the order it happened to arrive in.

  4. 04

    Contracts, quality and lineage

    Schema contracts at the boundaries, quality checks that fail a run rather than warn in a log nobody reads, ownership per dataset, and lineage that answers where a figure came from.

  5. 05

    Whatever runs on top

    Operational apps, the month end close, machine learning features, agents, and yes reporting. Reporting is one consumer of this foundation and usually not the one paying for it.

What we have actually delivered

The lineage discipline is the part that travels, and it is why a figure survives contact with an auditor.

20+Companies delivered forAcross APAC, India and the US, with the platform work underneath most of them.
6 weeksMedian to first production artefactNot a prototype. Something running that your team can break and we fix.
30 daysFrom flag to Finance sign-offOn the APAC engagement, because the lineage existed before the number did.
$240kMedian recovered or savedPer engagement, verified by the customer's own Finance team, not by us.

Where the number ends up

The point of the pipeline discipline is that a figure survives the room it is presented in.

The number on the screen, with the people who have to defend it
A figure nobody can trace does not survive its first meeting with Finance.

The symptoms that start most of these conversations

None of these arrive described as a data problem; they arrive as an operations problem with a deadline attached.

Runtime

The nightly window has run out

The batch used to be done before the working day started. Now it is not, and the first part of every morning goes on asking whether yesterday actually loaded.

Migration

The migration is months past its date

The connectors were the easy part. What stalled it were the fields nobody could explain and the records the old system quietly allowed against its own rules.

Cost

The bill grows faster than the data

Storage is one line and compute is another, and both usually trace back to the same mistake. Everything hot, everything scanned, nothing tiered, nothing compacted.

Trust

Nobody can say where the number came from

Two teams quote different figures for the same measure, and the disagreement gets settled by seniority rather than by evidence.

Fit

The tool does not fit the shape of the data

The off-the-shelf modelling layer has an opinion your data does not match, so the same long query gets rewritten by hand every week and nobody dares change it.

Each symptom belongs to a layer

The complaint arrives from operations, and the fix always sits one layer down in the platform.

  1. The nightly window has run outIngestion and backend jobs
  2. The migration is months past its dateSource systems and their exceptions
  3. The bill grows faster than the dataStorage and access design
  4. Nobody can say where the number came fromContracts, quality and lineage
  5. The tool does not fit the shape of the dataQuery and domain layers
Left, what the business says is wrong. Right, the layer the work actually happens in. Most engagements arrive with two or three of these tangled together.

Five kinds of work that share one discipline

These are not five products; they are the five things that go wrong underneath, usually tangled together in the same engagement.

Pipelines and backend jobsRuntime and cost

Tuned together, because they are the same knob

Jobs get profiled before they are rewritten: what scans most, what re-reads data it already holds, what runs hourly against a daily source. The rewrite targets the clock and the invoice together, measured on your workloads before and after.

System migrationsField by field

CRM to CRM, ERP, warehouse to warehouse

Every field gets a destination, an owner and a decision, including the ones deliberately left behind. Cutover runs with reconciliation attached, so what landed can be proved against what left rather than asserted.

Storage and access designHot, warm, cold

Partitioning, file sizing and lifecycle rules

Data is laid out for the queries that actually run. Small files are compacted so engines stop paying per file, partitions match the filters people really use, and lifecycle rules tier data on a schedule.

Query and domain layersBuilt, not bought

For when the packaged tool does not fit the data

Occasionally the honest answer is a small domain language or query layer of your own. Narrow, documented, versioned, thin enough for your team to own after we leave. We build it only when the workarounds cost more than the thing.

Governance, quality and lineageWho touched what

Evidence, not a slide about evidence

Checks that fail the run, ownership per dataset, and lineage that traces a figure back through every job that touched it. This is what lets Finance, audit and risk sign something off without rebuilding the history by hand.

Read the case studies

What a cutover has to prove before we call it done

A migration is finished not when the data lands but when somebody in Finance or Operations agrees the new system is the one they will use tomorrow.

  • Counts reconcile by entity and by period

    Every object, every period, source against target, with the differences listed individually rather than summarised into a percentage.

  • Money ties back to the system of record

    Balances, invoices and credits reconcile to the finance system itself, not to a convenient intermediate extract.

  • Dropped fields are named in advance

    Anything not carried across is written down with the reason and the person who agreed to it, before cutover rather than after somebody misses it.

  • Exceptions get a decided destination

    The records the old system permitted against its own rules are modelled, not filtered out. These are the ones that stall a cutover after everything else is ready.

  • The old system stays readable for a while

    A planned period with both systems queryable, so a disputed record can be checked instead of argued about.

  • Reruns are safe

    Loads are written to be repeatable, so a failed step is run again rather than patched by hand at two in the morning.

This list gets written for your systems specifically during the Week 1 audit. Two calls, a fixed fee, and you keep the one-pager whether or not the rest of the work goes ahead.

The mapping is the project, not the connectors

Tooling moves rows; what takes the time is agreeing what each field means on the other side, and naming the decision for the ones with no honest home.

  1. account_ownerOwner (user ID)
  2. billing_countryBilling country (ISO)
  3. close_dateClose date (UTC)
  4. stage_custom_7Pipeline stage
  5. notes_freetextActivity note
  6. discount_flag_legacyNot carried across, documented
An illustration of the shape, not a real client schema. The field names change every time, the two hard rows do not: the free text box a team uses as a status, and the legacy flag nobody can explain that Finance still reports on.

Two decisions we make on your workloads, not on preference

Both get decided by profiling your own systems first, because the answer differs by shop and a general rule of thumb is worth very little here.

Storage layoutThe problem

Laid out the way the data arrived

Most platforms are laid out the way the data arrived rather than the way it is read. Queries scan far more than they need, and data nobody has touched in a long time sits on the most expensive tier available.

Storage layoutThe fix

Unglamorous and measurable

Partition on the columns people actually filter by, compact small files so the engine stops paying per file, and set lifecycle rules that move data from hot to warm to cold automatically.

Query layerUsually buy

The packaged tool is normally right

Buying the packaged modelling tool is usually right, and we will say so. It stops being right when your data has a shape the tool has no opinion about.

Query layerSometimes build

When the tool has no opinion

Then the same logic ends up pasted into several places and the team cannot safely change any of them. We build a small documented query layer over the data you have, versioned and handed to your team to own.

Why six weeks is possible: we do not start from an empty repository

Two things shorten this work: scaffolding we have already run in production, and Claude doing the reading and drafting that used to eat the first fortnight.

  1. Already built

    Scaffolding we bring with us

    Ingestion patterns, quality check harnesses, reconciliation runners and lineage capture that have already run in production elsewhere. Proven in other engagements, then fitted to your systems rather than written again from scratch.

  2. AI first pass

    Reading what nobody documented

    Claude reads legacy schemas, stored procedures and the exception handling nobody wrote down, then drafts the candidate field mapping and flags what it could not explain. A person confirms every decision, and the flags are where we start asking questions.

  3. AI first pass

    Generating the checks, not just the code

    Reconciliation and quality tests are drafted from the mapping itself, so the thing that proves the migration is built alongside the migration rather than after it, when nobody has budget left.

  4. Human call

    The decisions stay with the engineer

    Which exception is a rule and which is a bug, what gets left behind, what a threshold should be. AI does not make those calls here, and we will not pretend otherwise on a call.

  5. What you keep

    Yours to run without us

    Documented, versioned and handed over, including the prompts and harnesses. We are not renting you a black box you have to call us to change.

APAC grocery: the lineage came before the agent

APAC retail grocery, over $500M revenue, six weeks: the agent that raised the margin flag belongs to our AI work, and what belongs here is the lineage and the checks that made the flag worth trusting.

Day 14First margin flag raisedActionable on day one of its existence, because every input behind it could be traced back to the job and the source record that produced it.
$240kRecoveredVerified by the customer's own Finance function against their ledgers, not counted by our reporting.
+2.4ppMargin improvementIt stayed after we left, because the checks, contracts and lineage stayed in the platform rather than in a consultant's laptop.
30 daysFinance sign-off from the first flagSign-off was quick because the question every finance team asks, where did this number come from, had an answer on screen.
6 weeksTo the first production-grade artefactThe same three phases as every engagement: audit in Week 1, ship from Week 2, operate from Week 7.

Where day 14 falls in a six-week build

The first margin flag on the APAC grocery engagement landed at day 14 of the six weeks to the first production-grade artefact.

Day 1, Week 1 auditDay 42, six weeks
Six weeks drawn as 42 days. The flag was actionable on day one of its existence because the lineage behind it was already in place, and Finance signed off within 30 days of it.

Questions platform and operations teams ask us

Is AI writing our system, then?

No. AI does first passes and we review every one. The decisions that make a system trustworthy, the mapping calls, the thresholds, the rules a regulator would ask about, are made by the people whose names are on the work.

So what does the AI actually take away?

The transcription: reading a thousand columns, drafting the obvious, generating the harness that checks it. That is where the weeks go, and it is the part nobody enjoys or does consistently well by hand.

We already have engineers. Why bring in a pod?

Because your engineers are usually the only people who know the exceptions, and they are already fully committed. We take the mapping, the job rewrites and the reconciliation, working alongside them rather than around them.

How quickly does anything actually work?

A pod of three runs the Ship phase from Week 2, and something works by Week 3, which is early enough for your team to disagree with us while disagreeing is still cheap.

Our data is a mess. Should we clean it up first?

Nobody has ever finished that clean-up before starting. The Week 1 audit exists for this state: two calls, a fixed fee, and a one-pager naming what is broken, what it costs you and the order to fix it in. You keep it either way.

Will this be another platform we cannot maintain?

The test we hold ourselves to is whether your team can change it without us in the room. If we have built something only we can operate, we have failed at the part that matters.

What happens after the build?

Quarterly reviews from Week 7 keep it honest, jobs, contracts and lineage are documented and handed over, and on-call governance is a service you can stop at any point.

Can you migrate without freezing the business?

Cutovers run with the old system readable while the new one takes writes, and reconciliation attached at each step. Freeze periods are short and planned. The long, painful freezes almost always come from having no reconciliation, so nobody will commit to the switch.

How do we know what landed matches what left?

You get counts by entity and period, money tied back to the system of record, and a named list of everything deliberately dropped. On the APAC grocery engagement Finance signed within 30 days, because they could follow the lineage themselves.

Is this really just preparation for dashboards?

No. The jobs that reconcile your ledgers, the systems your operations team types into all day, and any agent you run later sit on this foundation. If a dashboard is the only reason, we will tell you to buy off the shelf instead.

The rest of the practice

These are genuinely different jobs with different ways of failing. Most engagements start in one of them.

Start with the Week 1 audit

Two calls, a fixed fee, and a one-pager naming what is broken in your platform, what it is costing you and the order to fix it in. You keep it either way. NDA-friendly, fixed scope. Write to hello@woodfrog.tech.