[{"data":1,"prerenderedAt":2704},["ShallowReactive",2],{"content-query-tC4V04ycPc":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"layout":10,"head":11,"author":13,"tags":14,"categories":20,"date":22,"faq":23,"image":45,"body":46,"_type":2697,"_id":2698,"_source":2699,"_file":2700,"_stem":2701,"_extension":2702,"sitemap":2703,"readingTime":2177},"/blog/pipedream-workflows-shutdown-migration","blog",false,"","Pipedream Workflows Is Shutting Down: How to Migrate to Webhook Relay","Pipedream Workflows and String shut down on March 31, 2027. Export your workflows, and use Webhook Relay functions with KV and file stores to rebuild them — or let Claude or Codex do the port.","post",{"title":12},"Migrate from Pipedream Workflows to Webhook Relay","Karolis Rusenas",[15,16,17,18,19],"pipedream","migration","webhook infrastructure","webhook functions","kv store",[21],"guides","2026-10-13 09:00:00",[24,27,30,33,36,39,42],{"q":25,"a":26},"When is Pipedream Workflows shutting down?","Pipedream announced that Workflows and String shut down on March 31, 2027. Existing workflows keep running until then, but signups and new subscriptions are closed and Workflows is in maintenance mode. All Workflows data, including connected-account credentials and OAuth tokens, is permanently deleted by April 30, 2027. Pipedream Connect, the MCP servers and the API proxy are not affected.",{"q":28,"a":29},"How do I export my Pipedream workflows?","Pipedream provides an export tool. Open a project's Settings, click Export Workflows, and when the archive finishes it appears in that project's File Store as project_export-\u003Cproject_id>.zip. The ZIP has one JSON file per workflow plus a manifest.json. Export runs one project at a time, and your plan must include File Stores. The export contains workflow structure, code and configured props, but not data store contents, files, or credentials.",{"q":31,"a":32},"Can Webhook Relay replace Pipedream Workflows?","For webhook-driven workflows, yes. Webhook Relay receives webhooks and forwards them reliably, transforms them with JavaScript or Lua functions, and — since 2026 — gives those functions a GCS-backed key-value store (kv:) and file store (files:) that map directly to Pipedream Data Stores and File Stores. It is purpose-built webhook infrastructure rather than a general SaaS automation builder, so it fits event handling better and fits thousand-app orchestration less well.",{"q":34,"a":35},"Does Webhook Relay have a key-value store like Pipedream Data Stores?","Yes. Webhook Relay functions bind a KV store with require(\"kv:alias\") and call set, get, has, delete, setTtl and keys with optional TTL, up to 256 KiB per value. It is backed by the same bucket that stores function code, so no extra infrastructure is needed. Pipedream's this.dataStore.set(...) maps to kv.set(...).",{"q":37,"a":38},"Does Webhook Relay have file storage like Pipedream File Stores?","Yes. Functions bind a file store with require(\"files:alias\") and call put, get, getBuffer, exists, stat, list, delete and url for pre-signed upload/download links. Reads are capped at 8 MiB and a single inline write at 32 MiB; larger objects use a pre-signed URL. This covers the common Pipedream File Store use of passing files between runs.",{"q":40,"a":41},"Can I use Claude or Codex to migrate my workflows automatically?","Yes, and it is the fastest path for anything non-trivial. Export the workflows to JSON, then give the export plus the Webhook Relay function docs and the open-source Webhook Relay Agent Skills to Claude Code, Codex or another coding agent. The agent reads each workflow, maps triggers to inputs or scheduled webhooks, maps code steps to functions, ports dataStore and files calls to the kv and files bindings, and produces a runnable Webhook Relay function you can test before attaching.",{"q":43,"a":44},"What Pipedream features does Webhook Relay not replace?","Webhook Relay is webhook infrastructure, not a general-purpose automation platform. It does not ship Pipedream's thousands of pre-built app integrations, Python or Bash code steps, built-in browser automation, or the Connect product. If a workflow is mostly orchestrating SaaS apps with no webhook in the middle, Webhook Relay is the wrong tool; if it is event handling and transformation, it is a strong fit.","/images/blog/pipedream-shutdown-migration.svg",{"type":47,"children":48,"toc":2681},"root",[49,59,80,87,217,223,238,291,310,316,336,382,387,396,436,441,504,516,522,534,539,708,726,733,738,1082,1100,1111,1282,1330,1336,1341,1657,1708,1714,1719,1879,1913,1928,1934,1939,1951,1956,2326,2347,2353,2358,2414,2424,2430,2448,2454,2572,2578,2613,2663,2675],{"type":50,"tag":51,"props":52,"children":53},"element","p",{},[54],{"type":50,"tag":55,"props":56,"children":58},"img",{"alt":57,"src":45},"Pipedream Workflows shuts down on March 31, 2027; webhook-driven workflows export as JSON and migrate to Webhook Relay functions",[],{"type":50,"tag":51,"props":60,"children":61},{},[62,65,71,73,78],{"type":63,"value":64},"text","Pipedream announced that ",{"type":50,"tag":66,"props":67,"children":68},"strong",{},[69],{"type":63,"value":70},"Workflows and String shut down on March 31, 2027",{"type":63,"value":72},", with all Workflows data deleted by ",{"type":50,"tag":66,"props":74,"children":75},{},[76],{"type":63,"value":77},"April 30, 2027",{"type":63,"value":79},". If webhooks are a load-bearing part of your business and a Pipedream workflow is quietly keeping them running, you now have a deadline. This guide covers the facts, why Webhook Relay is a strong target for webhook-driven workflows, and — for the fast path — how to point Claude, Codex or another coding agent at your export and let it do the port.",{"type":50,"tag":81,"props":82,"children":84},"h2",{"id":83},"tldr",[85],{"type":63,"value":86},"TL;DR",{"type":50,"tag":88,"props":89,"children":90},"ul",{},[91,122,149,188,198],{"type":50,"tag":92,"props":93,"children":94},"li",{},[95,100,102,107,109,113,115,120],{"type":50,"tag":66,"props":96,"children":97},{},[98],{"type":63,"value":99},"The deadline.",{"type":63,"value":101}," Workflows and String shut down ",{"type":50,"tag":66,"props":103,"children":104},{},[105],{"type":63,"value":106},"March 31, 2027",{"type":63,"value":108},"; data is deleted by ",{"type":50,"tag":66,"props":110,"children":111},{},[112],{"type":63,"value":77},{"type":63,"value":114},". Workflows is in maintenance mode — no new signups, no new features. Pipedream Connect is ",{"type":50,"tag":66,"props":116,"children":117},{},[118],{"type":63,"value":119},"not",{"type":63,"value":121}," affected.",{"type":50,"tag":92,"props":123,"children":124},{},[125,130,132,139,141,147],{"type":50,"tag":66,"props":126,"children":127},{},[128],{"type":63,"value":129},"Export first.",{"type":63,"value":131}," Pipedream's export tool writes a ",{"type":50,"tag":133,"props":134,"children":136},"code",{"className":135},[],[137],{"type":63,"value":138},"project_export-\u003Cproject_id>.zip",{"type":63,"value":140}," (one JSON file per workflow + ",{"type":50,"tag":133,"props":142,"children":144},{"className":143},[],[145],{"type":63,"value":146},"manifest.json",{"type":63,"value":148},") to each project's File Store. Do it per project, before April 2027.",{"type":50,"tag":92,"props":150,"children":151},{},[152,157,159,164,166,172,174,179,180,186],{"type":50,"tag":66,"props":153,"children":154},{},[155],{"type":63,"value":156},"Webhook Relay fits webhook workflows.",{"type":63,"value":158}," It receives webhooks, forwards them reliably, transforms them with JavaScript or Lua functions, and — new in 2026 — gives those functions a ",{"type":50,"tag":66,"props":160,"children":161},{},[162],{"type":63,"value":163},"KV store",{"type":63,"value":165}," (",{"type":50,"tag":133,"props":167,"children":169},{"className":168},[],[170],{"type":63,"value":171},"require(\"kv:alias\")",{"type":63,"value":173},") and ",{"type":50,"tag":66,"props":175,"children":176},{},[177],{"type":63,"value":178},"file store",{"type":63,"value":165},{"type":50,"tag":133,"props":181,"children":183},{"className":182},[],[184],{"type":63,"value":185},"require(\"files:alias\")",{"type":63,"value":187},") that map directly onto Pipedream Data Stores and File Stores.",{"type":50,"tag":92,"props":189,"children":190},{},[191,196],{"type":50,"tag":66,"props":192,"children":193},{},[194],{"type":63,"value":195},"Or let an agent port it.",{"type":63,"value":197}," Give Claude Code or Codex the export JSON plus the Webhook Relay function docs and Agent Skills, and it rebuilds each workflow as a tested Webhook Relay function.",{"type":50,"tag":92,"props":199,"children":200},{},[201,206,208,215],{"type":50,"tag":66,"props":202,"children":203},{},[204],{"type":63,"value":205},"Mostly SaaS orchestration?",{"type":63,"value":207}," If a workflow shuffles data between apps with no webhook in the middle, Webhook Relay is not the natural home — but if you're struggling to reimplement it, ",{"type":50,"tag":209,"props":210,"children":212},"a",{"href":211},"/contact",[213],{"type":63,"value":214},"reach out and we'll help you sort it out",{"type":63,"value":216},".",{"type":50,"tag":81,"props":218,"children":220},{"id":219},"what-pipedream-announced",[221],{"type":63,"value":222},"What Pipedream announced",{"type":50,"tag":51,"props":224,"children":225},{},[226,228,236],{"type":63,"value":227},"Pipedream is focusing on being the integration layer between AI and the outside world, and Workflows falls outside that focus. From ",{"type":50,"tag":209,"props":229,"children":233},{"href":230,"rel":231},"https://pipedream.com/docs/workflows",[232],"nofollow",[234],{"type":63,"value":235},"Pipedream's shutdown notice",{"type":63,"value":237},":",{"type":50,"tag":88,"props":239,"children":240},{},[241,251,261,271,281],{"type":50,"tag":92,"props":242,"children":243},{},[244,249],{"type":50,"tag":66,"props":245,"children":246},{},[247],{"type":63,"value":248},"Workflows and String shut down on March 31, 2027.",{"type":63,"value":250}," Existing workflows keep running normally until then.",{"type":50,"tag":92,"props":252,"children":253},{},[254,259],{"type":50,"tag":66,"props":255,"children":256},{},[257],{"type":63,"value":258},"Workflows is in maintenance mode.",{"type":63,"value":260}," No new signups or subscriptions, and no new features.",{"type":50,"tag":92,"props":262,"children":263},{},[264,269],{"type":50,"tag":66,"props":265,"children":266},{},[267],{"type":63,"value":268},"All Workflows data is permanently deleted by April 30, 2027",{"type":63,"value":270},", including credentials and OAuth tokens for connected accounts.",{"type":50,"tag":92,"props":272,"children":273},{},[274,279],{"type":50,"tag":66,"props":275,"children":276},{},[277],{"type":63,"value":278},"Subscriptions stay active until March 31, 2027",{"type":63,"value":280},", then are cancelled automatically with a prorated refund.",{"type":50,"tag":92,"props":282,"children":283},{},[284,289],{"type":50,"tag":66,"props":285,"children":286},{},[287],{"type":63,"value":288},"Pipedream Connect is not affected.",{"type":63,"value":290}," If you use the Connect API, MCP servers or the API proxy, nothing changes.",{"type":50,"tag":51,"props":292,"children":293},{},[294,296,301,303,308],{"type":63,"value":295},"The important nuance for migration planning: ",{"type":50,"tag":66,"props":297,"children":298},{},[299],{"type":63,"value":300},"only data related to Workflows is deleted.",{"type":63,"value":302}," Event history, data store contents and File Store files are ",{"type":50,"tag":304,"props":305,"children":306},"em",{},[307],{"type":63,"value":119},{"type":63,"value":309}," in the workflow export, so if you rely on stored state you need to pull that separately (more on this below).",{"type":50,"tag":81,"props":311,"children":313},{"id":312},"export-your-workflows-before-you-do-anything-else",[314],{"type":63,"value":315},"Export your workflows before you do anything else",{"type":50,"tag":51,"props":317,"children":318},{},[319,321,328,330,335],{"type":63,"value":320},"Pipedream built an ",{"type":50,"tag":209,"props":322,"children":325},{"href":323,"rel":324},"https://pipedream.com/docs/workflows/export-workflows",[232],[326],{"type":63,"value":327},"export tool",{"type":63,"value":329}," exactly for this. You export ",{"type":50,"tag":66,"props":331,"children":332},{},[333],{"type":63,"value":334},"one project at a time",{"type":63,"value":237},{"type":50,"tag":337,"props":338,"children":339},"ol",{},[340,351,363],{"type":50,"tag":92,"props":341,"children":342},{},[343,345,350],{"type":63,"value":344},"Open the project in the Pipedream dashboard and select ",{"type":50,"tag":66,"props":346,"children":347},{},[348],{"type":63,"value":349},"Settings",{"type":63,"value":216},{"type":50,"tag":92,"props":352,"children":353},{},[354,356,361],{"type":63,"value":355},"Click ",{"type":50,"tag":66,"props":357,"children":358},{},[359],{"type":63,"value":360},"Export Workflows",{"type":63,"value":362},". Pipedream builds the archive in the background.",{"type":50,"tag":92,"props":364,"children":365},{},[366,368,373,375,380],{"type":63,"value":367},"When it finishes, the archive appears in the project's ",{"type":50,"tag":66,"props":369,"children":370},{},[371],{"type":63,"value":372},"File Store",{"type":63,"value":374}," as ",{"type":50,"tag":133,"props":376,"children":378},{"className":377},[],[379],{"type":63,"value":138},{"type":63,"value":381},". Download it.",{"type":50,"tag":51,"props":383,"children":384},{},[385],{"type":63,"value":386},"The archive keeps your project's folder structure and contains:",{"type":50,"tag":388,"props":389,"children":391},"pre",{"code":390},"project_export-proj_abc123.zip\n├── manifest.json\n├── sync-leads-to-sheets-p_abc123.json\n└── Marketing/\n    └── weekly-digest-p_def456.json\n",[392],{"type":50,"tag":133,"props":393,"children":394},{"__ignoreMap":7},[395],{"type":63,"value":390},{"type":50,"tag":51,"props":397,"children":398},{},[399,401,406,408,413,415,420,422,427,429,434],{"type":63,"value":400},"Each workflow JSON includes its name, description, settings, ",{"type":50,"tag":66,"props":402,"children":403},{},[404],{"type":63,"value":405},"triggers",{"type":63,"value":407},", ",{"type":50,"tag":66,"props":409,"children":410},{},[411],{"type":63,"value":412},"steps",{"type":63,"value":414}," (with the code for code steps), ",{"type":50,"tag":66,"props":416,"children":417},{},[418],{"type":63,"value":419},"configured props",{"type":63,"value":421},", and the ",{"type":50,"tag":66,"props":423,"children":424},{},[425],{"type":63,"value":426},"deployments",{"type":63,"value":428}," (steps inside if/else and switch branches). ",{"type":50,"tag":133,"props":430,"children":432},{"className":431},[],[433],{"type":63,"value":146},{"type":63,"value":435}," lists every workflow with a status and any warnings about props you must re-enter.",{"type":50,"tag":51,"props":437,"children":438},{},[439],{"type":63,"value":440},"Two things the export deliberately leaves out, and both matter:",{"type":50,"tag":88,"props":442,"children":443},{},[444,485],{"type":50,"tag":92,"props":445,"children":446},{},[447,452,454,460,462,468,470,476,478,483],{"type":50,"tag":66,"props":448,"children":449},{},[450],{"type":63,"value":451},"Credentials and secrets.",{"type":63,"value":453}," Secret props export as ",{"type":50,"tag":133,"props":455,"children":457},{"className":456},[],[458],{"type":63,"value":459},"\u003Credacted>",{"type":63,"value":461},", connected accounts export only their ",{"type":50,"tag":133,"props":463,"children":465},{"className":464},[],[466],{"type":63,"value":467},"authProvisionId",{"type":63,"value":469},", and environment variables are omitted. You re-enter these on the new platform. The ",{"type":50,"tag":133,"props":471,"children":473},{"className":472},[],[474],{"type":63,"value":475},"warnings",{"type":63,"value":477}," array in ",{"type":50,"tag":133,"props":479,"children":481},{"className":480},[],[482],{"type":63,"value":146},{"type":63,"value":484}," tells you exactly which step and prop needs it.",{"type":50,"tag":92,"props":486,"children":487},{},[488,493,495,502],{"type":50,"tag":66,"props":489,"children":490},{},[491],{"type":63,"value":492},"Data store contents and File Store files.",{"type":63,"value":494}," These are not in the archive. If your workflows keep state in a Data Store, either download it from the ",{"type":50,"tag":209,"props":496,"children":499},{"href":497,"rel":498},"https://pipedream.com/data-stores/",[232],[500],{"type":63,"value":501},"Data Stores dashboard",{"type":63,"value":503}," or export it with the Node.js chunked-export action Pipedream documents. You cannot migrate state you did not pull.",{"type":50,"tag":51,"props":505,"children":506},{},[507,509,514],{"type":63,"value":508},"Limits: one export covers up to ",{"type":50,"tag":66,"props":510,"children":511},{},[512],{"type":63,"value":513},"500 workflows or 256 MB",{"type":63,"value":515},", whichever comes first, and each project allows one export at a time.",{"type":50,"tag":81,"props":517,"children":519},{"id":518},"why-webhook-relay-is-a-strong-migration-target",[520],{"type":63,"value":521},"Why Webhook Relay is a strong migration target",{"type":50,"tag":51,"props":523,"children":524},{},[525,527,532],{"type":63,"value":526},"Most Pipedream Workflows that matter operationally are ",{"type":50,"tag":66,"props":528,"children":529},{},[530],{"type":63,"value":531},"webhook-driven",{"type":63,"value":533},": a Stripe charge, a GitHub push, a Shopify order, a CI event arrives, and the workflow transforms it and delivers it somewhere. That is exactly the shape Webhook Relay is built for — it is dedicated webhook infrastructure, not a general automation builder.",{"type":50,"tag":51,"props":535,"children":536},{},[537],{"type":63,"value":538},"The mapping is close:",{"type":50,"tag":540,"props":541,"children":542},"table",{},[543,562],{"type":50,"tag":544,"props":545,"children":546},"thead",{},[547],{"type":50,"tag":548,"props":549,"children":550},"tr",{},[551,557],{"type":50,"tag":552,"props":553,"children":554},"th",{},[555],{"type":63,"value":556},"Pipedream concept",{"type":50,"tag":552,"props":558,"children":559},{},[560],{"type":63,"value":561},"Webhook Relay equivalent",{"type":50,"tag":563,"props":564,"children":565},"tbody",{},[566,580,597,610,623,645,669,682,695],{"type":50,"tag":548,"props":567,"children":568},{},[569,575],{"type":50,"tag":570,"props":571,"children":572},"td",{},[573],{"type":63,"value":574},"HTTP / webhook trigger",{"type":50,"tag":570,"props":576,"children":577},{},[578],{"type":63,"value":579},"A bucket input with a permanent public URL",{"type":50,"tag":548,"props":581,"children":582},{},[583,588],{"type":50,"tag":570,"props":584,"children":585},{},[586],{"type":63,"value":587},"Timer / schedule trigger",{"type":50,"tag":570,"props":589,"children":590},{},[591],{"type":50,"tag":209,"props":592,"children":594},{"href":593},"/cron",[595],{"type":63,"value":596},"Scheduled (cron) webhooks",{"type":50,"tag":548,"props":598,"children":599},{},[600,605],{"type":50,"tag":570,"props":601,"children":602},{},[603],{"type":63,"value":604},"Code step (Node)",{"type":50,"tag":570,"props":606,"children":607},{},[608],{"type":63,"value":609},"A JavaScript function",{"type":50,"tag":548,"props":611,"children":612},{},[613,618],{"type":50,"tag":570,"props":614,"children":615},{},[616],{"type":63,"value":617},"Code step (Python/Bash/Go)",{"type":50,"tag":570,"props":619,"children":620},{},[621],{"type":63,"value":622},"Rewrite as JavaScript or Lua (only these two are supported)",{"type":50,"tag":548,"props":624,"children":625},{},[626,635],{"type":50,"tag":570,"props":627,"children":628},{},[629],{"type":50,"tag":133,"props":630,"children":632},{"className":631},[],[633],{"type":63,"value":634},"this.dataStore",{"type":50,"tag":570,"props":636,"children":637},{},[638,643],{"type":50,"tag":133,"props":639,"children":641},{"className":640},[],[642],{"type":63,"value":171},{"type":63,"value":644}," — a KV store with TTL",{"type":50,"tag":548,"props":646,"children":647},{},[648,659],{"type":50,"tag":570,"props":649,"children":650},{},[651,657],{"type":50,"tag":133,"props":652,"children":654},{"className":653},[],[655],{"type":63,"value":656},"$.files",{"type":63,"value":658}," / File Store",{"type":50,"tag":570,"props":660,"children":661},{},[662,667],{"type":50,"tag":133,"props":663,"children":665},{"className":664},[],[666],{"type":63,"value":185},{"type":63,"value":668}," — an object store with pre-signed URLs",{"type":50,"tag":548,"props":670,"children":671},{},[672,677],{"type":50,"tag":570,"props":673,"children":674},{},[675],{"type":63,"value":676},"Destination / HTTP step",{"type":50,"tag":570,"props":678,"children":679},{},[680],{"type":63,"value":681},"An output (public URL, queue, S3, Pub/Sub, and more)",{"type":50,"tag":548,"props":683,"children":684},{},[685,690],{"type":50,"tag":570,"props":686,"children":687},{},[688],{"type":63,"value":689},"Control flow (if/else, switch)",{"type":50,"tag":570,"props":691,"children":692},{},[693],{"type":63,"value":694},"Logic inside the function",{"type":50,"tag":548,"props":696,"children":697},{},[698,703],{"type":50,"tag":570,"props":699,"children":700},{},[701],{"type":63,"value":702},"Delayed / retried delivery",{"type":50,"tag":570,"props":704,"children":705},{},[706],{"type":63,"value":707},"Durable outputs with retries",{"type":50,"tag":51,"props":709,"children":710},{},[711,713,718,720,724],{"type":63,"value":712},"The two capabilities that previously blocked a clean migration — a ",{"type":50,"tag":66,"props":714,"children":715},{},[716],{"type":63,"value":717},"key-value store",{"type":63,"value":719}," and a ",{"type":50,"tag":66,"props":721,"children":722},{},[723],{"type":63,"value":178},{"type":63,"value":725}," — now exist as first-class runtime bindings, backed by the same object storage that holds function code, so there is no extra infrastructure to stand up.",{"type":50,"tag":727,"props":728,"children":730},"h3",{"id":729},"kv-store-pipedream-data-stores-mapped",[731],{"type":63,"value":732},"KV store: Pipedream Data Stores, mapped",{"type":50,"tag":51,"props":734,"children":735},{},[736],{"type":63,"value":737},"Webhook Relay functions bind a named KV store just like a secret, then call it synchronously:",{"type":50,"tag":388,"props":739,"children":743},{"code":740,"language":741,"meta":7,"className":742,"style":7},"const kv = require(\"kv:sessions\")\n\nkv.set(\"cursor\", 42)          // no expiry\nkv.set(\"token\", \"abc\", 3600)  // optional TTL, in seconds\nkv.get(\"cursor\")              // 42, or undefined if absent or expired\nkv.has(\"cursor\")              // boolean\nkv.setTtl(\"token\", 7200)      // change expiry without rewriting the value\nkv.delete(\"cursor\")           // true\nconst page = kv.keys(\"user:\", 100)   // { keys: [...], cursor: \"...\" }\n","javascript","language-javascript shiki shiki-themes github-dark",[744],{"type":50,"tag":133,"props":745,"children":746},{"__ignoreMap":7},[747,793,803,846,895,926,956,996,1027],{"type":50,"tag":748,"props":749,"children":752},"span",{"class":750,"line":751},"line",1,[753,759,765,770,776,782,788],{"type":50,"tag":748,"props":754,"children":756},{"style":755},"--shiki-default:#F97583",[757],{"type":63,"value":758},"const",{"type":50,"tag":748,"props":760,"children":762},{"style":761},"--shiki-default:#79B8FF",[763],{"type":63,"value":764}," kv",{"type":50,"tag":748,"props":766,"children":767},{"style":755},[768],{"type":63,"value":769}," =",{"type":50,"tag":748,"props":771,"children":773},{"style":772},"--shiki-default:#B392F0",[774],{"type":63,"value":775}," require",{"type":50,"tag":748,"props":777,"children":779},{"style":778},"--shiki-default:#E1E4E8",[780],{"type":63,"value":781},"(",{"type":50,"tag":748,"props":783,"children":785},{"style":784},"--shiki-default:#9ECBFF",[786],{"type":63,"value":787},"\"kv:sessions\"",{"type":50,"tag":748,"props":789,"children":790},{"style":778},[791],{"type":63,"value":792},")\n",{"type":50,"tag":748,"props":794,"children":796},{"class":750,"line":795},2,[797],{"type":50,"tag":748,"props":798,"children":800},{"emptyLinePlaceholder":799},true,[801],{"type":63,"value":802},"\n",{"type":50,"tag":748,"props":804,"children":806},{"class":750,"line":805},3,[807,812,817,821,826,830,835,840],{"type":50,"tag":748,"props":808,"children":809},{"style":778},[810],{"type":63,"value":811},"kv.",{"type":50,"tag":748,"props":813,"children":814},{"style":772},[815],{"type":63,"value":816},"set",{"type":50,"tag":748,"props":818,"children":819},{"style":778},[820],{"type":63,"value":781},{"type":50,"tag":748,"props":822,"children":823},{"style":784},[824],{"type":63,"value":825},"\"cursor\"",{"type":50,"tag":748,"props":827,"children":828},{"style":778},[829],{"type":63,"value":407},{"type":50,"tag":748,"props":831,"children":832},{"style":761},[833],{"type":63,"value":834},"42",{"type":50,"tag":748,"props":836,"children":837},{"style":778},[838],{"type":63,"value":839},")          ",{"type":50,"tag":748,"props":841,"children":843},{"style":842},"--shiki-default:#6A737D",[844],{"type":63,"value":845},"// no expiry\n",{"type":50,"tag":748,"props":847,"children":849},{"class":750,"line":848},4,[850,854,858,862,867,871,876,880,885,890],{"type":50,"tag":748,"props":851,"children":852},{"style":778},[853],{"type":63,"value":811},{"type":50,"tag":748,"props":855,"children":856},{"style":772},[857],{"type":63,"value":816},{"type":50,"tag":748,"props":859,"children":860},{"style":778},[861],{"type":63,"value":781},{"type":50,"tag":748,"props":863,"children":864},{"style":784},[865],{"type":63,"value":866},"\"token\"",{"type":50,"tag":748,"props":868,"children":869},{"style":778},[870],{"type":63,"value":407},{"type":50,"tag":748,"props":872,"children":873},{"style":784},[874],{"type":63,"value":875},"\"abc\"",{"type":50,"tag":748,"props":877,"children":878},{"style":778},[879],{"type":63,"value":407},{"type":50,"tag":748,"props":881,"children":882},{"style":761},[883],{"type":63,"value":884},"3600",{"type":50,"tag":748,"props":886,"children":887},{"style":778},[888],{"type":63,"value":889},")  ",{"type":50,"tag":748,"props":891,"children":892},{"style":842},[893],{"type":63,"value":894},"// optional TTL, in seconds\n",{"type":50,"tag":748,"props":896,"children":898},{"class":750,"line":897},5,[899,903,908,912,916,921],{"type":50,"tag":748,"props":900,"children":901},{"style":778},[902],{"type":63,"value":811},{"type":50,"tag":748,"props":904,"children":905},{"style":772},[906],{"type":63,"value":907},"get",{"type":50,"tag":748,"props":909,"children":910},{"style":778},[911],{"type":63,"value":781},{"type":50,"tag":748,"props":913,"children":914},{"style":784},[915],{"type":63,"value":825},{"type":50,"tag":748,"props":917,"children":918},{"style":778},[919],{"type":63,"value":920},")              ",{"type":50,"tag":748,"props":922,"children":923},{"style":842},[924],{"type":63,"value":925},"// 42, or undefined if absent or expired\n",{"type":50,"tag":748,"props":927,"children":929},{"class":750,"line":928},6,[930,934,939,943,947,951],{"type":50,"tag":748,"props":931,"children":932},{"style":778},[933],{"type":63,"value":811},{"type":50,"tag":748,"props":935,"children":936},{"style":772},[937],{"type":63,"value":938},"has",{"type":50,"tag":748,"props":940,"children":941},{"style":778},[942],{"type":63,"value":781},{"type":50,"tag":748,"props":944,"children":945},{"style":784},[946],{"type":63,"value":825},{"type":50,"tag":748,"props":948,"children":949},{"style":778},[950],{"type":63,"value":920},{"type":50,"tag":748,"props":952,"children":953},{"style":842},[954],{"type":63,"value":955},"// boolean\n",{"type":50,"tag":748,"props":957,"children":959},{"class":750,"line":958},7,[960,964,969,973,977,981,986,991],{"type":50,"tag":748,"props":961,"children":962},{"style":778},[963],{"type":63,"value":811},{"type":50,"tag":748,"props":965,"children":966},{"style":772},[967],{"type":63,"value":968},"setTtl",{"type":50,"tag":748,"props":970,"children":971},{"style":778},[972],{"type":63,"value":781},{"type":50,"tag":748,"props":974,"children":975},{"style":784},[976],{"type":63,"value":866},{"type":50,"tag":748,"props":978,"children":979},{"style":778},[980],{"type":63,"value":407},{"type":50,"tag":748,"props":982,"children":983},{"style":761},[984],{"type":63,"value":985},"7200",{"type":50,"tag":748,"props":987,"children":988},{"style":778},[989],{"type":63,"value":990},")      ",{"type":50,"tag":748,"props":992,"children":993},{"style":842},[994],{"type":63,"value":995},"// change expiry without rewriting the value\n",{"type":50,"tag":748,"props":997,"children":999},{"class":750,"line":998},8,[1000,1004,1009,1013,1017,1022],{"type":50,"tag":748,"props":1001,"children":1002},{"style":778},[1003],{"type":63,"value":811},{"type":50,"tag":748,"props":1005,"children":1006},{"style":772},[1007],{"type":63,"value":1008},"delete",{"type":50,"tag":748,"props":1010,"children":1011},{"style":778},[1012],{"type":63,"value":781},{"type":50,"tag":748,"props":1014,"children":1015},{"style":784},[1016],{"type":63,"value":825},{"type":50,"tag":748,"props":1018,"children":1019},{"style":778},[1020],{"type":63,"value":1021},")           ",{"type":50,"tag":748,"props":1023,"children":1024},{"style":842},[1025],{"type":63,"value":1026},"// true\n",{"type":50,"tag":748,"props":1028,"children":1030},{"class":750,"line":1029},9,[1031,1035,1040,1044,1049,1054,1058,1063,1067,1072,1077],{"type":50,"tag":748,"props":1032,"children":1033},{"style":755},[1034],{"type":63,"value":758},{"type":50,"tag":748,"props":1036,"children":1037},{"style":761},[1038],{"type":63,"value":1039}," page",{"type":50,"tag":748,"props":1041,"children":1042},{"style":755},[1043],{"type":63,"value":769},{"type":50,"tag":748,"props":1045,"children":1046},{"style":778},[1047],{"type":63,"value":1048}," kv.",{"type":50,"tag":748,"props":1050,"children":1051},{"style":772},[1052],{"type":63,"value":1053},"keys",{"type":50,"tag":748,"props":1055,"children":1056},{"style":778},[1057],{"type":63,"value":781},{"type":50,"tag":748,"props":1059,"children":1060},{"style":784},[1061],{"type":63,"value":1062},"\"user:\"",{"type":50,"tag":748,"props":1064,"children":1065},{"style":778},[1066],{"type":63,"value":407},{"type":50,"tag":748,"props":1068,"children":1069},{"style":761},[1070],{"type":63,"value":1071},"100",{"type":50,"tag":748,"props":1073,"children":1074},{"style":778},[1075],{"type":63,"value":1076},")   ",{"type":50,"tag":748,"props":1078,"children":1079},{"style":842},[1080],{"type":63,"value":1081},"// { keys: [...], cursor: \"...\" }\n",{"type":50,"tag":51,"props":1083,"children":1084},{},[1085,1087,1092,1094,1099],{"type":63,"value":1086},"Values are JSON-serializable and capped at ",{"type":50,"tag":66,"props":1088,"children":1089},{},[1090],{"type":63,"value":1091},"256 KiB",{"type":63,"value":1093},"; keys are up to 512 bytes. TTL is supported per key. This covers the four things Pipedream Data Stores are most often used for — ",{"type":50,"tag":66,"props":1095,"children":1096},{},[1097],{"type":63,"value":1098},"counters, dedupe, rate limiting and cursors",{"type":63,"value":216},{"type":50,"tag":51,"props":1101,"children":1102},{},[1103,1105,1110],{"type":63,"value":1104},"The method-by-method mapping from Pipedream's ",{"type":50,"tag":133,"props":1106,"children":1108},{"className":1107},[],[1109],{"type":63,"value":634},{"type":63,"value":237},{"type":50,"tag":540,"props":1112,"children":1113},{},[1114,1130],{"type":50,"tag":544,"props":1115,"children":1116},{},[1117],{"type":50,"tag":548,"props":1118,"children":1119},{},[1120,1125],{"type":50,"tag":552,"props":1121,"children":1122},{},[1123],{"type":63,"value":1124},"Pipedream",{"type":50,"tag":552,"props":1126,"children":1127},{},[1128],{"type":63,"value":1129},"Webhook Relay",{"type":50,"tag":563,"props":1131,"children":1132},{},[1133,1154,1175,1196,1217,1238,1259],{"type":50,"tag":548,"props":1134,"children":1135},{},[1136,1145],{"type":50,"tag":570,"props":1137,"children":1138},{},[1139],{"type":50,"tag":133,"props":1140,"children":1142},{"className":1141},[],[1143],{"type":63,"value":1144},"this.dataStore.set(k, v, { ttl })",{"type":50,"tag":570,"props":1146,"children":1147},{},[1148],{"type":50,"tag":133,"props":1149,"children":1151},{"className":1150},[],[1152],{"type":63,"value":1153},"kv.set(k, v, ttl)",{"type":50,"tag":548,"props":1155,"children":1156},{},[1157,1166],{"type":50,"tag":570,"props":1158,"children":1159},{},[1160],{"type":50,"tag":133,"props":1161,"children":1163},{"className":1162},[],[1164],{"type":63,"value":1165},"this.dataStore.get(k)",{"type":50,"tag":570,"props":1167,"children":1168},{},[1169],{"type":50,"tag":133,"props":1170,"children":1172},{"className":1171},[],[1173],{"type":63,"value":1174},"kv.get(k)",{"type":50,"tag":548,"props":1176,"children":1177},{},[1178,1187],{"type":50,"tag":570,"props":1179,"children":1180},{},[1181],{"type":50,"tag":133,"props":1182,"children":1184},{"className":1183},[],[1185],{"type":63,"value":1186},"this.dataStore.has(k)",{"type":50,"tag":570,"props":1188,"children":1189},{},[1190],{"type":50,"tag":133,"props":1191,"children":1193},{"className":1192},[],[1194],{"type":63,"value":1195},"kv.has(k)",{"type":50,"tag":548,"props":1197,"children":1198},{},[1199,1208],{"type":50,"tag":570,"props":1200,"children":1201},{},[1202],{"type":50,"tag":133,"props":1203,"children":1205},{"className":1204},[],[1206],{"type":63,"value":1207},"this.dataStore.setTtl(k, s)",{"type":50,"tag":570,"props":1209,"children":1210},{},[1211],{"type":50,"tag":133,"props":1212,"children":1214},{"className":1213},[],[1215],{"type":63,"value":1216},"kv.setTtl(k, s)",{"type":50,"tag":548,"props":1218,"children":1219},{},[1220,1229],{"type":50,"tag":570,"props":1221,"children":1222},{},[1223],{"type":50,"tag":133,"props":1224,"children":1226},{"className":1225},[],[1227],{"type":63,"value":1228},"this.dataStore.delete(k)",{"type":50,"tag":570,"props":1230,"children":1231},{},[1232],{"type":50,"tag":133,"props":1233,"children":1235},{"className":1234},[],[1236],{"type":63,"value":1237},"kv.delete(k)",{"type":50,"tag":548,"props":1239,"children":1240},{},[1241,1250],{"type":50,"tag":570,"props":1242,"children":1243},{},[1244],{"type":50,"tag":133,"props":1245,"children":1247},{"className":1246},[],[1248],{"type":63,"value":1249},"(await this.dataStore.keys())",{"type":50,"tag":570,"props":1251,"children":1252},{},[1253],{"type":50,"tag":133,"props":1254,"children":1256},{"className":1255},[],[1257],{"type":63,"value":1258},"kv.keys().keys",{"type":50,"tag":548,"props":1260,"children":1261},{},[1262,1271],{"type":50,"tag":570,"props":1263,"children":1264},{},[1265],{"type":50,"tag":133,"props":1266,"children":1268},{"className":1267},[],[1269],{"type":63,"value":1270},"for await (const [k,v] of this.dataStore)",{"type":50,"tag":570,"props":1272,"children":1273},{},[1274,1280],{"type":50,"tag":133,"props":1275,"children":1277},{"className":1276},[],[1278],{"type":63,"value":1279},"kv.keys()",{"type":63,"value":1281}," paging",{"type":50,"tag":51,"props":1283,"children":1284},{},[1285,1287,1292,1294,1299,1301,1307,1309,1314,1316,1321,1323,1328],{"type":63,"value":1286},"Two honest differences to plan for. First, Webhook Relay's bindings are ",{"type":50,"tag":66,"props":1288,"children":1289},{},[1290],{"type":63,"value":1291},"synchronous",{"type":63,"value":1293}," — ",{"type":50,"tag":133,"props":1295,"children":1297},{"className":1296},[],[1298],{"type":63,"value":1174},{"type":63,"value":1300}," returns the value directly, so drop the ",{"type":50,"tag":133,"props":1302,"children":1304},{"className":1303},[],[1305],{"type":63,"value":1306},"await",{"type":63,"value":1308}," when you port. Second, Pipedream's Data Store operations are ",{"type":50,"tag":66,"props":1310,"children":1311},{},[1312],{"type":63,"value":1313},"not atomic",{"type":63,"value":1315}," (their own docs warn about race conditions), and neither is a ",{"type":50,"tag":133,"props":1317,"children":1319},{"className":1318},[],[1320],{"type":63,"value":907},{"type":63,"value":1322},"+",{"type":50,"tag":133,"props":1324,"children":1326},{"className":1325},[],[1327],{"type":63,"value":816},{"type":63,"value":1329}," pair here; if you have a true counter that must not race, keep that logic in a single serialized worker.",{"type":50,"tag":727,"props":1331,"children":1333},{"id":1332},"file-store-pipedream-file-stores-mapped",[1334],{"type":63,"value":1335},"File store: Pipedream File Stores, mapped",{"type":50,"tag":51,"props":1337,"children":1338},{},[1339],{"type":63,"value":1340},"Passing files between runs works the same way:",{"type":50,"tag":388,"props":1342,"children":1344},{"code":1343,"language":741,"meta":7,"className":742,"style":7},"const files = require(\"files:exports\")\n\nfiles.put(\"reports/today.csv\", csv, \"text/csv\")\nfiles.get(\"reports/today.csv\")        // contents as a string\nfiles.getBuffer(\"logo.png\")           // base64 string\nfiles.exists(\"reports/today.csv\")     // boolean\nfiles.stat(\"reports/today.csv\")       // { path, size, content_type, modified_at }\nfiles.list(\"reports/\", 100)           // { files: [...], cursor: \"...\" }\nfiles.url(\"reports/today.csv\")        // pre-signed download URL (30 min)\nfiles.url(\"reports/today.csv\", \"PUT\", 600) // pre-signed upload URL (10 min)\n",[1345],{"type":50,"tag":133,"props":1346,"children":1347},{"__ignoreMap":7},[1348,1381,1388,1424,1453,1483,1512,1542,1580,1609],{"type":50,"tag":748,"props":1349,"children":1350},{"class":750,"line":751},[1351,1355,1360,1364,1368,1372,1377],{"type":50,"tag":748,"props":1352,"children":1353},{"style":755},[1354],{"type":63,"value":758},{"type":50,"tag":748,"props":1356,"children":1357},{"style":761},[1358],{"type":63,"value":1359}," files",{"type":50,"tag":748,"props":1361,"children":1362},{"style":755},[1363],{"type":63,"value":769},{"type":50,"tag":748,"props":1365,"children":1366},{"style":772},[1367],{"type":63,"value":775},{"type":50,"tag":748,"props":1369,"children":1370},{"style":778},[1371],{"type":63,"value":781},{"type":50,"tag":748,"props":1373,"children":1374},{"style":784},[1375],{"type":63,"value":1376},"\"files:exports\"",{"type":50,"tag":748,"props":1378,"children":1379},{"style":778},[1380],{"type":63,"value":792},{"type":50,"tag":748,"props":1382,"children":1383},{"class":750,"line":795},[1384],{"type":50,"tag":748,"props":1385,"children":1386},{"emptyLinePlaceholder":799},[1387],{"type":63,"value":802},{"type":50,"tag":748,"props":1389,"children":1390},{"class":750,"line":805},[1391,1396,1401,1405,1410,1415,1420],{"type":50,"tag":748,"props":1392,"children":1393},{"style":778},[1394],{"type":63,"value":1395},"files.",{"type":50,"tag":748,"props":1397,"children":1398},{"style":772},[1399],{"type":63,"value":1400},"put",{"type":50,"tag":748,"props":1402,"children":1403},{"style":778},[1404],{"type":63,"value":781},{"type":50,"tag":748,"props":1406,"children":1407},{"style":784},[1408],{"type":63,"value":1409},"\"reports/today.csv\"",{"type":50,"tag":748,"props":1411,"children":1412},{"style":778},[1413],{"type":63,"value":1414},", csv, ",{"type":50,"tag":748,"props":1416,"children":1417},{"style":784},[1418],{"type":63,"value":1419},"\"text/csv\"",{"type":50,"tag":748,"props":1421,"children":1422},{"style":778},[1423],{"type":63,"value":792},{"type":50,"tag":748,"props":1425,"children":1426},{"class":750,"line":848},[1427,1431,1435,1439,1443,1448],{"type":50,"tag":748,"props":1428,"children":1429},{"style":778},[1430],{"type":63,"value":1395},{"type":50,"tag":748,"props":1432,"children":1433},{"style":772},[1434],{"type":63,"value":907},{"type":50,"tag":748,"props":1436,"children":1437},{"style":778},[1438],{"type":63,"value":781},{"type":50,"tag":748,"props":1440,"children":1441},{"style":784},[1442],{"type":63,"value":1409},{"type":50,"tag":748,"props":1444,"children":1445},{"style":778},[1446],{"type":63,"value":1447},")        ",{"type":50,"tag":748,"props":1449,"children":1450},{"style":842},[1451],{"type":63,"value":1452},"// contents as a string\n",{"type":50,"tag":748,"props":1454,"children":1455},{"class":750,"line":897},[1456,1460,1465,1469,1474,1478],{"type":50,"tag":748,"props":1457,"children":1458},{"style":778},[1459],{"type":63,"value":1395},{"type":50,"tag":748,"props":1461,"children":1462},{"style":772},[1463],{"type":63,"value":1464},"getBuffer",{"type":50,"tag":748,"props":1466,"children":1467},{"style":778},[1468],{"type":63,"value":781},{"type":50,"tag":748,"props":1470,"children":1471},{"style":784},[1472],{"type":63,"value":1473},"\"logo.png\"",{"type":50,"tag":748,"props":1475,"children":1476},{"style":778},[1477],{"type":63,"value":1021},{"type":50,"tag":748,"props":1479,"children":1480},{"style":842},[1481],{"type":63,"value":1482},"// base64 string\n",{"type":50,"tag":748,"props":1484,"children":1485},{"class":750,"line":928},[1486,1490,1495,1499,1503,1508],{"type":50,"tag":748,"props":1487,"children":1488},{"style":778},[1489],{"type":63,"value":1395},{"type":50,"tag":748,"props":1491,"children":1492},{"style":772},[1493],{"type":63,"value":1494},"exists",{"type":50,"tag":748,"props":1496,"children":1497},{"style":778},[1498],{"type":63,"value":781},{"type":50,"tag":748,"props":1500,"children":1501},{"style":784},[1502],{"type":63,"value":1409},{"type":50,"tag":748,"props":1504,"children":1505},{"style":778},[1506],{"type":63,"value":1507},")     ",{"type":50,"tag":748,"props":1509,"children":1510},{"style":842},[1511],{"type":63,"value":955},{"type":50,"tag":748,"props":1513,"children":1514},{"class":750,"line":958},[1515,1519,1524,1528,1532,1537],{"type":50,"tag":748,"props":1516,"children":1517},{"style":778},[1518],{"type":63,"value":1395},{"type":50,"tag":748,"props":1520,"children":1521},{"style":772},[1522],{"type":63,"value":1523},"stat",{"type":50,"tag":748,"props":1525,"children":1526},{"style":778},[1527],{"type":63,"value":781},{"type":50,"tag":748,"props":1529,"children":1530},{"style":784},[1531],{"type":63,"value":1409},{"type":50,"tag":748,"props":1533,"children":1534},{"style":778},[1535],{"type":63,"value":1536},")       ",{"type":50,"tag":748,"props":1538,"children":1539},{"style":842},[1540],{"type":63,"value":1541},"// { path, size, content_type, modified_at }\n",{"type":50,"tag":748,"props":1543,"children":1544},{"class":750,"line":998},[1545,1549,1554,1558,1563,1567,1571,1575],{"type":50,"tag":748,"props":1546,"children":1547},{"style":778},[1548],{"type":63,"value":1395},{"type":50,"tag":748,"props":1550,"children":1551},{"style":772},[1552],{"type":63,"value":1553},"list",{"type":50,"tag":748,"props":1555,"children":1556},{"style":778},[1557],{"type":63,"value":781},{"type":50,"tag":748,"props":1559,"children":1560},{"style":784},[1561],{"type":63,"value":1562},"\"reports/\"",{"type":50,"tag":748,"props":1564,"children":1565},{"style":778},[1566],{"type":63,"value":407},{"type":50,"tag":748,"props":1568,"children":1569},{"style":761},[1570],{"type":63,"value":1071},{"type":50,"tag":748,"props":1572,"children":1573},{"style":778},[1574],{"type":63,"value":1021},{"type":50,"tag":748,"props":1576,"children":1577},{"style":842},[1578],{"type":63,"value":1579},"// { files: [...], cursor: \"...\" }\n",{"type":50,"tag":748,"props":1581,"children":1582},{"class":750,"line":1029},[1583,1587,1592,1596,1600,1604],{"type":50,"tag":748,"props":1584,"children":1585},{"style":778},[1586],{"type":63,"value":1395},{"type":50,"tag":748,"props":1588,"children":1589},{"style":772},[1590],{"type":63,"value":1591},"url",{"type":50,"tag":748,"props":1593,"children":1594},{"style":778},[1595],{"type":63,"value":781},{"type":50,"tag":748,"props":1597,"children":1598},{"style":784},[1599],{"type":63,"value":1409},{"type":50,"tag":748,"props":1601,"children":1602},{"style":778},[1603],{"type":63,"value":1447},{"type":50,"tag":748,"props":1605,"children":1606},{"style":842},[1607],{"type":63,"value":1608},"// pre-signed download URL (30 min)\n",{"type":50,"tag":748,"props":1610,"children":1612},{"class":750,"line":1611},10,[1613,1617,1621,1625,1629,1633,1638,1642,1647,1652],{"type":50,"tag":748,"props":1614,"children":1615},{"style":778},[1616],{"type":63,"value":1395},{"type":50,"tag":748,"props":1618,"children":1619},{"style":772},[1620],{"type":63,"value":1591},{"type":50,"tag":748,"props":1622,"children":1623},{"style":778},[1624],{"type":63,"value":781},{"type":50,"tag":748,"props":1626,"children":1627},{"style":784},[1628],{"type":63,"value":1409},{"type":50,"tag":748,"props":1630,"children":1631},{"style":778},[1632],{"type":63,"value":407},{"type":50,"tag":748,"props":1634,"children":1635},{"style":784},[1636],{"type":63,"value":1637},"\"PUT\"",{"type":50,"tag":748,"props":1639,"children":1640},{"style":778},[1641],{"type":63,"value":407},{"type":50,"tag":748,"props":1643,"children":1644},{"style":761},[1645],{"type":63,"value":1646},"600",{"type":50,"tag":748,"props":1648,"children":1649},{"style":778},[1650],{"type":63,"value":1651},") ",{"type":50,"tag":748,"props":1653,"children":1654},{"style":842},[1655],{"type":63,"value":1656},"// pre-signed upload URL (10 min)\n",{"type":50,"tag":51,"props":1658,"children":1659},{},[1660,1662,1667,1669,1674,1676,1682,1684,1690,1692,1698,1700,1706],{"type":63,"value":1661},"Reads are capped at ",{"type":50,"tag":66,"props":1663,"children":1664},{},[1665],{"type":63,"value":1666},"8 MiB",{"type":63,"value":1668}," and a single inline write at ",{"type":50,"tag":66,"props":1670,"children":1671},{},[1672],{"type":63,"value":1673},"32 MiB",{"type":63,"value":1675},"; larger objects go through a pre-signed URL. The one structural difference is that Pipedream stages files on a ",{"type":50,"tag":133,"props":1677,"children":1679},{"className":1678},[],[1680],{"type":63,"value":1681},"/tmp",{"type":63,"value":1683}," filesystem between steps, which Webhook Relay's sandbox does not have — so ",{"type":50,"tag":133,"props":1685,"children":1687},{"className":1686},[],[1688],{"type":63,"value":1689},"file.toFile('/tmp/x')",{"type":63,"value":1691}," becomes ",{"type":50,"tag":133,"props":1693,"children":1695},{"className":1694},[],[1696],{"type":63,"value":1697},"files.getBuffer(x)",{"type":63,"value":1699}," and you pass the bytes (or a ",{"type":50,"tag":133,"props":1701,"children":1703},{"className":1702},[],[1704],{"type":63,"value":1705},"files.url()",{"type":63,"value":1707}," link) forward.",{"type":50,"tag":81,"props":1709,"children":1711},{"id":1710},"the-fast-path-let-claude-or-codex-do-the-migration",[1712],{"type":63,"value":1713},"The fast path: let Claude or Codex do the migration",{"type":50,"tag":51,"props":1715,"children":1716},{},[1717],{"type":63,"value":1718},"Manually porting a folder of workflows is tedious, and it is exactly the kind of structured, repetitive task a coding agent is good at. The recipe:",{"type":50,"tag":337,"props":1720,"children":1721},{},[1722,1732,1804,1822,1869],{"type":50,"tag":92,"props":1723,"children":1724},{},[1725,1730],{"type":50,"tag":66,"props":1726,"children":1727},{},[1728],{"type":63,"value":1729},"Export",{"type":63,"value":1731}," each project to JSON (above) and unzip it.",{"type":50,"tag":92,"props":1733,"children":1734},{},[1735,1740,1742,1774,1778,1780,1786,1788,1794,1796,1802],{"type":50,"tag":66,"props":1736,"children":1737},{},[1738],{"type":63,"value":1739},"Install the Webhook Relay Agent Skills.",{"type":63,"value":1741}," They are open source and teach an agent how to drive Webhook Relay correctly:",{"type":50,"tag":388,"props":1743,"children":1747},{"code":1744,"language":1745,"meta":7,"className":1746,"style":7},"npx skills add webhookrelay/skills\n","bash","language-bash shiki shiki-themes github-dark",[1748],{"type":50,"tag":133,"props":1749,"children":1750},{"__ignoreMap":7},[1751],{"type":50,"tag":748,"props":1752,"children":1753},{"class":750,"line":751},[1754,1759,1764,1769],{"type":50,"tag":748,"props":1755,"children":1756},{"style":772},[1757],{"type":63,"value":1758},"npx",{"type":50,"tag":748,"props":1760,"children":1761},{"style":784},[1762],{"type":63,"value":1763}," skills",{"type":50,"tag":748,"props":1765,"children":1766},{"style":784},[1767],{"type":63,"value":1768}," add",{"type":50,"tag":748,"props":1770,"children":1771},{"style":784},[1772],{"type":63,"value":1773}," webhookrelay/skills\n",{"type":50,"tag":1775,"props":1776,"children":1777},"br",{},[],{"type":63,"value":1779},"The ",{"type":50,"tag":133,"props":1781,"children":1783},{"className":1782},[],[1784],{"type":63,"value":1785},"webhook-transformations",{"type":63,"value":1787}," skill covers writing and testing JavaScript/Lua functions; ",{"type":50,"tag":133,"props":1789,"children":1791},{"className":1790},[],[1792],{"type":63,"value":1793},"webhook-forwarding-public",{"type":63,"value":1795}," and ",{"type":50,"tag":133,"props":1797,"children":1799},{"className":1798},[],[1800],{"type":63,"value":1801},"recurring-webhooks",{"type":63,"value":1803}," cover the routing and scheduling triggers.",{"type":50,"tag":92,"props":1805,"children":1806},{},[1807,1812,1814,1820],{"type":50,"tag":66,"props":1808,"children":1809},{},[1810],{"type":63,"value":1811},"Hand the agent the material.",{"type":63,"value":1813}," Point Claude Code, Codex or another coding agent at the export folder and give it three references: the workflow JSON files, the ",{"type":50,"tag":209,"props":1815,"children":1817},{"href":1816},"/docs/webhooks/functions/",[1818],{"type":63,"value":1819},"Webhook Relay functions docs",{"type":63,"value":1821},", and the skills above.",{"type":50,"tag":92,"props":1823,"children":1824},{},[1825,1830,1832],{"type":50,"tag":66,"props":1826,"children":1827},{},[1828],{"type":63,"value":1829},"Ask for a port, one workflow at a time.",{"type":63,"value":1831}," A prompt like:",{"type":50,"tag":1833,"props":1834,"children":1835},"blockquote",{},[1836],{"type":50,"tag":51,"props":1837,"children":1838},{},[1839,1841,1847,1849,1854,1855,1861,1862,1867],{"type":63,"value":1840},"Read every workflow JSON in this export. For each one, produce a Webhook Relay function in JavaScript that reproduces the transform and delivery behavior. Map ",{"type":50,"tag":133,"props":1842,"children":1844},{"className":1843},[],[1845],{"type":63,"value":1846},"this.dataStore.*",{"type":63,"value":1848}," calls to ",{"type":50,"tag":133,"props":1850,"children":1852},{"className":1851},[],[1853],{"type":63,"value":171},{"type":63,"value":1795},{"type":50,"tag":133,"props":1856,"children":1858},{"className":1857},[],[1859],{"type":63,"value":1860},"files.*",{"type":63,"value":1848},{"type":50,"tag":133,"props":1863,"children":1865},{"className":1864},[],[1866],{"type":63,"value":185},{"type":63,"value":1868},". List every trigger as an input, scheduled webhook or output, and flag any step that relies on a Pipedream app integration or a Python/Bash/Go step, because those need manual work. For each function, write a sample request and the expected forwarded body so I can test it.",{"type":50,"tag":92,"props":1870,"children":1871},{},[1872,1877],{"type":50,"tag":66,"props":1873,"children":1874},{},[1875],{"type":63,"value":1876},"Test before you attach.",{"type":63,"value":1878}," Webhook Relay functions run against a real request you supply, and errors show up in the execution log. Have the agent (or yourself) verify each function forwards the body you expect before wiring it to a production input.",{"type":50,"tag":51,"props":1880,"children":1881},{},[1882,1884,1889,1891,1897,1899,1904,1905,1911],{"type":63,"value":1883},"The agent handles the mechanical translation — the ",{"type":50,"tag":133,"props":1885,"children":1887},{"className":1886},[],[1888],{"type":63,"value":634},{"type":63,"value":1890}," to ",{"type":50,"tag":133,"props":1892,"children":1894},{"className":1893},[],[1895],{"type":63,"value":1896},"kv",{"type":63,"value":1898},", the ",{"type":50,"tag":133,"props":1900,"children":1902},{"className":1901},[],[1903],{"type":63,"value":656},{"type":63,"value":1890},{"type":50,"tag":133,"props":1906,"children":1908},{"className":1907},[],[1909],{"type":63,"value":1910},"files",{"type":63,"value":1912},", the step-by-step reshuffling into a single function — and, just as usefully, flags the parts that need a human decision. Treat its output as a draft you test, not a finished migration.",{"type":50,"tag":1833,"props":1914,"children":1915},{},[1916],{"type":50,"tag":51,"props":1917,"children":1918},{},[1919,1921,1926],{"type":63,"value":1920},"If you would rather not do this yourself, the Webhook Relay team can help. ",{"type":50,"tag":209,"props":1922,"children":1923},{"href":211},[1924],{"type":63,"value":1925},"Contact us",{"type":63,"value":1927}," with your use case and we will walk through the migration with you.",{"type":50,"tag":81,"props":1929,"children":1931},{"id":1930},"worked-example-deduplicating-stripe-events",[1932],{"type":63,"value":1933},"Worked example: deduplicating Stripe events",{"type":50,"tag":51,"props":1935,"children":1936},{},[1937],{"type":63,"value":1938},"Take a common Pipedream workflow: receive a Stripe event, deduplicate by event ID in a Data Store, and forward new events to an internal API.",{"type":50,"tag":51,"props":1940,"children":1941},{},[1942,1944,1949],{"type":63,"value":1943},"In Pipedream, that is a trigger, a code step that reads and writes ",{"type":50,"tag":133,"props":1945,"children":1947},{"className":1946},[],[1948],{"type":63,"value":634},{"type":63,"value":1950},", an if/else on the dedupe result, and an HTTP destination.",{"type":50,"tag":51,"props":1952,"children":1953},{},[1954],{"type":63,"value":1955},"In Webhook Relay, it is one function on the input:",{"type":50,"tag":388,"props":1957,"children":1959},{"code":1958,"language":741,"meta":7,"className":742,"style":7},"// Function on the Stripe input, bound to a KV store aliased \"events\"\nconst kv = require(\"kv:events\")\n\nconst event = JSON.parse(r.body)\n\n// Dedupe: have we seen this event before? TTL 7 days.\nif (kv.has(event.id)) {\n  r.stopForwarding()                 // already processed, don't deliver again\n  return\n}\nkv.set(event.id, true, 7 * 24 * 3600)\n\n// Reshape for the internal API and forward.\nr.setBody(JSON.stringify({\n  type: event.type,\n  amount: event.data.object.amount,\n  customer: event.data.object.customer,\n}))\nr.setHeader(\"Content-Type\", \"application/json\")\nr.setPath(\"/v2/stripe-events\")\n",[1960],{"type":50,"tag":133,"props":1961,"children":1962},{"__ignoreMap":7},[1963,1971,2003,2010,2045,2052,2060,2082,2105,2113,2121,2175,2183,2192,2229,2238,2247,2256,2265,2300],{"type":50,"tag":748,"props":1964,"children":1965},{"class":750,"line":751},[1966],{"type":50,"tag":748,"props":1967,"children":1968},{"style":842},[1969],{"type":63,"value":1970},"// Function on the Stripe input, bound to a KV store aliased \"events\"\n",{"type":50,"tag":748,"props":1972,"children":1973},{"class":750,"line":795},[1974,1978,1982,1986,1990,1994,1999],{"type":50,"tag":748,"props":1975,"children":1976},{"style":755},[1977],{"type":63,"value":758},{"type":50,"tag":748,"props":1979,"children":1980},{"style":761},[1981],{"type":63,"value":764},{"type":50,"tag":748,"props":1983,"children":1984},{"style":755},[1985],{"type":63,"value":769},{"type":50,"tag":748,"props":1987,"children":1988},{"style":772},[1989],{"type":63,"value":775},{"type":50,"tag":748,"props":1991,"children":1992},{"style":778},[1993],{"type":63,"value":781},{"type":50,"tag":748,"props":1995,"children":1996},{"style":784},[1997],{"type":63,"value":1998},"\"kv:events\"",{"type":50,"tag":748,"props":2000,"children":2001},{"style":778},[2002],{"type":63,"value":792},{"type":50,"tag":748,"props":2004,"children":2005},{"class":750,"line":805},[2006],{"type":50,"tag":748,"props":2007,"children":2008},{"emptyLinePlaceholder":799},[2009],{"type":63,"value":802},{"type":50,"tag":748,"props":2011,"children":2012},{"class":750,"line":848},[2013,2017,2022,2026,2031,2035,2040],{"type":50,"tag":748,"props":2014,"children":2015},{"style":755},[2016],{"type":63,"value":758},{"type":50,"tag":748,"props":2018,"children":2019},{"style":761},[2020],{"type":63,"value":2021}," event",{"type":50,"tag":748,"props":2023,"children":2024},{"style":755},[2025],{"type":63,"value":769},{"type":50,"tag":748,"props":2027,"children":2028},{"style":761},[2029],{"type":63,"value":2030}," JSON",{"type":50,"tag":748,"props":2032,"children":2033},{"style":778},[2034],{"type":63,"value":216},{"type":50,"tag":748,"props":2036,"children":2037},{"style":772},[2038],{"type":63,"value":2039},"parse",{"type":50,"tag":748,"props":2041,"children":2042},{"style":778},[2043],{"type":63,"value":2044},"(r.body)\n",{"type":50,"tag":748,"props":2046,"children":2047},{"class":750,"line":897},[2048],{"type":50,"tag":748,"props":2049,"children":2050},{"emptyLinePlaceholder":799},[2051],{"type":63,"value":802},{"type":50,"tag":748,"props":2053,"children":2054},{"class":750,"line":928},[2055],{"type":50,"tag":748,"props":2056,"children":2057},{"style":842},[2058],{"type":63,"value":2059},"// Dedupe: have we seen this event before? TTL 7 days.\n",{"type":50,"tag":748,"props":2061,"children":2062},{"class":750,"line":958},[2063,2068,2073,2077],{"type":50,"tag":748,"props":2064,"children":2065},{"style":755},[2066],{"type":63,"value":2067},"if",{"type":50,"tag":748,"props":2069,"children":2070},{"style":778},[2071],{"type":63,"value":2072}," (kv.",{"type":50,"tag":748,"props":2074,"children":2075},{"style":772},[2076],{"type":63,"value":938},{"type":50,"tag":748,"props":2078,"children":2079},{"style":778},[2080],{"type":63,"value":2081},"(event.id)) {\n",{"type":50,"tag":748,"props":2083,"children":2084},{"class":750,"line":998},[2085,2090,2095,2100],{"type":50,"tag":748,"props":2086,"children":2087},{"style":778},[2088],{"type":63,"value":2089},"  r.",{"type":50,"tag":748,"props":2091,"children":2092},{"style":772},[2093],{"type":63,"value":2094},"stopForwarding",{"type":50,"tag":748,"props":2096,"children":2097},{"style":778},[2098],{"type":63,"value":2099},"()                 ",{"type":50,"tag":748,"props":2101,"children":2102},{"style":842},[2103],{"type":63,"value":2104},"// already processed, don't deliver again\n",{"type":50,"tag":748,"props":2106,"children":2107},{"class":750,"line":1029},[2108],{"type":50,"tag":748,"props":2109,"children":2110},{"style":755},[2111],{"type":63,"value":2112},"  return\n",{"type":50,"tag":748,"props":2114,"children":2115},{"class":750,"line":1611},[2116],{"type":50,"tag":748,"props":2117,"children":2118},{"style":778},[2119],{"type":63,"value":2120},"}\n",{"type":50,"tag":748,"props":2122,"children":2124},{"class":750,"line":2123},11,[2125,2129,2133,2138,2143,2147,2152,2157,2162,2166,2171],{"type":50,"tag":748,"props":2126,"children":2127},{"style":778},[2128],{"type":63,"value":811},{"type":50,"tag":748,"props":2130,"children":2131},{"style":772},[2132],{"type":63,"value":816},{"type":50,"tag":748,"props":2134,"children":2135},{"style":778},[2136],{"type":63,"value":2137},"(event.id, ",{"type":50,"tag":748,"props":2139,"children":2140},{"style":761},[2141],{"type":63,"value":2142},"true",{"type":50,"tag":748,"props":2144,"children":2145},{"style":778},[2146],{"type":63,"value":407},{"type":50,"tag":748,"props":2148,"children":2149},{"style":761},[2150],{"type":63,"value":2151},"7",{"type":50,"tag":748,"props":2153,"children":2154},{"style":755},[2155],{"type":63,"value":2156}," *",{"type":50,"tag":748,"props":2158,"children":2159},{"style":761},[2160],{"type":63,"value":2161}," 24",{"type":50,"tag":748,"props":2163,"children":2164},{"style":755},[2165],{"type":63,"value":2156},{"type":50,"tag":748,"props":2167,"children":2168},{"style":761},[2169],{"type":63,"value":2170}," 3600",{"type":50,"tag":748,"props":2172,"children":2173},{"style":778},[2174],{"type":63,"value":792},{"type":50,"tag":748,"props":2176,"children":2178},{"class":750,"line":2177},12,[2179],{"type":50,"tag":748,"props":2180,"children":2181},{"emptyLinePlaceholder":799},[2182],{"type":63,"value":802},{"type":50,"tag":748,"props":2184,"children":2186},{"class":750,"line":2185},13,[2187],{"type":50,"tag":748,"props":2188,"children":2189},{"style":842},[2190],{"type":63,"value":2191},"// Reshape for the internal API and forward.\n",{"type":50,"tag":748,"props":2193,"children":2195},{"class":750,"line":2194},14,[2196,2201,2206,2210,2215,2219,2224],{"type":50,"tag":748,"props":2197,"children":2198},{"style":778},[2199],{"type":63,"value":2200},"r.",{"type":50,"tag":748,"props":2202,"children":2203},{"style":772},[2204],{"type":63,"value":2205},"setBody",{"type":50,"tag":748,"props":2207,"children":2208},{"style":778},[2209],{"type":63,"value":781},{"type":50,"tag":748,"props":2211,"children":2212},{"style":761},[2213],{"type":63,"value":2214},"JSON",{"type":50,"tag":748,"props":2216,"children":2217},{"style":778},[2218],{"type":63,"value":216},{"type":50,"tag":748,"props":2220,"children":2221},{"style":772},[2222],{"type":63,"value":2223},"stringify",{"type":50,"tag":748,"props":2225,"children":2226},{"style":778},[2227],{"type":63,"value":2228},"({\n",{"type":50,"tag":748,"props":2230,"children":2232},{"class":750,"line":2231},15,[2233],{"type":50,"tag":748,"props":2234,"children":2235},{"style":778},[2236],{"type":63,"value":2237},"  type: event.type,\n",{"type":50,"tag":748,"props":2239,"children":2241},{"class":750,"line":2240},16,[2242],{"type":50,"tag":748,"props":2243,"children":2244},{"style":778},[2245],{"type":63,"value":2246},"  amount: event.data.object.amount,\n",{"type":50,"tag":748,"props":2248,"children":2250},{"class":750,"line":2249},17,[2251],{"type":50,"tag":748,"props":2252,"children":2253},{"style":778},[2254],{"type":63,"value":2255},"  customer: event.data.object.customer,\n",{"type":50,"tag":748,"props":2257,"children":2259},{"class":750,"line":2258},18,[2260],{"type":50,"tag":748,"props":2261,"children":2262},{"style":778},[2263],{"type":63,"value":2264},"}))\n",{"type":50,"tag":748,"props":2266,"children":2268},{"class":750,"line":2267},19,[2269,2273,2278,2282,2287,2291,2296],{"type":50,"tag":748,"props":2270,"children":2271},{"style":778},[2272],{"type":63,"value":2200},{"type":50,"tag":748,"props":2274,"children":2275},{"style":772},[2276],{"type":63,"value":2277},"setHeader",{"type":50,"tag":748,"props":2279,"children":2280},{"style":778},[2281],{"type":63,"value":781},{"type":50,"tag":748,"props":2283,"children":2284},{"style":784},[2285],{"type":63,"value":2286},"\"Content-Type\"",{"type":50,"tag":748,"props":2288,"children":2289},{"style":778},[2290],{"type":63,"value":407},{"type":50,"tag":748,"props":2292,"children":2293},{"style":784},[2294],{"type":63,"value":2295},"\"application/json\"",{"type":50,"tag":748,"props":2297,"children":2298},{"style":778},[2299],{"type":63,"value":792},{"type":50,"tag":748,"props":2301,"children":2303},{"class":750,"line":2302},20,[2304,2308,2313,2317,2322],{"type":50,"tag":748,"props":2305,"children":2306},{"style":778},[2307],{"type":63,"value":2200},{"type":50,"tag":748,"props":2309,"children":2310},{"style":772},[2311],{"type":63,"value":2312},"setPath",{"type":50,"tag":748,"props":2314,"children":2315},{"style":778},[2316],{"type":63,"value":781},{"type":50,"tag":748,"props":2318,"children":2319},{"style":784},[2320],{"type":63,"value":2321},"\"/v2/stripe-events\"",{"type":50,"tag":748,"props":2323,"children":2324},{"style":778},[2325],{"type":63,"value":792},{"type":50,"tag":51,"props":2327,"children":2328},{},[2329,2331,2337,2339,2345],{"type":63,"value":2330},"The trigger becomes the input's URL, the Data Store becomes ",{"type":50,"tag":133,"props":2332,"children":2334},{"className":2333},[],[2335],{"type":63,"value":2336},"kv:events",{"type":63,"value":2338},", the if/else becomes an early ",{"type":50,"tag":133,"props":2340,"children":2342},{"className":2341},[],[2343],{"type":63,"value":2344},"r.stopForwarding()",{"type":63,"value":2346},", and the HTTP destination becomes an output. Fewer moving parts, one function, and the dedupe state persists across executions.",{"type":50,"tag":81,"props":2348,"children":2350},{"id":2349},"what-webhook-relay-does-not-replace",[2351],{"type":63,"value":2352},"What Webhook Relay does not replace",{"type":50,"tag":51,"props":2354,"children":2355},{},[2356],{"type":63,"value":2357},"Being honest about scope saves you a wasted migration:",{"type":50,"tag":88,"props":2359,"children":2360},{},[2361,2371,2388,2398],{"type":50,"tag":92,"props":2362,"children":2363},{},[2364,2369],{"type":50,"tag":66,"props":2365,"children":2366},{},[2367],{"type":63,"value":2368},"SaaS app integrations.",{"type":63,"value":2370}," Pipedream ships thousands of pre-built app actions and triggers. Webhook Relay does not — it is webhook infrastructure. If a workflow's core value is \"connect app A to app B with no code,\" that part needs a different tool.",{"type":50,"tag":92,"props":2372,"children":2373},{},[2374,2379,2381,2386],{"type":50,"tag":66,"props":2375,"children":2376},{},[2377],{"type":63,"value":2378},"Python, Bash and Go code steps.",{"type":63,"value":2380}," Webhook Relay functions are ",{"type":50,"tag":66,"props":2382,"children":2383},{},[2384],{"type":63,"value":2385},"JavaScript or Lua",{"type":63,"value":2387}," only. Python/Bash/Go steps must be rewritten.",{"type":50,"tag":92,"props":2389,"children":2390},{},[2391,2396],{"type":50,"tag":66,"props":2392,"children":2393},{},[2394],{"type":63,"value":2395},"Browser automation and general compute.",{"type":63,"value":2397}," Pipedream's browser automation and general-purpose long-running compute have no equivalent here.",{"type":50,"tag":92,"props":2399,"children":2400},{},[2401,2406,2408,2412],{"type":50,"tag":66,"props":2402,"children":2403},{},[2404],{"type":63,"value":2405},"Pipedream Connect.",{"type":63,"value":2407}," If you rely on Connect, MCP servers or the API proxy, note that those are ",{"type":50,"tag":304,"props":2409,"children":2410},{},[2411],{"type":63,"value":119},{"type":63,"value":2413}," shutting down. Migration is only about Workflows.",{"type":50,"tag":51,"props":2415,"children":2416},{},[2417,2419],{"type":63,"value":2418},"The clean rule: ",{"type":50,"tag":66,"props":2420,"children":2421},{},[2422],{"type":63,"value":2423},"if a workflow is webhook-shaped — an event arrives, gets transformed, and is delivered — Webhook Relay is a strong fit. If it is mostly multi-app orchestration with webhooks incidental, it is not.",{"type":50,"tag":727,"props":2425,"children":2427},{"id":2426},"need-a-hand",[2428],{"type":63,"value":2429},"Need a hand?",{"type":50,"tag":51,"props":2431,"children":2432},{},[2433,2435,2440,2442,2446],{"type":63,"value":2434},"That rule is a starting point, not a verdict. If you're looking at a workflow that orchestrates SaaS apps with no webhook in the middle and you're not sure how — or whether — to rebuild it, ",{"type":50,"tag":66,"props":2436,"children":2437},{},[2438],{"type":63,"value":2439},"reach out and we'll help you sort it out.",{"type":63,"value":2441}," We can look at the export with you, work out which parts belong on Webhook Relay, suggest where the app-to-app glue should live, and turn the webhook-shaped pieces into tested functions. ",{"type":50,"tag":209,"props":2443,"children":2444},{"href":211},[2445],{"type":63,"value":1925},{"type":63,"value":2447}," with your use case and the workflow names, and we'll take it from there.",{"type":50,"tag":81,"props":2449,"children":2451},{"id":2450},"migration-checklist",[2452],{"type":63,"value":2453},"Migration checklist",{"type":50,"tag":88,"props":2455,"children":2458},{"className":2456},[2457],"contains-task-list",[2459,2471,2480,2489,2505,2538,2554,2563],{"type":50,"tag":92,"props":2460,"children":2463},{"className":2461},[2462],"task-list-item",[2464,2469],{"type":50,"tag":2465,"props":2466,"children":2468},"input",{"disabled":799,"type":2467},"checkbox",[],{"type":63,"value":2470}," Inventory every project that has Workflows you depend on.",{"type":50,"tag":92,"props":2472,"children":2474},{"className":2473},[2462],[2475,2478],{"type":50,"tag":2465,"props":2476,"children":2477},{"disabled":799,"type":2467},[],{"type":63,"value":2479}," Export each project to JSON before April 2027, and download any Data Store contents and File Store files separately.",{"type":50,"tag":92,"props":2481,"children":2483},{"className":2482},[2462],[2484,2487],{"type":50,"tag":2465,"props":2485,"children":2486},{"disabled":799,"type":2467},[],{"type":63,"value":2488}," Classify each workflow: webhook-shaped (port it) or app-orchestration (needs another tool).",{"type":50,"tag":92,"props":2490,"children":2492},{"className":2491},[2462],[2493,2496,2498,2503],{"type":50,"tag":2465,"props":2494,"children":2495},{"disabled":799,"type":2467},[],{"type":63,"value":2497}," Re-create credentials as Webhook Relay secrets; the export's ",{"type":50,"tag":133,"props":2499,"children":2501},{"className":2500},[],[2502],{"type":63,"value":475},{"type":63,"value":2504}," list names each one.",{"type":50,"tag":92,"props":2506,"children":2508},{"className":2507},[2462],[2509,2512,2514,2519,2520,2525,2526,2531,2532,2537],{"type":50,"tag":2465,"props":2510,"children":2511},{"disabled":799,"type":2467},[],{"type":63,"value":2513}," Port code steps to JavaScript functions, mapping ",{"type":50,"tag":133,"props":2515,"children":2517},{"className":2516},[],[2518],{"type":63,"value":634},{"type":63,"value":1890},{"type":50,"tag":133,"props":2521,"children":2523},{"className":2522},[],[2524],{"type":63,"value":1896},{"type":63,"value":1795},{"type":50,"tag":133,"props":2527,"children":2529},{"className":2528},[],[2530],{"type":63,"value":656},{"type":63,"value":1890},{"type":50,"tag":133,"props":2533,"children":2535},{"className":2534},[],[2536],{"type":63,"value":1910},{"type":63,"value":216},{"type":50,"tag":92,"props":2539,"children":2541},{"className":2540},[2462],[2542,2545,2547,2552],{"type":50,"tag":2465,"props":2543,"children":2544},{"disabled":799,"type":2467},[],{"type":63,"value":2546}," Rebuild triggers: HTTP → input URL, timer → ",{"type":50,"tag":209,"props":2548,"children":2549},{"href":593},[2550],{"type":63,"value":2551},"scheduled webhook",{"type":63,"value":2553},", destination → output.",{"type":50,"tag":92,"props":2555,"children":2557},{"className":2556},[2462],[2558,2561],{"type":50,"tag":2465,"props":2559,"children":2560},{"disabled":799,"type":2467},[],{"type":63,"value":2562}," Test each function against a sample request and check the forwarded body.",{"type":50,"tag":92,"props":2564,"children":2566},{"className":2565},[2462],[2567,2570],{"type":50,"tag":2465,"props":2568,"children":2569},{"disabled":799,"type":2467},[],{"type":63,"value":2571}," Turn off the Pipedream workflow once the Webhook Relay path is verified.",{"type":50,"tag":81,"props":2573,"children":2575},{"id":2574},"start-here",[2576],{"type":63,"value":2577},"Start here",{"type":50,"tag":51,"props":2579,"children":2580},{},[2581,2583,2588,2590,2596,2597,2603,2605,2611],{"type":63,"value":2582},"If you want to move a webhook-driven Pipedream workflow, the pieces are all in place: ",{"type":50,"tag":209,"props":2584,"children":2585},{"href":1816},[2586],{"type":63,"value":2587},"functions",{"type":63,"value":2589}," for the transform, KV and file bindings for state, ",{"type":50,"tag":209,"props":2591,"children":2593},{"href":2592},"/features/durable-retries",[2594],{"type":63,"value":2595},"durable delivery with retries",{"type":63,"value":1795},{"type":50,"tag":209,"props":2598,"children":2600},{"href":2599},"/features/webhook-multiple-destinations",[2601],{"type":63,"value":2602},"fan-out to multiple destinations",{"type":63,"value":2604},", and ",{"type":50,"tag":209,"props":2606,"children":2608},{"href":2607},"/docs/skills",[2609],{"type":63,"value":2610},"Agent Skills",{"type":63,"value":2612}," so Claude or Codex can do the porting.",{"type":50,"tag":88,"props":2614,"children":2615},{},[2616,2628,2639,2651],{"type":50,"tag":92,"props":2617,"children":2618},{},[2619,2626],{"type":50,"tag":209,"props":2620,"children":2623},{"href":2621,"rel":2622},"https://my.webhookrelay.com/register",[232],[2624],{"type":63,"value":2625},"Create a free Webhook Relay account",{"type":63,"value":2627}," and try a function on a test input.",{"type":50,"tag":92,"props":2629,"children":2630},{},[2631,2633,2638],{"type":63,"value":2632},"Read the ",{"type":50,"tag":209,"props":2634,"children":2635},{"href":1816},[2636],{"type":63,"value":2637},"functions documentation",{"type":63,"value":216},{"type":50,"tag":92,"props":2640,"children":2641},{},[2642,2644,2650],{"type":63,"value":2643},"Point your coding agent at the export with ",{"type":50,"tag":133,"props":2645,"children":2647},{"className":2646},[],[2648],{"type":63,"value":2649},"npx skills add webhookrelay/skills",{"type":63,"value":216},{"type":50,"tag":92,"props":2652,"children":2653},{},[2654,2656,2661],{"type":63,"value":2655},"Or ",{"type":50,"tag":209,"props":2657,"children":2658},{"href":211},[2659],{"type":63,"value":2660},"contact us",{"type":63,"value":2662}," and we will help you migrate.",{"type":50,"tag":51,"props":2664,"children":2665},{},[2666,2668,2674],{"type":63,"value":2667},"For a broader comparison of the two products, see ",{"type":50,"tag":209,"props":2669,"children":2671},{"href":2670},"/blog/pipedream-alternative",[2672],{"type":63,"value":2673},"A Pipedream Alternative for Webhook Routing and Private Delivery",{"type":63,"value":216},{"type":50,"tag":2676,"props":2677,"children":2678},"style",{},[2679],{"type":63,"value":2680},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":805,"depth":805,"links":2682},[2683,2684,2685,2686,2690,2691,2692,2695,2696],{"id":83,"depth":795,"text":86},{"id":219,"depth":795,"text":222},{"id":312,"depth":795,"text":315},{"id":518,"depth":795,"text":521,"children":2687},[2688,2689],{"id":729,"depth":805,"text":732},{"id":1332,"depth":805,"text":1335},{"id":1710,"depth":795,"text":1713},{"id":1930,"depth":795,"text":1933},{"id":2349,"depth":795,"text":2352,"children":2693},[2694],{"id":2426,"depth":805,"text":2429},{"id":2450,"depth":795,"text":2453},{"id":2574,"depth":795,"text":2577},"markdown","content:blog:pipedream-workflows-shutdown-migration.md","content","blog/pipedream-workflows-shutdown-migration.md","blog/pipedream-workflows-shutdown-migration","md",{"loc":4},1791980021290]