Pipelines that run at 2 AM without anyone watching
Anyone can write a script that moves data once. The engineering is in what happens on the four hundredth run, when the source is late, the schema changed, and half the file is corrupt.
Data pipelines are infrastructure, and infrastructure is judged on the days it fails rather than the days it works. Most pipeline estates we inherit fail in the same ways: a job runs on a schedule regardless of whether its input arrived, a partial file is loaded as though complete, a retry duplicates rows because the load was not idempotent, a schema change breaks a transformation silently, and nobody finds out until a report looks wrong the following week.
We build pipelines to a different standard, and the standard is not exotic — it is a small set of properties applied without exception. Every load is idempotent, so rerunning is always safe. Every job depends on data availability rather than a clock. Every failure alerts a named owner with enough context to act. Every transformation is tested. Every run is reconcilable against its source.
The work covers both directions of the modern debate. Traditional ETL, where transformation happens before loading, still makes sense when the target is expensive to compute in or when data must be filtered before it lands for compliance reasons. ELT, where raw data lands first and transformation happens in the warehouse with dbt, is our default for analytics because it preserves the raw record and makes logic changes replayable.
And we build both batch and streaming, choosing based on whether latency changes a decision rather than on which is more interesting to build.
The properties every pipeline we build has
Idempotency first. A pipeline must produce the same result whether it runs once or five times. In practice this means writes are merges keyed on a business identifier rather than appends, partitions are overwritten atomically rather than added to, and any external side effect is guarded by a deduplication key. Without this, retries are dangerous and backfills are terrifying — which is why so many organisations avoid both and instead accumulate wrong data.
Then dependency on data rather than time. A job that runs at 03:00 because the source usually lands by 02:30 will eventually run against yesterday's file. Sensors wait for the actual arrival, with a timeout that raises an alert rather than proceeding silently.
Then observability. Every run records rows in, rows out, rows rejected, duration and the version of the code that produced it. Anomalies against historical norms — a table that usually receives 40,000 rows receiving 400 — trigger investigation before the number reaches a report.
Then reconciliation. For any pipeline that carries financial or operational significance, counts and control totals are compared against the source and published. This is what lets a finance team trust the platform rather than re-checking it in Excel.
In practice
Sources we extract from regularly
Databases are the easy part — PostgreSQL, MySQL, SQL Server, Oracle and MongoDB, extracted either as full snapshots for small tables or through change data capture for large ones. CDC is materially better where it is available: it captures deletes, it does not hammer the source, and it gives you a genuine event stream rather than a periodic photograph.
ERPs are the interesting part. Tally through its XML interface, SAP through extractors or direct table reads, and a long tail of bespoke systems where the only reliable interface is a scheduled export to a folder. We build defensively here: validate that a file is complete before processing, handle the day the format changes without warning, and keep the raw file so a bad load can be replayed.
Then everything else: REST and GraphQL APIs with rate limiting and pagination handled properly, SFTP drops from partners, plant historians and OPC servers, Google Analytics and advertising platforms, spreadsheets from a shared drive that somebody insists on maintaining, and web sources through our scraping practice.
| Source type | Preferred method | Common trap |
|---|---|---|
| Large transactional database | Change data capture | Snapshot extraction that misses deletes |
| Small reference tables | Full snapshot | Over-engineering with CDC |
| Tally / SAP / legacy ERP | Scheduled export plus validation | Assuming the export completed before reading it |
| Third-party API | Incremental with cursor, rate-limited | Re-pulling full history daily and getting throttled |
| Partner SFTP files | Arrival sensor plus checksum | Processing a file still being written |
| Plant historian | OPC read with edge buffer | Losing data during network drops |
Transformation with dbt, and why we like SQL for this
For analytics transformation we use dbt, and the reason is organisational as much as technical. Transformation logic written as SQL models in version control, with tests and documentation attached, is legible to analysts as well as engineers. That widens the group of people who can contribute and review, which is usually the real bottleneck.
The discipline dbt brings matters more than the tool: every model is a select statement with a single responsibility, dependencies are inferred rather than declared manually, tests run on every build, and documentation with lineage is generated automatically. A new analyst can open the docs and see what a table means, where it comes from and what tests guard it.
Where transformation genuinely needs procedural code — complex parsing, machine learning feature generation, plant-specific calculations with iterative logic — we use Spark or Python and keep it clearly separated rather than contorting SQL to do something it does badly.
Tests are not optional
Every dbt model we ship carries at minimum: uniqueness and not-null on its key, referential integrity on its joins, and accepted-value tests on its categorical columns. Critical financial models add reconciliation tests against the source. A model without tests does not merge.
Real-time when it changes a decision
We build streaming pipelines for control-room alerting, live operational dashboards, fraud and anomaly detection, and any case where a delayed number means a missed intervention. Kafka provides durable, replayable ingestion; Spark Structured Streaming or Flink does the processing; and the output lands both in a serving store for immediate query and in the lakehouse for history.
The engineering discipline here is different from batch. Late data must be handled explicitly through watermarks. Exactly-once delivery requires idempotent sinks and checkpointed offsets. State must be bounded or it grows until the job dies. And operational tooling must let you replay from an offset when logic changes, which is why we keep raw events in Kafka with a retention period long enough to reprocess.
For clients who need low latency but not true streaming, micro-batch every one to five minutes is often the better engineering trade — most of the benefit, considerably less operational complexity.
Migrating an existing pipeline estate
Many engagements start with an estate of legacy pipelines — SSIS packages, Informatica jobs, cron-driven shell scripts, or a folder of Python files that one person understands. Migration is done incrementally and with proof.
We run old and new in parallel, comparing outputs row by row until they match, and only then decommission the old. Where the old pipeline was subtly wrong — which happens more often than clients expect — we surface the discrepancy and let the business decide which behaviour is correct rather than assuming. That conversation is frequently the most valuable part of the migration.
We also take the opportunity to remove what is not used. In a typical estate, twenty to thirty per cent of scheduled jobs feed reports nobody has opened in a year. Turning them off is free performance and free cost saving.
“They ran our new pipelines alongside the old ones for six weeks and found four places where our existing reports had been quietly wrong for years. That alone was worth the project.”
Running them: alerting, on-call and runbooks
A pipeline estate needs an operating model, not just code. We define ownership per pipeline, an SLA appropriate to its business use, and an escalation route that reaches someone who can act. Alerts are tuned to be meaningful — an estate that pages for everything trains people to ignore it, which is worse than no alerting.
Every failure mode we can anticipate gets a runbook: what the alert means, how to diagnose, what to check, and whether the correct action is retry, skip, backfill or escalate. This is what allows a client's own team to operate the platform overnight without needing the engineer who built it.
For clients who prefer us to run it, we offer managed operation with defined response times, including overnight cover for the batch window when most failures actually happen.
Every engagement starts with a conversation, not a proposal template.
Thirty minutes with a senior engineer. You leave with an architecture sketch and an honest cost range, whether or not you hire us.
What is actually included in etl & data pipelines
Each of these is something we have shipped and still support in production — not a list of things we could do if asked.
Batch ingestion
Scheduled extraction from databases, ERPs, files and APIs with validation and arrival sensing.
Change data capture
Log-based CDC from PostgreSQL, MySQL, SQL Server and Oracle without loading the source.
Streaming ingestion
Kafka and Spark or Flink with watermarking, exactly-once semantics and replay.
Transformation
dbt models with tests, documentation and lineage; Spark or Python where procedural logic is genuinely needed.
Orchestration
Airflow with data-availability sensors, retries, SLAs, backfills and ownership.
Quality and reconciliation
Contracts, quarantine, control totals and published reconciliation reports.
Legacy migration
SSIS, Informatica, cron and shell estates migrated with parallel-run verification.
Managed operation
Monitoring, alerting, overnight cover and runbook-driven incident response.
The stack we actually use for this
Chosen for what your team can maintain in three years, not for what looks impressive in a proposal.
Orchestration
- Apache Airflow
- Cloud Composer
- MWAA
- Dagster
- Azure Data Factory
Processing
- Apache Spark
- dbt
- Python
- Pandas
- Polars
- Flink
Ingestion
- Kafka
- Debezium
- Snowpipe
- Fivetran
- Airbyte
- Custom connectors
Targets
- Snowflake
- BigQuery
- Redshift
- Databricks
- PostgreSQL
- Iceberg
From first conversation to something in production
Two-week slices, a demo you can share every alternate Friday, and no phase where you are waiting without seeing progress.
Source profiling
What the data actually looks like, including the parts nobody documented.
Contract definition
Schema, nullability, ranges, uniqueness and freshness agreed with the owning team.
Build with tests
Pipeline and transformation code with tests written alongside, not after.
Parallel run
Where replacing something, both run until outputs match and differences are explained.
Observability
Metrics, anomaly detection, alerting routes and runbooks in place before go-live.
Handover or operate
Your team takes it with documentation, or we run it under an SLA.
Everything hands over. No lock-in, ever.
Source code in your Git organisation, infrastructure in your cloud account, domains in your name and documentation written for the next team rather than for us. If you part ways with us in year three, a competent engineer should be able to take over in a fortnight.
Deliverables checklist
- Pipeline code in version control with CI
- Documented data contracts per source
- dbt project with tests, docs and lineage
- Airflow DAGs with owners, SLAs and alert routes
- Reconciliation and quality dashboards
- Runbooks for every anticipated failure mode
- Parallel-run comparison reports where replacing legacy
What this typically costs
Real ranges from real projects. The variable is almost always scope and integration count — the calculator will get you closer in two minutes.
Pipeline audit
₹1,60,000
An existing estate that fails too often or costs too much.
- Inventory and dependency map
- Failure analysis
- Cost review
- Unused pipeline identification
- Remediation plan
Build engagement
₹6,00,000 – ₹24,00,000
New pipelines or migration of an existing estate.
- Source connectors
- Transformation models with tests
- Orchestration and observability
- Parallel run
- Runbooks and handover
Managed pipelines
₹2,20,000 / month upwards
We monitor, respond and keep developing.
- 24×7 monitoring
- Overnight batch cover
- SLA response
- Ongoing development
- Quarterly review
All figures exclude GST. Fixed-price options available on defined scope. Build your own estimate →
The questions clients actually ask
Including the ones where the honest answer is that you may not need us. If your question is not here, call +91 70033 91355 — you will speak to an engineer, not a call handler.
ELT for analytics in most cases: land raw data first, transform in the warehouse with dbt. It preserves the source record, makes logic changes replayable without re-extraction, and puts transformation in SQL that analysts can read. ETL still wins when data must be filtered or masked before it lands for compliance reasons, when the target is expensive to compute in, or when volumes are so large that transforming in flight avoids storing raw. We use both, on that basis.
For standard SaaS sources — Salesforce, HubSpot, Stripe, Google Ads — buy. Building and maintaining those connectors is a poor use of engineering time and the managed products handle schema drift well. Build custom for your own databases, your ERP, plant systems and anything with unusual semantics. Most of our clients run a hybrid, and we help set the boundary based on cost at your row volumes, which is where managed tools can become expensive.
Detect, quarantine, alert — never silently adapt. A new column is usually safe and gets added to the raw layer automatically. A removed or retyped column fails the contract, and the affected records go to quarantine with the reason while the owning team is alerted. Downstream models are pinned to explicit columns rather than select-star, so an upstream change cannot silently alter a report. Where a schema registry is available we enforce compatibility at the producer.
It depends on what the data feeds, and we set it explicitly per pipeline rather than uniformly. A daily management report typically has an SLA of "complete by 07:00, alert if not". A control-room feed might be "five minutes end to end". Setting the SLA forces the useful conversation about what actually matters, and it means alerting can be meaningful rather than noise.
Usually yes, and it is often the right answer. The common problems are recurring: tasks that are not idempotent, schedules that assume data arrival, a single alert channel nobody monitors, missing SLAs, and DAGs with no owner. Those are fixable incrementally without a migration. We start with an audit and give you a ranked list — several clients have taken that list and executed it themselves.
As a deliberate operation with its own plan: partition the work, run at controlled parallelism so the source and the warehouse are not overwhelmed, checkpoint progress so an interruption resumes rather than restarts, and reconcile counts as it proceeds. We have backfilled several years of plant data at billions of rows this way. The key design property is idempotency — without it, backfills are too risky to attempt and estates accumulate permanent gaps.
Why being local to you matters here
Manufacturing groups across West Bengal typically have data in a plant historian, an ERP and a stack of spreadsheets, with a small MIS team assembling reports by hand every month. Pipelines are the intervention that frees that team to analyse rather than assemble — and because we are local, we can sit with them for the first month rather than handing over documentation and disappearing.
For ETL and data pipeline development in Kolkata, call +91 70033 91355 or message us on WhatsApp. An audit of your existing estate takes about ten days and produces a list you can act on with or without us.
Services that pair with this
View everythingTell us what is slowing your business down.
A 30-minute call with a senior engineer — not a salesperson. You leave with an architecture sketch and an honest cost range, whether or not you hire us.
Direct line
+91 70033 91355Mon–Sat · 9:30 AM – 7:30 PM IST · Sealdah, Kolkata