Pipedream, workflow z kodem i 3000 integracji
Pipedream to platforma do budowania przepływów pracy, w której pojedynczy krok jest zwykłym kodem w Node.js, Pythonie, Go albo Bashu, uruchamianym w chmurze bez konfigurowania serwera. Każdy przepływ zaczyna się od wyzwalacza: webhooka HTTP, harmonogramu, wiadomości e-mail albo zdarzenia z jednej z ponad trzech tysięcy zintegrowanych aplikacji. Rozliczenie idzie za czas obliczeń, nie za liczbę kroków.
Czym Pipedream różni się od reszty automatyzacji
Większość narzędzi tej kategorii zaczyna od pytania „co chcesz połączyć" i daje Ci listę pudełek do klikania. Kod jest tam dopuszczony jako wyjątek, w osobnym węźle, zwykle z ograniczonym środowiskiem i bez dostępu do pakietów zewnętrznych. Pipedream odwraca tę kolejność. Podstawową jednostką jest krok z kodem, a gotowe akcje z rejestru są skrótem, z którego korzystasz wtedy, gdy nie chce Ci się pisać kolejnego wywołania API do Slacka.
Ta różnica ujawnia się dopiero przy trzecim albo czwartym przepływie. Automatyzacja na pudełkach jest szybsza przez pierwsze dwadzieścia minut i wolniejsza przez resztę projektu, bo każde nietypowe przekształcenie danych trzeba w niej obejść. W Pipedream nietypowe przekształcenie to trzy linijki JavaScriptu, a nietypowa integracja to fetch do dowolnego adresu.
Druga rzecz, która wyróżnia tę platformę, jest mniej widoczna z poziomu strony głównej. Pipedream sprzedaje dziś dwa produkty pod jedną marką: publiczną platformę workflow, na której budujesz automatyzacje dla siebie, oraz Connect, czyli warstwę uwierzytelniania i integracji, którą wbudowujesz we własną aplikację, żeby Twoi użytkownicy podłączali swoje konta Gmaila czy Notion bez pisania przez Ciebie ani jednego przepływu OAuth. Drugi produkt jest tym, przez który firma trafiła na radar Workdaya.
Pierwszy przepływ w praktyce
Najprostszy sensowny scenariusz: przyjmij żądanie HTTP, sprawdź jego zawartość, dopisz rekord do bazy i odpowiedz nadawcy. Wyzwalacz HTTP daje Ci własny adres, pod który możesz wysłać cokolwiek.
curl -X POST https://twoj-endpoint.m.pipedream.net \
-H "Content-Type: application/json" \
-d '{"email":"anna@example.com","plan":"pro"}'Ciało żądania trafia do steps.trigger.event.body, a nagłówki do steps.trigger.event.headers. Kolejny krok to kod:
export default defineComponent({
async run({ steps, $ }) {
const { email, plan } = steps.trigger.event.body
if (!email || !email.includes("@")) {
$.respond({ status: 400, body: { error: "brak poprawnego adresu" } })
return $.flow.exit("odrzucone na walidacji")
}
$.export("normalized", { email: email.toLowerCase(), plan: plan ?? "free" })
},
})Dwie rzeczy w tym fragmencie warto wyjaśnić, bo obie są specyficzne dla platformy. $.respond odsyła odpowiedź do nadawcy webhooka, ale działa tylko wtedy, gdy wyzwalacz ustawiono w tryb odpowiedzi niestandardowej. $.flow.exit kończy cały przepływ, a nie tylko bieżący krok, więc kolejne kroki nawet się nie uruchomią i nie spalisz na nie kredytów.
Do przekazania danych dalej masz dwie drogi. Zwykły return udostępnia wartość jako steps.nazwa_kroku.$return_value, natomiast $.export("normalized", ...) tworzy nazwany eksport dostępny jako steps.nazwa_kroku.normalized. Nazwane eksporty czytają się lepiej w przepływach dłuższych niż trzy kroki i to one powinny być domyślnym wyborem.
Pakiety npm bez pliku package.json
To jest funkcja, którą trudno docenić, dopóki nie spędzi się popołudnia na walce z zależnościami w innym narzędziu. W kroku Pipedream importujesz pakiet i tyle:
import axios from "axios@1.7.7"
import { parse } from "csv-parse/sync"
export default defineComponent({
async run({ steps, $ }) {
const { data } = await axios.get("https://example.com/raport.csv")
return parse(data, { columns: true })
},
})Nie ma pliku manifestu, nie ma kroku instalacji, nie ma pamięci podręcznej do wyczyszczenia. Składnia nazwa@wersja przypina konkretną wersję i warto z niej korzystać wszędzie tam, gdzie przepływ ma działać za pół roku tak samo jak dziś. Import bez wersji bierze najnowszą dostępną, co przy pakietach zmieniających API między wydaniami głównymi jest cichą bombą zegarową. Przepływ działa miesiącami, a potem w środę o trzeciej w nocy zaczyna zwracać TypeError, bo autor biblioteki zmienił sygnaturę funkcji.
Python działa analogicznie, z importami rozwiązywanymi automatycznie, i przydaje się głównie tam, gdzie potrzebujesz biblioteki, która nie ma sensownego odpowiednika w ekosystemie JavaScriptu. Do pracy z danymi tabelarycznymi albo modelami uczenia maszynowego to bywa jedyny rozsądny wybór.
Kredyty, czyli za co naprawdę płacisz
Model rozliczeń jest tu inny niż u konkurencji i to on decyduje o tym, czy rachunek Cię zaskoczy. Nie płacisz za liczbę zadań ani za liczbę kroków w przepływie. Płacisz za czas obliczeń pomnożony przez przydzieloną pamięć.
Jednostką jest kredyt: trzydzieści sekund wykonania przy domyślnych 256 MB pamięci. Podwojenie pamięci podwaja tempo spalania kredytów. Krok ustawiony na 1 GB zużywa je cztery razy szybciej niż ten sam krok na ustawieniach domyślnych, przy identycznym czasie działania.
Z tego wynika pierwsza praktyczna rada, która oszczędza pieniądze w sposób niewidoczny na fakturze: nie podnoś pamięci profilaktycznie. Suwak pamięci kusi, bo razem z nią rośnie przydział procesora, więc przepływ faktycznie kończy się szybciej. Rachunek jednak rzadko na tym zyskuje, bo dwukrotne przyspieszenie przy czterokrotnym koszcie jednostkowym to interes na minus. Podnoś pamięć tylko wtedy, gdy krok naprawdę przetwarza duże struktury w pamięci i inaczej się wywraca.
Druga rada dotyczy struktury przepływu. Skoro liczy się czas, a nie liczba kroków, to rozbijanie logiki na wiele małych, czytelnych kroków nic nie kosztuje. To rzadka sytuacja w tej kategorii narzędzi, gdzie zwykle każdy dodatkowy węzeł to dodatkowa opłata. Tutaj czytelność jest za darmo, więc korzystaj z niej.
Limity, które trzeba znać przed projektowaniem
| Ograniczenie | Wartość |
|---|---|
| Domyślny limit czasu, wyzwalacz HTTP i e-mail | 30 sekund |
| Domyślny limit czasu, wyzwalacz harmonogramu | 60 sekund |
| Maksymalny limit czasu, plan darmowy | 300 sekund |
| Maksymalny limit czasu, plany płatne | 750 sekund |
| Pamięć domyślna i maksymalna | 256 MB, do 10 GB |
| Ciało żądania HTTP | 512 KB |
| Wiadomość e-mail z załącznikami | 30 MB |
| Logi, eksporty kroków i dane zdarzenia łącznie | 6 MB |
Miejsce na dysku w katalogu /tmp | 2 GB |
| Żądania HTTP do punktu końcowego | średnio 10 na sekundę, z tolerancją na skoki |
| Historia zdarzeń, plan darmowy | 7 dni |
Limit 512 KB na ciało żądania jest tym, o który rozbija się najwięcej pierwszych wdrożeń. Nie da się przesłać pliku przez webhooka i przetworzyć go w kroku. Rozwiązanie polega na tym, żeby przesyłać adres pliku, a sam plik pobierać wewnątrz przepływu do katalogu /tmp, gdzie masz do dyspozycji 2 GB. Ten sam wzorzec, przekazywanie wskaźnika zamiast zawartości, obowiązuje w każdej platformie tej klasy i wraca w Kestrze oraz w Prefekcie.
Limit 6 MB na logi i eksporty łącznie bywa jeszcze bardziej podstępny, bo objawia się dopiero na produkcji. Krok, który w testach zwracał dwadzieścia rekordów, na produkcji zwraca dwadzieścia tysięcy i cały przepływ pada przy próbie zapisania eksportu. Jeśli krok pobiera dane stronicowane, przetwarzaj je w pętli i eksportuj podsumowanie, a nie surową odpowiedź.
Connect, czyli uwierzytelnianie jako produkt
Jeśli budujesz aplikację, w której użytkownicy podłączają własne konta w usługach zewnętrznych, wiesz, ile pracy zjada napisanie i utrzymanie kilkunastu przepływów OAuth. Odświeżanie tokenów, obsługa cofniętych zgód, różnice w implementacji między dostawcami, przechowywanie sekretów. Connect przenosi to na stronę Pipedream i wystawia interfejs, w którym prosisz o konto użytkownika i dostajesz gotowe poświadczenia albo link do autoryzacji.
W praktyce wygląda to tak, że w swojej aplikacji generujesz token na konkretnego użytkownika, a on przechodzi krótką ścieżkę autoryzacji w oknie przeglądarki. Twój backend nigdy nie widzi hasła ani nie przechowuje tokenu odświeżającego.
const response = await fetch("https://api.pipedream.com/v1/connect/tokens", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${accessToken}`,
},
body: JSON.stringify({
external_user_id: uzytkownik.id,
allowed_origins: ["https://twoja-aplikacja.pl"],
}),
})Warto zwrócić uwagę na pole external_user_id. To Twój identyfikator użytkownika, nie identyfikator z systemu Pipedream, i to on wiąże podłączone konta z osobą w Twojej bazie. Dobranie tu czegoś zmiennego, na przykład adresu e-mail zamiast klucza głównego, kończy się utratą powiązań przy pierwszej zmianie adresu przez użytkownika.
Serwer MCP i agenci
Model Context Protocol zmienił sposób, w jaki narzędzia dostają się do modeli językowych, i Pipedream wystawia swoje integracje właśnie w tej postaci. Zdalny serwer działa pod adresem https://remote.mcp.pipedream.net/v3 i obsługuje zarówno SSE, jak i strumieniowe HTTP, wybierając transport samodzielnie.
Skala jest tu głównym argumentem: ponad trzy tysiące API i ponad dziesięć tysięcy narzędzi dostępnych bez pisania przez Ciebie ani jednego opakowania. Żądanie kieruje się nagłówkami, które określają projekt, środowisko, użytkownika i docelową aplikację:
curl https://remote.mcp.pipedream.net/v3 \
-H "Authorization: Bearer $TOKEN" \
-H "x-pd-project-id: proj_abc123" \
-H "x-pd-environment: production" \
-H "x-pd-external-user-id: user_42" \
-H "x-pd-app-slug: linear"Najciekawszy jest tu mechanizm brakującego konta. Kiedy użytkownik nie podłączył jeszcze Lineara, serwer nie zwraca błędu, tylko adres Connect Link, który możesz mu pokazać. Agent nie zawiesza się na braku uprawnień, tylko dostaje ścieżkę wyjścia. Ta drobna decyzja projektowa oszczędza sporo kodu w warstwie agenta i wypada lepiej niż większość rozwiązań, które widziałem w rejestrze serwerów MCP.
Uwierzytelnienie po stronie dewelopera idzie przez OAuth w trybie poświadczeń klienta, z tokenem pobieranym z https://api.pipedream.com/v1/oauth/token. Token ma ograniczony czas życia, więc w kodzie produkcyjnym potrzebujesz warstwy odświeżania, a nie stałej wartości w zmiennej środowiskowej.
Pipedream a alternatywy
| Cecha | Pipedream | n8n | Zapier | Make |
|---|---|---|---|---|
| Podstawowa jednostka | krok z kodem | węzeł graficzny | akcja z listy | moduł na scenariuszu |
| Rozliczenie | czas obliczeń i pamięć | zadania lub self hosting | zadania | operacje |
| Self hosting | nie | tak, licencja fair code | nie | nie |
| Pakiety zewnętrzne | dowolne z npm i PyPI | ograniczone w chmurze | brak | brak |
| Wbudowana warstwa dla użytkowników końcowych | tak, Connect | nie | częściowo | nie |
| Próg wejścia dla nieprogramisty | wysoki | średni | niski | średni |
Wybór między tymi czterema rzadko jest kwestią funkcji, bo w większości typowych zadań każde z nich sobie poradzi. Realnym kryterium jest to, kto będzie te przepływy utrzymywał przez następny rok. Jeśli zespół nietechniczny, Pipedream jest złym wyborem i nie ma sensu udawać inaczej: interfejs zakłada, że umiesz czytać kod, a komunikaty błędów są komunikatami środowiska uruchomieniowego, nie przyjaznymi podpowiedziami.
Jeśli natomiast przepływy pisze programista, sytuacja się odwraca. Pudełka zaczynają wtedy przeszkadzać, a możliwość napisania czterech linijek zamiast szukania właściwego węzła oszczędza więcej czasu, niż sugeruje intuicja. Osobnym przypadkiem jest wymóg trzymania danych u siebie. Pipedream nie ma wersji instalowanej na własnym serwerze i w projektach z twardymi wymaganiami dotyczącymi lokalizacji danych to zamyka temat.
Przejęcie przez Workday, co o tym wiadomo
19 listopada 2025 roku Workday ogłosił podpisanie wiążącej umowy przejęcia Pipedream, a transakcja zamknęła się w grudniu tego samego roku, wcześniej niż zakładał pierwotny harmonogram. Uzasadnieniem po stronie kupującego są integracje dla agentów AI: Workday chce, żeby jego agenci sięgali do systemów zewnętrznych, a Pipedream ma do nich gotowe połączenia.
Komunikat samego Pipedreama był krótki i nie zawierał zobowiązań produktowych. Nie padło w nim ani słowo o losie planu darmowego, o cenniku, ani o tym, czy publiczna platforma workflow pozostanie priorytetem obok wbudowanej warstwy Connect. Od zamknięcia transakcji minęło ponad pół roku i te deklaracje nadal się nie pojawiły, więc przy produkcie komercyjnym opartym o tę platformę warto mieć plan awaryjny i sprawdzać komunikaty dostawcy, zamiast zakładać ciągłość.
Traktuj to jako ryzyko przy planowaniu, a nie jako powód do rezygnacji. Przepływy w Pipedream to zwykły kod w Node.js albo Pythonie, więc przeniesienie logiki gdzie indziej jest wykonalne, w przeciwieństwie do platform, gdzie cała wartość siedzi w klikanym grafie. Warstwa, którą trudno odtworzyć, to Connect i katalog integracji, i to przy niej warto rozważyć plan awaryjny, jeśli budujesz na niej produkt komercyjny.
Cennik i to, czego nie da się dziś potwierdzić
Pipedream oferuje plan darmowy z dziennym limitem kredytów, ograniczoną liczbą aktywnych przepływów i podłączonych kont, oraz plany płatne z limitem czasu wykonania podniesionym do 750 sekund i dłuższą retencją historii zdarzeń. Dokumentacja opisuje mechanikę limitów szczegółowo, ale nie podaje w niej kwot.
Konkretnych cen planów świadomie tu nie podaję. Źródła zewnętrzne, które je wymieniają, różnią się między sobą zarówno co do kwot miesięcznych, jak i co do wielkości darmowego przydziału kredytów, a oficjalna strona cennika renderuje się w przeglądarce i nie daje się rzetelnie zacytować. Podanie liczby, której nie da się zweryfikować, byłoby gorsze niż jej brak, zwłaszcza w tekście, do którego ktoś wróci za pół roku.
Zamiast tego policz to sam, bo przy modelu opartym na czasie obliczeń jest to jedyna miarodajna metoda. Uruchom docelowy przepływ dziesięć razy na realnych danych, odczytaj czas wykonania, pomnóż przez spodziewany dzienny wolumen i podziel przez trzydzieści sekund. Dostaniesz dzienne zużycie kredytów, które porównasz z aktualnym cennikiem w dniu decyzji.
Typowe błędy i ograniczenia
Pierwszy to brak obsługi ponowień na poziomie logiki. Przepływ, który dopisuje rekord do bazy, przy ponowieniu dopisze go drugi raz, jeśli nie zadbasz o klucz idempotencji. Automatyczne ponowienia to funkcja platformy, natomiast bezpieczeństwo tych ponowień to Twoja odpowiedzialność.
Drugi to trzymanie stanu między uruchomieniami w zmiennych. Każde uruchomienie startuje od nowa, więc licznik zwiększany w zmiennej globalnej nie przetrwa. Do trwałego stanu służy magazyn danych albo baza zewnętrzna, na przykład Redis.
Trzeci to zbyt optymistyczne podejście do domyślnego limitu trzydziestu sekund. Wywołanie modelu językowego z dłuższym kontekstem regularnie przekracza ten czas, a błąd wygląda wtedy na problem z API, choć jest po prostu przekroczeniem limitu. Przy pracy z modelami podnieś limit i strumieniuj odpowiedź, jeśli platforma docelowa na to pozwala.
Czwarty dotyczy testowania. Uruchomienia testowe nie zużywają kredytów, co jest wygodne, ale prowadzi do złudzenia, że przepływ jest tani. Koszt widać dopiero po włączeniu na produkcji i po pierwszym dniu z realnym ruchem.
Piąty to poleganie na wersjach bez przypięcia. Wspomniałem o tym wcześniej przy importach i wracam do tego, bo jest to najczęstsza przyczyna awarii przepływów, które działały bez zmian przez wiele miesięcy.
Wpięcie w stack Next.js
Typowy układ w projekcie na Next.js wygląda tak, że aplikacja wystawia trasę API, która przekazuje zdarzenie do Pipedream, a długo działająca robota dzieje się poza cyklem żądania. Dzięki temu użytkownik dostaje odpowiedź natychmiast, a przetwarzanie trwa tyle, ile trwa.
export async function POST(request: Request) {
const dane = await request.json()
await fetch(process.env.PIPEDREAM_ENDPOINT!, {
method: "POST",
headers: {
"Content-Type": "application/json",
"x-signature": podpisz(dane),
},
body: JSON.stringify(dane),
})
return Response.json({ przyjete: true }, { status: 202 })
}Podpis w nagłówku nie jest ozdobnikiem. Adres wyzwalacza HTTP jest publiczny i każdy, kto go pozna, może wysłać do niego dowolne dane. Pierwszy krok przepływu powinien sprawdzać podpis i kończyć wykonanie przy niezgodności, zanim cokolwiek trafi do bazy. Typy współdzielone między aplikacją a krokami przepływu warto trzymać w jednym miejscu i eksportować jako pakiet, co w projekcie z TypeScriptem kosztuje kilkanaście minut, a oszczędza całą klasę błędów wynikających z rozjechania się kształtu danych.
FAQ
Czy Pipedream można uruchomić na własnym serwerze?
Nie. Pipedream działa wyłącznie jako usługa w chmurze i nie ma oficjalnej wersji do instalacji lokalnej. Jeśli wymagania projektu narzucają trzymanie danych na własnej infrastrukturze, sensowną alternatywą jest n8n, który ma licencję fair code i wariant self hosted.
Ile kosztuje jedno uruchomienie przepływu?
Koszt liczy się w kredytach, gdzie jeden kredyt to trzydzieści sekund wykonania przy 256 MB pamięci. Przepływ kończący się w pięć sekund przy ustawieniach domyślnych zużywa część kredytu, a ten sam przepływ przy 1 GB pamięci zużyje go cztery razy więcej. Liczba kroków nie ma wpływu na rachunek.
Czym Connect różni się od zwykłych przepływów?
Zwykłe przepływy budujesz dla siebie i podłączasz w nich własne konta. Connect służy do tego, żeby konta podłączali Twoi użytkownicy z poziomu Twojej aplikacji, bez implementowania przez Ciebie przepływów OAuth dla każdego dostawcy osobno. To dwa różne produkty na wspólnym katalogu integracji.
Czy da się użyć dowolnego pakietu npm?
Tak, wystarczy zaimportować go w kroku, bez pliku manifestu i bez instalacji. Warto przypinać wersję składnią pakiet@wersja, bo import bez wersji pobiera najnowszą i przepływ może przestać działać po wydaniu głównym biblioteki.
Co się dzieje z Pipedream po przejęciu przez Workday?
Workday podpisał umowę przejęcia 19 listopada 2025 roku, a transakcja zamknęła się w grudniu tego samego roku. Pipedream nie ogłosił przy tym zmian w produkcie, cenniku ani planie darmowym i nie zrobił tego przez kolejne miesiące. Do czasu oficjalnych deklaracji traktuj przyszłość publicznej platformy jako niepewną i przy produkcie komercyjnym miej plan awaryjny.
Szczegóły limitów i składni kroków opisuje dokumentacja Pipedream, a treść ogłoszenia o przejęciu znajdziesz w komunikacie Workdaya.