On this page
Migration guide · Workflow Automation
Migrating off Pipedream Workflows
Pipedream Workflows shuts down on March 31, 2027, and the data goes on April 30. This guide covers what to export now, what the export leaves behind, how each Pipedream concept maps to a Kestra flow, and how to run the result on Kestra Cloud, with nothing to host, before the deadline.
What's inside
- The seven parts of a Pipedream estate, and a verdict for each one before you convert a single workflow
- A concept-by-concept mapping from Pipedream triggers, steps, actions and data stores to Kestra flows
- The four stages, from export and triage through a measured Cloud trial to cutting Pipedream off before the deadline
- A full worked conversion: webhook, code step, business-system call and notification, as one flow
Start here
Who this is for: the person who owns a Pipedream Workflows account and has until March 31, 2027 to move it. You may run a handful of automations or a few hundred; the shape of the work is the same, and the deadline is fixed.
The approach in this guide starts with three ideas:
01
Export first, decide second
The export is the only copy of your workflow logic that survives April 30. If you never connected Pipedream’s GitHub Sync, it is also the first copy of your workflows outside Pipedream. Run it today, for every project, before you evaluate anything.
02
What you move to matters more than how fast you move
Pipedream was chosen for flexibility at a price a small team could justify. Replacing it with a tool that holds your tokens in its own workspace and prices by credits puts you back where you started. The next platform has to run your code, reach your systems, and still be yours if the vendor changes course.
03
This is a method, not a brochure
It comes from teams doing this migration now, with real export files, finance workflows with month-end deadlines and NetSuite calls that take several minutes. It gives you the mapping, the triage rules and the conversion pattern, and it says where Kestra fits and where it does not.
It also sets out why Kestra Cloud is the right destination for code-first Pipedream estates, and walks through the four stages from export to canceling the subscription. Start the 14-day Cloud trial whenever you are ready; the guide works without it.
1. Why Pipedream users are moving, and what to move to
1.1 The shutdown
Pipedream Workflows and String stop on March 31, 2027; all Workflows data, including credentials and OAuth tokens, is deleted by April 30, 2027. Workflows is in maintenance mode, closed to new signups and subscriptions, with no new features. Subscriptions are canceled on the shutdown date with a prorated refund. Pipedream Connect, the integration layer for AI agents, continues; that is where the company is going (Pipedream’s notice).
| Date | What happens |
|---|---|
| Now | Workflows in maintenance mode; signups and subscriptions closed; export tool available |
| March 31, 2027 | Workflows and String stop running; subscriptions canceled with prorated refund |
| April 30, 2027 | All Workflows data deleted, including connected-account credentials and OAuth tokens |
The practical consequence is a project with a fixed end date and a hard floor: every workflow that matters has to be running somewhere else by the end of March, and anything you have not exported by the end of April is gone.
The lesson
Your integration vendor should not own your workflows.
Pipedream held the logic, the tokens and the history inside its workspace. The next platform should keep working, and stay readable, when the vendor changes course.
1.2 Choosing what to move to
Ask three questions of every option on your shortlist, including Kestra.
-
Does it run your code, or only its own connectors? Most Pipedream estates lean on Node.js and Python steps. A no-code tool makes you rewrite that logic into blocks; a code-only tool makes you rebuild the connectors. You want both in one place.
-
Who holds the credentials? In Pipedream, OAuth grants lived inside Pipedream’s workspace, which is why they cannot be exported. If the next platform does the same, the next migration costs the same.
-
How hard would it be to leave? Where do definitions live, can you read them without the product, and can you run the engine yourself if the commercial relationship ends? On Pipedream, definitions and grants lived in its workspace and the engine was never yours to run, which is why this migration is as much work as it is.
For workflows that are mostly connectors with little code, a connector-first tool such as Zapier, Make or n8n fits, as long as you accept the answers it gives to questions 2 and 3. For workflows that are mostly code and API calls with a few connectors, Kestra does. One estate can land in more than one place: the team in 2.2 moved a few workflows to AWS Lambda. The comparison of Pipedream alternatives puts Zapier, Make, n8n, Temporal, Windmill and Kestra side by side.
1.3 Why Kestra Cloud
It runs your code. Node.js, Python and Bash steps copy into script tasks; what changes is how they read their input and return their results. Go steps run in a Go Script task. The 2,300+ plugins cover the data, infrastructure and notification systems most code steps call, and an HTTP task covers the rest.
You own the credentials. Secrets live in a managed secret manager scoped by namespace, referenced from flows and never in Git. You re-enter them once, with your own OAuth clients and API tokens, and they are portable from then on.
It is managed, and it is open. Kestra Cloud is run by the team that builds Kestra: hosting, scaling, upgrades, backups, SSO, RBAC, audit logs, Apps and remote runners, with a 14-day trial and no credit card. The core underneath is Apache 2.0 and the flows are YAML in your repository. If a vendor retires a product again, you keep running the same flows self-hosted the next day.
The economics are legible. No credits per 30-second slice and no memory tuning per workflow. Plugin tasks such as an HTTP call, a Slack message or a database query count as one task run and use no compute time; only script tasks that run on the Kestra Cloud task runner add compute. Send scripts to your own AWS, GCP or Azure runners and that compute is billed by your cloud provider, not by Kestra Cloud. Task runs and compute are reported in your instance.
| What you had in Pipedream | What you get in Kestra Cloud |
|---|---|
| Nothing to host | Hosting, scaling, upgrades and backups handled; 14-day trial, no credit card |
| Code steps in Node, Python, Go, Bash | Script tasks in any language, plus 2,300+ plugins |
| Credits per 30-second slice, memory tuned per workflow | Task runs, plus compute for scripts on the Kestra Cloud runner; no 30-second slices or memory tiers |
| Compute locked to Pipedream | Remote task runners on your own AWS, GCP or Azure; their compute is billed by your cloud provider |
| Workspace-level access for everyone | Unlimited users with custom roles; namespaces isolate finance flows from the rest |
| GitHub Sync per project, if you set it up | Git sync for every flow; dev and prod namespaces, promoted after review |
| Short event history on lower tiers | Executions, logs, metrics and audit logs retained per plan; SOC 2 Type 2, GDPR |
| Developers only in the UI | Apps: branded forms so business owners trigger and monitor flows |
| Platform-enforced execution time limits | Several-minute calls are fine; you set timeout per task |
| Product in maintenance mode | Active roadmap, AI Copilot included, direct line to the team |
For the full feature-by-feature view, see Kestra vs Pipedream.
1.4 What your security and finance reviewers will ask
The questions that stall a Pipedream migration come from the finance owner and the security reviewer, not from the workflow list: who can see the finance flows, how long the audit trail is kept, whether SSO is SAML or OIDC, where the data runs, and what the contract says. Kestra Cloud answers them with namespace-scoped RBAC, audit logs, SSO, SOC 2 Type 2 and GDPR attestations on the Trust Center, a data processing agreement, and remote runners that keep execution inside your own cloud account.
2. The migration in four stages
The four stages below are the sequence teams leaving Pipedream are following now. The first takes days; the second fits inside the 14-day trial.
The four stages
Select a stage to see what you do and what you end up with
Stage 1 - Assess
- What you do: Export every project, decide what happens to each part of the estate, triage the workflow list.
- What you end up with: A Git repository of exports, a verdict table, a ranked conversion backlog.
Stage 2 - Trial
- What you do: Convert two or three real workflows on a Kestra Cloud trial, including one hard one.
- What you end up with: Working flows, measured hours per workflow, a sizing for your plan.
Stage 3 - Migrate
- What you do: Convert by pattern in waves, reconnect credentials, shadow-run against Pipedream.
- What you end up with: Production flows, wave by wave, with Pipedream still serving.
Stage 4 - Exit
- What you do: Repoint triggers, retire each Pipedream workflow, cancel the subscription, revoke the OAuth grants.
- What you end up with: An empty Pipedream account before March 31.
2.1 Pipedream keeps running until each wave is cut over
Nothing in Pipedream changes until the Kestra flow has handled real events. Every wave stays reversible until you disable its Pipedream trigger, and the subscription keeps running until the last one. The overlap costs your team’s time and the Pipedream subscription you would have canceled anyway at the end of March.
2.2 One migration in progress
MIGRATING, CUTOVER BEFORE MARCH 2027
A global nonprofit runs 16 Pipedream projects and 62 workflows: finance file processing from Box into NetSuite, staff and account-code syncs across Workday, Google Workspace and Monday, reimbursement intake. The team had a Cloud trial running within two weeks of the announcement, and set a target of weeks for a migration that had taken months the last time they changed platforms.
A few workflows went to AWS Lambda because they belonged with an existing application; the rest are converting by pattern. Their questions about memory, timeouts, concurrency and pricing shaped sections 3 to 6 and the FAQ.
3. Stage 1, Assess: what moves, and what you export
3.1 What moves, what stays
A Pipedream workflow bundles three things most platforms separate: an endpoint that receives events, a runtime for your code, and a catalog of pre-built actions with managed auth. The systems around it (NetSuite, Box, Google Workspace, Slack, your database, AWS) stay where they are. What moves is the orchestration layer and the glue code written for it.
Split your estate into seven parts and give each one a verdict: replace (Kestra takes it over), re-create (the export does not carry it, so you enter it again), keep (the system stays and gets called), retire (nothing replaces it).
| Part of the estate | In Pipedream | Verdict | Where it ends up in Kestra |
|---|---|---|---|
| Triggers | HTTP, timer, email, form, app event sources | Replace | Webhook trigger, Schedule trigger, polling triggers, flow triggers |
| Workflow logic | Linear steps, if/else, switch, loops, delay, end | Replace | Flow (YAML) with If, Switch, Loop, Pause, Fail tasks |
| Code steps | Node.js, Python, Go, Bash with step exports | Replace | Script tasks with declared outputs, Go included |
| Pre-built actions | Pre-built actions for 3,000+ apps, with connected accounts | Replace or keep | Plugins for the systems you orchestrate; HTTP Request task for the rest |
| Connected accounts and secrets | OAuth tokens, secret props, env vars | Re-create | Secret manager scoped by namespace |
| State and files | Data Stores, File Stores, event history | Replace or retire | KV Store for state, namespace files and internal storage for files; history starts fresh |
| Credits and compute | Credits per 30-second slice, memory tuned per workflow | Retire | Task runs plus compute, or your own task runners |
The difference between the Pipedream model and Kestra is who owns the integration: Pipedream held your tokens inside its workspace, Kestra reads them from a secret manager you control.
3.2 Pipedream to Kestra: concept mapping
Every Pipedream construct has a Kestra equivalent, and most of them keep the same shape. The differences that cost time are three: outputs are declared instead of returned, control flow is a task rather than a step type, and credentials live outside the flow.
| Pipedream | Kestra | What changes |
|---|---|---|
| Workflow | Flow (YAML file in a namespace) | Versioned in Git, deployable with the CLI or Git sync |
| Project / folder | Namespace (hierarchical) | RBAC and secrets scoped per namespace |
| HTTP / Webhook trigger | io.kestra.plugin.core.trigger.Webhook | URL built from a key you set; {{ trigger.body }} holds the payload |
| Timer trigger | io.kestra.plugin.core.trigger.Schedule | Same cron syntax; backfill and timezone built in |
| App event source | Plugin trigger or polling trigger | Polling interval you set; webhook from the source where supported |
| Code step (Node.js, Python, Bash) | io.kestra.plugin.scripts.* Script task | Logic copied as is; input from the trigger or earlier outputs; results declared as outputs (Kestra.outputs() in Node.js and Python) |
| Code step (Go) | io.kestra.plugin.scripts.go.Script | Runs on the Kestra Cloud task runner or on your own runner |
steps.name.$return_value | {{ outputs.name.vars.key }} | Outputs are explicit; nothing is passed implicitly |
| Pre-built action | Plugin task (Slack, HTTP, S3, databases, dbt, Airbyte…) | Props become YAML properties |
| Action with no Kestra plugin | io.kestra.plugin.core.http.Request | Same REST call, auth from a secret |
| if/else, switch | io.kestra.plugin.core.flow.If, Switch | Condition is a Pebble expression |
| Loop over items | io.kestra.plugin.core.flow.Loop | Items from an output; {{ item.value }} |
| Delay step | io.kestra.plugin.core.flow.Sleep or Pause | Pause also handles human approval |
$.flow.exit() | io.kestra.plugin.core.execution.Fail or Exit | Explicit end state |
| Data Store | KV Store | Namespaced key-value, read with {{ kv('key') }} |
| File Store | Namespace files and internal storage | Files passed between tasks as URIs, not copied in memory |
| Environment variables | Flow variables: or KV Store | Secrets never go here |
| Secret prop / connected account | Secret manager, {{ secret('NAME') }} | Re-entered per namespace; never in Git |
| Event history | Executions, logs, metrics, Gantt | Retention set by plan |
| Workflow settings (memory, timeout) | Task runner size, timeout per task | Memory is per task, not per workflow |
| Credits per 30-second slice | Task runs plus compute | Counted per task run, not per 30-second slice |
Why memory behaves differently
In Pipedream, every step exports its result into shared memory and the stack grows with each step, which is why text-processing workflows end up with memory set to several gigabytes, close to Pipedream’s 10 GB ceiling. In Kestra, large outputs are written to internal storage and passed as URIs, and each task declares what it emits. A 40-step workflow does not carry 40 copies of the same data.
3.3 Export your workflows today
Export before you decide anything else. The export is the only record of your workflow logic that survives April 30. If you never connected Pipedream’s GitHub Sync, it is also the first copy of your workflows outside Pipedream.
- Open the project in the Pipedream dashboard and select Settings in the left navigation.
- Click Export Workflows at the bottom of the settings panel. Pipedream builds the archive in the background.
- Download
project_export-<project_id>.zipfrom the project’s File Store (your plan must include File Stores). - Repeat for every project. One export holds at most 500 workflows or 256 MB; if
truncatedistrueinmanifest.json, move workflows to another project and export again. - Commit the archives to a Git repository. This is your source of truth for the migration.
What the archive contains. One JSON file per deployed workflow (schema workflow.json/2026.01) with its triggers, steps in order, code for code steps, component key and version for actions, configured props and control-flow branches. manifest.json lists every workflow with a status (exported, skipped_never_deployed, skipped_export_limit) and a warnings list naming each prop you will have to re-enter.
What it does not contain, and what you must collect separately:
| Missing from the export | Where to get it | Where it goes in Kestra |
|---|---|---|
Secret prop values, basic auth and bearer tokens (<redacted>) | Your password manager or the API provider | Secret manager |
Connected accounts (only an authProvisionId remains) | Re-authorize each app (OAuth client, API key) | Secret manager, plugin credentials |
| Environment variables | Pipedream workspace settings, copy by hand | Flow variables or KV Store |
| Data Store contents | Pipedream’s chunked-export example action, with shouldDeleteKeys set to false while workflows still run | KV Store |
| File Store files | Download from the File Store | Namespace files or your object storage |
| Event history and logs | Not exportable; keep screenshots of monthly volumes for sizing | Executions start fresh |
Webhook senders (every system that posts to a *.m.pipedream.net URL, or to a custom domain of yours that points to Pipedream) | Each sender’s webhook settings; list them now | Repointed to the flow’s Kestra webhook URL at cutover (section 6) |
| Code of private multi-file components | Your own source repository | Namespace files or a custom plugin |
Source: Pipedream export documentation.
While you are in the dashboard, note what the export will not give you: monthly volume and peak concurrency. The Usage chart in Pipedream’s billing settings shows daily credits; click a day to see them broken out by workflow, and note the busiest workflows over a full billing period. For each of those, filter the event history by workflow and count its executions over a range your plan still keeps (a busy week is enough for a high-volume workflow), scale that count to a month, then open one execution to see the steps it runs. Note when traffic peaks and the concurrency setting in the workflow’s settings. Executions per month times steps per execution is your monthly step count. These numbers size your Kestra Cloud plan and your concurrency limits.
3.4 Triage before you convert
The raw count from manifest.json is always higher than the real work. Three passes get you to a defensible number.
| Pass | Rule | Outcome |
|---|---|---|
| Retire what nobody runs | Not executed in the last 90 days (if your plan keeps less event history, confirm with the workflow’s owner), or skipped_never_deployed in the manifest | Out of scope |
| Group near-duplicates | Copies per environment, region or business unit become one flow with inputs | One flow, several inputs |
| Separate wrappers | Workflows that only receive a webhook and forward it, or call one API with no logic | A webhook trigger plus one HTTP Request task, no conversion effort |
Then rank what is left by two criteria, and convert in that order:
- Business criticality: finance processing, HR sync and anything with a month-end deadline go first, because they need a full cycle of testing before March.
- Conversion cost: count the code steps and the actions without a Kestra plugin. A workflow with 40 steps and a NetSuite call takes far longer than a timer plus one Python step.
For each remaining workflow, record four things in your tracker: trigger type, number of code steps, external systems called, and whether it writes to a Data Store. Those four columns decide the pattern you convert it with.
Decide your fallback now. Workflows at the bottom of the list may not make the deadline. Agree with the business owner whether each one gets a manual procedure for a month or is simply switched off, so nobody discovers a gap on April 1.
4. Stage 2, Trial: prove the pattern on Kestra Cloud in 14 days
Request trial access with your export in hand.
Before it starts, agree on three things with the people who own the workflows: which two or three workflows you convert, what “it works” means for each one (same output as Pipedream on the same input), and who reviews the result.
Choose the workflows from the triaged backlog in 3.4:
- One difficult workflow you would run in production: many steps, a long external call, a Data Store. A happy-path webhook proves nothing.
- One the business owner recognizes: a finance file, a staff sync.
- One scheduled workflow, so the trial covers timers as well as webhooks.
What the trial proves
| Question | How you answer it in 14 days |
|---|---|
| Does our code carry over? | Copy the Node.js or Python step into a script task; count the lines you changed |
| Do the integrations hold? | Call the real NetSuite, Box or Google endpoint from a flow with a secret from the secret manager |
| What does a workflow cost to convert? | Record hands-on hours per workflow; that rate times your backlog is the migration estimate |
| Does memory behave? | Run the heaviest workflow and read the task metrics; compare with the GB you allocated in Pipedream |
| What will the plan cost? | Count task runs per execution on the execution page, multiply by your monthly volume, and send the number to the team |
SSO and audit logs are on from day one of the trial, along with custom roles, the managed secret manager, Apps, the AI Copilot and the Playground. With role-based access, the finance owner can follow the trial from a read-only role, and the trial becomes part of the security review. Trials run 14 days by default; teams that share feedback get longer.
5. Stage 3, Migrate: convert by pattern, with Pipedream still running
5.1 Convert a workflow
The most common Pipedream pattern is an HTTP trigger, a code step that reshapes the payload, a call to a business system, and a notification. In Pipedream that is four steps and a connected account. In Kestra it is one flow, and the code step is copied almost unchanged.
Before (Pipedream, from the export): an http trigger, a Python step transform that returns invoice_id, amount and vendor, a NetSuite action configured with a connected account, and a Slack send_message action.
After (Kestra flow):
id: invoice_intakenamespace: finance.intakedescription: Replaces the Pipedream "Invoice intake" workflow (p_abc123).
triggers: - id: webhook type: io.kestra.plugin.core.trigger.Webhook key: "{{ secret('INVOICE_WEBHOOK_KEY') }}" allowConcurrent: true
tasks: - id: transform type: io.kestra.plugin.scripts.python.Script dependencies: - kestra script: | from kestra import Kestra import json body = json.loads(r'''{{ trigger.body | toJson }}''') # code copied from the Pipedream step; only the input read and the export change Kestra.outputs({ "invoice_id": body["id"], "amount": round(float(body["total"]), 2), "vendor": body["vendor"]["name"], })
- id: post_to_netsuite type: io.kestra.plugin.core.http.Request uri: "https://{{ secret('NETSUITE_ACCOUNT') }}.suitetalk.api.netsuite.com/services/rest/record/v1/vendorBill" method: POST contentType: application/json headers: Authorization: "Bearer {{ secret('NETSUITE_TOKEN') }}" # abridged: a real request also sends the vendor ("entity", by internal ID) and the bill's lines body: | { "tranId": "{{ outputs.transform.vars.invoice_id }}", "total": {{ outputs.transform.vars.amount }} } timeout: PT15M options: timeout: readIdleTimeout: PT10M
- id: notify type: io.kestra.plugin.slack.notifications.SlackIncomingWebhook url: "{{ secret('SLACK_WEBHOOK') }}" messageText: "Invoice {{ outputs.transform.vars.invoice_id }} from {{ outputs.transform.vars.vendor }} posted to NetSuite"
errors: - id: alert type: io.kestra.plugin.slack.notifications.SlackIncomingWebhook url: "{{ secret('SLACK_WEBHOOK') }}" messageText: "Invoice intake failed: {{ execution.id }}"Five things to notice:
- Input and return. The Python code is the body of the Pipedream step’s
handler. It reads the payload from{{ trigger.body }}instead ofpd.steps["trigger"]["event"]["body"], andreturnbecomesKestra.outputs(). Thekestrapackage that providesKestra.outputs()is not in the default Python image, so the task lists it underdependencies. - Slow API. The NetSuite call may sit idle for ten minutes while it waits for a response (the default is five minutes), because NetSuite sometimes takes several minutes to answer. The task
timeoutcaps the whole call. - Concurrency. The trigger sets
allowConcurrent: true, so an invoice that arrives during a slow call starts its own execution. - Errors. The
errorsblock replaces the per-step error handling you built by hand. - Token. The static
NETSUITE_TOKENsecret keeps the example short. In production, fetch a fresh token in the flow (see 5.2).
Convert with the AI Copilot. Kestra Cloud includes an AI Copilot that generates and edits flow YAML from a prompt. Paste a workflow’s JSON from the export, ask for the equivalent flow, and review the result; nothing is deployed without a human. For bulk work, connect your own AI coding assistant to the Kestra MCP server, which gives it live plugin schemas, blueprints and docs, open the export folder in it, and commit the drafts to Git for review. Treat the output as a first draft: conditions, loops and code-step outputs are where the two dialects differ most, and those are what the review checks.
Convert by pattern, not by workflow. Most of a Pipedream estate is five patterns: webhook → code → API, timer → fetch → load, file arrives → process → notify, poll an app → sync records, and approval chains. Build one clean flow per pattern, save it as a custom blueprint, and convert the rest by changing inputs and secrets.
5.2 Reconnect credentials, secrets and state
This is the step teams underestimate, because in Pipedream it was a button. Every connected account was an OAuth grant held in Pipedream’s workspace, and none of it travels. The warnings list in manifest.json is your checklist.
- List the apps. From the export, collect every distinct app prop and
authProvisionId. Group them by system: one NetSuite, one Box, one Google Workspace account usually serve many workflows. - Create credentials where you own them. For OAuth apps, register your own OAuth client (Google, Box, Slack, NetSuite) or generate an API token (Mailgun, Monday). NetSuite OAuth 2.0 access tokens are valid for 60 minutes, so do not store the token itself. NetSuite’s client credentials (machine-to-machine) flow uses a certificate, not a client secret. Store the client ID, the certificate ID and the certificate’s private key as secrets, and have a short script task at the start of the flow sign the JWT assertion and request a fresh token. Sign it with PS256 or ES256; NetSuite does not accept RS256. Keep the token out of
Kestra.outputs(), because task outputs are stored in clear text and shown on the execution page. Make the NetSuite call from the same script, or emit the token as an encrypted output (::{"encryptedOutputs":{"token":"..."}}::), which Kestra Cloud stores and displays encoded. You now own the grant, which is what makes the next migration cheap. - Store them in the Kestra secret manager, scoped to the namespace that needs them. Finance secrets live under
finance.*, visible only to the roles you assign; setallowedNamespacesonfinanceso flows elsewhere cannot read them. Reference them in flows with{{ secret('NAME') }}; nothing lands in Git. - Move state. Export each Data Store with Pipedream’s chunked-export example, with
shouldDeleteKeysset tofalseso live workflows keep their data, and load it into the KV Store with a one-off flow. Replace the Data Store calls in code (this.<store>.get()and.set()in Node.js,pd.inputs["data_store"]in Python) with{{ kv('key') }}reads andio.kestra.plugin.core.kv.Setwrites. - Move files. Download File Store contents you still need and put them in your own object storage or as namespace files. Flows reference them by URI; large files never sit in memory between tasks.
- Replace environment variables with flow
variables:for non-sensitive values and secrets for the rest.
For the systems where Pipedream offered a pre-built component and Kestra does not yet have a plugin (NetSuite is the usual example), you have two options: an HTTP Request task with the REST call, authenticated from secrets as in step 2, or a custom plugin versioned and installed in your Cloud instance. The first is quick to set up and covers most cases; the second is worth it when ten flows share the same calls.
Wrap before replacing
A useful intermediate step is to point a copy of the source system’s webhook at a Kestra flow that only logs the payload. Once the trigger path works, add the tasks. Each change can then be tested separately.
6. Stage 4, Exit: test, promote, cut over, cancel
Run both platforms side by side for each wave, and switch the trigger last. Nothing in Pipedream changes until the Kestra flow has processed real events.
- Build in dev. Use a dev namespace, or a separate dev instance if you have one. Convert, run the flow with the Playground on sample payloads, and check inputs, outputs and logs on the execution page.
- Write a test per critical flow. Flow tests mock task outputs and assert the result, so a month-end finance flow can be validated weeks before the real file lands.
- Shadow run. Point a copy of the webhook at Kestra (or let the Schedule trigger run in parallel) while Pipedream keeps serving. Compare outputs for a few cycles.
- Promote to production after review, through a Git pull request or Promote between instances, then repoint the source system’s webhook or disable the Pipedream trigger. The Pipedream workflow stays available as a rollback until you delete it.
- Repeat per wave, critical flows first. Keep each wave reversible until its Pipedream side is switched off.
Plan backwards from March 31, 2027. An illustrative schedule for a 60-workflow estate: export and triage in week 1, patterns and credentials in weeks 2 to 3, conversion waves in weeks 4 to 12, buffer and month-end validation in the last month. Cancel the Pipedream subscription once the last wave is in production; annual subscribers get a prorated refund on request. Then revoke the OAuth grants Pipedream held in each connected app, so no grant outlives the migration.
After cutover, switch on what makes the next change cheap: Git sync so every flow is backed up and reviewed, SLA and failure notifications to Slack or PagerDuty, and dashboards over your executions.
7. Getting started
7.1 Start the Cloud trial with your export in hand
Request access to Kestra Cloud, pick the two or three workflows from Section 4, and build them. Send the team your integration list and your monthly step count, and we will tell you which plugins cover it and what the plan looks like before you commit.
7.2 Start on open source, move to Cloud
If you want to test the conversion pattern before talking to anyone, the open-source edition runs the same flows. Pull the Docker Compose file, rebuild two workflows from your export (one webhook-driven, one scheduled) and measure the hours each took. That rate, multiplied across your triaged backlog, is your migration estimate.
curl -o docker-compose.yml https://raw.githubusercontent.com/kestra-io/kestra/develop/docker-compose.ymldocker compose up -dThe open-source edition stops where a Pipedream migration crosses into operations: SSO, role-based access per namespace, the managed secret manager, audit logs, Apps for business users, dev-to-prod promotion and someone else running the upgrades. Those are what you were paying Pipedream for, and they are what Kestra Cloud provides. The flows you wrote on open source move to Cloud unchanged, as long as they do not pin the Process or Docker task runner. You can also run the trial on Cloud from the start and skip the self-hosted step. The open-source vs. Cloud and Enterprise comparison lists the full split.
Questions Pipedream teams ask
Find answers to your questions right here, and don't hesitate to Contact Us if you couldn't find what you're looking for.

Export today, convert this week
Export every project today and start your Cloud trial: your first run takes minutes. Bring your integration list and your monthly step count, and we will tell you which plugins cover it before you commit.
