CDS pluginCDS plugintypeInstalls into a CAP project and extends the runtime. CAP loads it through cds.requires or the plugin hook.See every one →What this type is →independently maintainedindependently maintainedoriginPublished by one person or a small company outside SAP. Says nothing about quality; the readings say that.See every one →

cds-data-pipeline

Declarative scheduled pipelines between CAP services — each one a linear READ, MAP, WRITE from a single source to a single target, with tracking, retry, delta support and a management API.

The linearity is the design: one source, one target, no branching, so a run either moved a batch or it did not and the tracking says which. Delta support and retry are what make it survive a schedule rather than a one-off script.

Facts

Latestv0.4.0ReleasedLast pushLicenceMIT

Where it sits

Lives in
Provides
Data federationCAPData federationcapabilityReading data that lives in another system as if it were local — by federating the query, by copying the rows, or by caching what was read. Three different answers to one question, and the choice is about how stale you can afford to be.
Flavors
Node.jsfrom its runtime
Requires
@sap/cds≥ 9@sap/cdsartifactThe peer range, as published.

Who is behind it

Mike ZaschkaMike ZaschkaPersonMaintains this
In the atlas: maintains 6, contributes to 9, wrote 12
@mikezaschka
maintainer

Before choosing this

Conditions

LicenceSAP Developer License Agreement 3.2 CAP§ 1, 2, 3A cds-plugin is used with SAP CAP materials, or an artifact is explicitly identified as a CAP plugin or application.
  • § 1 License. Productive customer applications are limited to SAP BTP or another SAP-licensed platform, and mass extraction to a non-SAP product is restricted except where solely required for SAP interoperability.
  • § 2 Intellectual Property. The agreement retains SAP's rights in the covered materials and limits making APIs, tools or software available to third parties, while preserving ownership of customer applications subject to SAP's underlying rights.
  • § 3 Artificial Intelligence Training. The agreement prohibits use of the covered materials and customer applications for training artificial-intelligence models or systems.
SAP Developer License Agreement 3.2 CAP →

Also, from Data federation§ 1: Section 1 restricts mass extraction to a non-SAP product and states a scoped interoperability exception. That boundary is central to a replication design and must be checked against the actual use.

What it declares

Every artifact

Type
CDS plugin
Origin
Independently maintained
Runtime
Node.js

As a CDS plugin

Declared for
>=9
Distributed through
npm

For data federation

Approach
Delta handlingWrites reach the source
Strategy
copy
Refresh
scheduledexternal trigger
Reads from
ODataRESTCAP service
Writes to
local databaseremote OData service
property statedstated nonot said

Connections2

Install

npm add cds-data-pipeline

Derived from the package name. No recipe recorded; the README has the configuration.

README

quoted from mikezaschka/cds-data under MIT, read
mikezaschka/cds-data/packages/cds-data-pipeline/README.mdOn GitHub

cds-data-pipeline

npm version monthly downloads CI License: MIT SAP CAP Documentation

Documentation · npm

A CAP plugin for declarative, scheduled data pipelines between CAP services. Each pipeline moves data from one source to one target in a linear READ → MAP → WRITE flow — with tracking, retry, delta support, and a management API out of the box.

Beyond CAP

CAP already gives you the moving parts — cds.connect.to, consumption views, cds.ql, UPSERT, cds.spawn, the Event Queues scheduling API (CDS 10), and the standard before / on / after hook API on services. Reference samples assemble the read–map–write loop by hand: paging, delta watermarks, error handling, and scheduling copied into every project.

This plugin reuses those primitives and adds the orchestration layer on top:

Reuses from CAPAdds on top
cds.connect.to for source and target I/OFixed READ → MAP → WRITE run envelope with PIPELINE.* events
cds.spawn / Event Queues scheduling API / external executeThree scheduling engines — see below
UPSERT / INSERT / DELETE via target adaptersDelta modes, retry with backoff, concurrency guard, run history
Standard service hooksPer-pipeline before / on / after on every phase — opt-in only
Consumption views (when used with federation)Management OData at /pipeline, data inspector, Pipeline Console

You call addPipeline({ source, target, … }) once; the engine owns the loop. Hooks are the CAP escape hatch when a run needs custom logic — not a requirement for every pipeline.

Install

npm add cds-data-pipeline
DependencyVersionNotes
@sap/cds>= 9CDS 9 and CDS 10
Node.js>= 22

Connect: cds.connect.to('data-pipeline'). Full feature list: Features.

Features

Pipeline intents

Intent is inferred from the config shape — no kind flag.

IntentTypical shape
ReplicateRemote entity → local DB table
Materializesource.query (aggregates, joins) → local table
Move-to-serviceLocal/remote source → remote OData target
Fan-inMultiple sources → one table via source.origin
Source adapters

OData V2/V4, REST (cursor/offset/page), CQN, server-driven paging, custom. See Sources.

Target adapters

Local DB (default), remote OData, custom. See Targets.

Delta, scheduling, hooks
AreaHighlights
Deltatimestamp, key, datetime-fields, or full refresh
Schedulingspawn (cds.spawn), queued (Event Queues API), or external trigger — see below
Event hooksPIPELINE.START → READ → MAP → WRITE → DONE via standard before / on / after
HousekeepingOpt-in PipelineRuns retention (retentionDays, maxRuns)

Scheduling engines

EngineCAP primitiveWhen to use
spawn (default)cds.spawn({ every })Dev, single instance, best-effort interval
queuedcds.queued(srv).schedule(...).every(...) — the June 2026 scheduling APIScaled deployments: single-winner across instances, survives restarts, cron (engine: 'queued'). On CDS 10, named tasks (.as(...)) enable live setSchedule / clearSchedule via unschedule
ExternalPOST /pipeline/executeBTP Job Scheduling Service, Kubernetes CronJob, corporate cron
schedule: 600_000,                              // spawn — implicit engine
schedule: { every: '10m', engine: 'queued' }, // Event Queues: .schedule().every()
schedule: { cron: '0 2 * * *', engine: 'queued' },

Details: Internal scheduling (queued) · External scheduling · Recipes · Event hooks

Management API and observability

OData at /pipeline: pipeline list, run history, statistics, execute, flush, inspectData, configuration overrides. See Management service.

Resilience

Retry with exponential backoff on remote I/O, concurrency guard (no parallel runs), transactional batches.

Quick example

const cds = require('@sap/cds');

cds.on('served', async () => {
    const pipelines = await cds.connect.to('data-pipeline');

    await pipelines.addPipeline({
        name: 'BusinessPartners',
        source: { service: 'API_BUSINESS_PARTNER', entity: 'A_BusinessPartner' },
        target: { entity: 'db.BusinessPartners' },
        delta: { field: 'modifiedAt', mode: 'timestamp' },
        schedule: 600_000,
    });
});

module.exports = cds.server;

Step-by-step: Get started

Used by cds-data-federation

cds-data-federation composes this engine for annotation-driven sync — you install both packages, but rarely call addPipeline yourself:

  • @federation.replicate — federation scans consumption views at boot and registers entity-shape pipelines via pipeline-binding.js (source entity → local table, schedule, delta from annotation options).
  • cache.strategy: 'entity' on @federation.delegate — on TTL miss, a pipeline fills a SQLite snapshot of the projected entity.

Federation-bound pipelines show up in /pipeline and the Pipeline Console alongside programmatic ones. For custom transforms on a federation pipeline, hook the pipeline by name (defaults to the entity name). See the federation README and first replication.

Event hooks (optional)

DataPipelineService is a normal cds.Service. The default path needs no handler code — register before / on / after on PIPELINE.* only when a run needs filtering, enrichment, side effects, or observability beyond the built-in MAP/WRITE. That is the usual CAP pattern: declarative wiring by default, intercept when processing gets non-trivial.

const pipelines = await cds.connect.to('data-pipeline');

// Filter source rows before rename mapping (federation replicate or addPipeline)
pipelines.before('PIPELINE.MAP', 'ReplicatedPartners', (req) => {
    req.data.sourceRecords = req.data.sourceRecords.filter(r => !r.blocked);
});

// Per-batch side effect after the default WRITE commits its statistics
pipelines.after('PIPELINE.WRITE', 'Shipments', async (_results, req) => {
    const { runId, batchIndex, statistics } = req.data;
    await cds.tx(req).run(INSERT.into('BatchMetrics').entries({
        runId, batchIndex, created: statistics?.created ?? 0,
    }));
});

Full event reference: Event hooks · Management service

Pipeline Console

Pre-built UI for /pipeline — enable via config reuse or cds add pipeline-console:

{
  "cds": {
    "requires": {
      "data-pipeline": {
        "impl": "cds-data-pipeline",
        "management": {
          "reuse": {
            "api": true,
            "console": true
          }
        }
      }
    }
  }
}

The console loads pinned SAPUI5 1.150.0 from ui5.sap.com. Set management.ui5Url to an HTTP(S) URL or same-origin absolute path when you host the runtime yourself.

Pipeline landscape — services and data flows grouped by remote service

Pipeline detail — list, schedules, and per-run statistics

Details: Pipeline Console · Feature activation

Documentation

AI assistants

Coming soon. Agent guidance (AGENTS.md) and task skills for coding assistants will ship in a future release.


SAP data extraction. @sap/cds ships under the SAP Developer License Agreement (3.2 CAP). Section 1 limits mass extraction from an SAP product to a non-SAP product unless required for interoperability with an SAP product. When pointing a pipeline at an SAP source, stay within that carve-out.

MIT, read

History

Latest

v0.3.3

  1. v0.3.2

  2. v0.3.1

  3. v0.3.0

  4. v0.2.0

142downloads per week, npm
Weekly downloads for cds-data-pipeline26 complete calendar weeks from 2026-04-27 to 2026-10-25; the latest total is 142.27 Apr – 3 May: 04 May – 10 May: 011 May – 17 May: 018 May – 24 May: 025 May – 31 May: 01 Jun – 7 Jun: 08 Jun – 14 Jun: 015 Jun – 21 Jun: 022 Jun – 28 Jun: 029 Jun – 5 Jul: 06 Jul – 12 Jul: 37013 Jul – 19 Jul: 25820 Jul – 26 Jul: 3027 Jul – 2 Aug: 123 Aug – 9 Aug: 2410 Aug – 16 Aug: 6917 Aug – 23 Aug: 12324 Aug – 30 Aug: 7331 Aug – 6 Sept: 867 Sept – 13 Sept: 5014 Sept – 20 Sept: 47721 Sept – 27 Sept: 65828 Sept – 4 Oct: 1,3145 Oct – 11 Oct: 73312 Oct – 18 Oct: 34319 Oct – 25 Oct: 142
Data federation
  1. SAP Master Data IntegrationCloud service replicating master data across a hybrid landscapefrom BTP/BAIP
  2. cds-federation-synonymsCAP-to-CAP data federation over SAP HANA synonymsfrom CAP
  3. @cap-js-community/commonSix CAP features in one package, from replication cache to rate limitsfrom CAP
  4. cds-data-federationData federation for CAP via delegation, caching and replicationfrom CAP
  5. @sap/cdsCAP Node.js runtimefrom CAP

Details

Sources4
npm registrydiscovered here, keywords:cdschecked
npm registry, cds-data-pipelineversion, releases, installschecked
github.com/git+https://github.com/mikezaschka/cds-data.gittree, pushes, contributors, CIchecked
packages/cds-data-pipeline/README.mdquoted, and what the entry declareschecked

Sources are graph entities: the same page may back several entries, and an unreachable source flags every row that rests on it.

Compatibility and provenance
runtimesnode
declared for>=9
latestv0.4.0
first release
releases and cadence6, ~1d median
discovered vianpm registry · keywords:cds
first seen in the atlas
ecosystem and domaincap, data-and-persistence
History in the atlas1
  1. First seen.
For your agent
Ref
artifact:mikezaschka-cds-data-pipeline
JSON
/artifacts/mikezaschka-cds-data-pipeline.json
MCP
Connecting an agent